雷达点迹聚类Kmeans C++演练--Apple的学习笔记

聚类的应用

上周在互联网浏览无意间了解到雷达信号处理的最后一步是点迹输出,用的是聚类算法。
搜索了下聚类算法,好多呀!不过发现kmeans是我之前学机器学习课程中KNN分类用的。python只要几行代码就解决了,用C++演练一把,就当我在开发雷达了,没有代码优化,仅仅实现功能~

Kmeans的思想

就是根据离哪类近就判断属于哪类,来进行归类和预测的。

  1. 初始化K个类,然后每个类初始化一个中心点。
  2. 对比每个点到类的距离,到哪个类近就属于哪类。
  3. 通过均值更新每一类的中心。
  4. 循环第2和第3步骤,知道每个类的中心不再移动。

昨天完成code,今天测试调试了下,主要解决了一些小bug和一个大bug(在执行完聚类过程后,居然某一类的数量为0个。至少应该有一个为它本身吧!后来通过万能的debug解决了)

重要参数介绍

我的初始化值用的是随机选择,初始化值选的不适合,它更新中心点的次数也会曾多。
如下代码的输入点为24个,选择设置为4类,测试点为2个。
同学们有需要可以自行修改这些可配置参数,以适配你的应用。

C++代码

KNN.hpp

    /* Author: AppleCai Date 2019/04/28 */
    #include
    #include
    #include
    using namespace std;
    
    #define OBJ_LEN  24
    #define TEST_LEN 2
    class Kmeans
    {
    public:
    typedef struct mypoint
    {
        float x;
        float y;
        int tag;
    }st_mypoint;
    
    enum my_enum
    {
        NO=0,
        YES
    };
    Kmeans(int KgNum);
    void dataInit(st_mypoint input[]);
    void updateCenter(st_mypoint point[]);  //set Kcenter;
    float calDistance(st_mypoint p1,st_mypoint p2); //Euclidean distance
    void Cluster(st_mypoint point[]);  //set the Kgrouplist;
    void KNN(st_mypoint input[]);
    bool checkEnd(vector p1group,vector p2group);
    void KNNtest(st_mypoint input[]);
    
    private:
        int KgroupNum;               //the number of cluster
        vector Kcenter;   //the center of each cluster
        vector> Kgrouplist;      //the point to the related group
    };

KNN.cpp

    /* Author: AppleCai Date 2019/04/28 */
    #include "KNN.hpp"
    
    Kmeans::Kmeans(int KgNum)
    {
          KgroupNum = KgNum;
    }
    
    /* init the K group and select the group center */
    void Kmeans::dataInit(st_mypoint input[])
    {
          int i,N;
          for(i=0;i temp;
            Kgrouplist.push_back(temp);
        } 
    }
    
    /*Calculate average value,update center*/
    void Kmeans::updateCenter(st_mypoint point[])
    {
          int i=0;
          int j=0;
          for(i=0;i p1group,vector p2group)
    {
          bool ret = YES;
          int i;
          for(i=0;i0.001||
                   fabs(p1group[i].y - p2group[i].y)>0.001
                )
                {
                      ret = NO;
                }
          }
          return ret;
    }
    
    void Kmeans::KNN(st_mypoint input[])
    {
          bool flag=NO;
          int cnt=0;
          int i;
          dataInit(input);
          vector preKcenter(KgroupNum);
          for(i=0;i

main.cpp

    /* Author: AppleCai Date 2019/04/28 */
    #include
    #include
    #include
    #include"KNN.hpp"
    using namespace std;
    
    
    int main(void)
    {
        Kmeans::st_mypoint TrainData[OBJ_LEN];
        Kmeans::st_mypoint TestData[TEST_LEN];
        int i;
        ifstream fin("in.txt");
        ofstream fout("out.txt");
        for(int i=0;i>TrainData[i].x>>TrainData[i].y;
            cout<

你可能感兴趣的:(雷达点迹聚类Kmeans C++演练--Apple的学习笔记)