• K均值聚类(C++)


      1 #include<math.h>
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<iostream>
      5 using namespace std;
      6 void kmeans(int n, float* xy, int k, float* cxy)
      7 {
      8     int i,j;
      9     for(i=0;i<k;i++)
     10     {
     11         cxy[2*i]=xy[2*i];
     12         cxy[2*i+1]=xy[2*i+1];
     13     }
     14 
     15     int* mindis=(int*)malloc(n*sizeof(int));
     16     int* premindis=(int*)malloc(n*sizeof(int));
     17     for(i=0;i<n;i++)
     18     {
     19         mindis[i]=-1;
     20     }
     21     int change=1;
     22     
     23     while(change)
     24     {
     25         for(i=0;i<n;i++)
     26         {
     27             premindis[i]=mindis[i];
     28         }
     29         for(i=0;i<n;i++)
     30         {
     31             float min=9999;
     32             for(j=0;j<k;j++)
     33             {
     34                 double s=sqrt((xy[2*i]-cxy[2*j])*(xy[2*i]-cxy[2*j])+(xy[2*i+1]-cxy[2*j+1])*(xy[2*i+1]-cxy[2*j+1]));
     35                 if(s<min)
     36                 {
     37                     min=s;
     38                     mindis[i]=j;
     39                 }
     40             }
     41         }
     42         
     43         /*
     44         for(i=0;i<2;i++)
     45         {
     46             printf("%.3f ",cxy[2*i]);
     47             printf("%.3f
    ",cxy[2*i+1]);
     48         }
     49         */
     50         
     51         for(i=0;i<k;i++)
     52         {
     53             int num=0;
     54             float s0=0.0;
     55             float s1=0.0;
     56             //cout<<i<<":";
     57             for(j=0;j<n;j++)
     58             {
     59                 if(mindis[j]==i)
     60                 {
     61                     num++;
     62                     //cout<<j<<" ";
     63                     s0+=xy[2*j];
     64                     s1+=xy[2*j+1];
     65                 }
     66             }
     67             if(num)
     68             {
     69                 cxy[2*i]=s0/num;
     70                 cxy[2*i+1]=s1/num;
     71             }
     72             //cout<<endl;
     73         }
     74         int flag=0;
     75         for(i=0;i<n;i++)
     76         {
     77             if(mindis[i]!=premindis[i])
     78             {
     79                 flag=1;
     80                 break;
     81             }
     82         }
     83         if(flag==0)
     84             change=0;
     85     }
     86 
     87     
     88 }
     89 int main()
     90 {
     91     float xy[12]={1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 4.0, 5.0, 5.0, 4.0, 4.0, 4.0};
     92     float cxy[4]={0.0, 0.0, 0.0, 0.0};
     93     kmeans(6,xy,2,cxy);
     94     int i;
     95     for(i=0;i<2;i++)
     96     {
     97         printf("%.3f ",cxy[2*i]);
     98         printf("%.3f
    ",cxy[2*i+1]);
     99     }
    100     return 0;
    101 }
    View Code
  • 相关阅读:
    RVM Ruby 版本管理器的删除 Gatling
    JWT 构建Rails API 授权登录
    Linux grep根据关键字匹配前后几行
    bootstrap-table 常用总结-树形结构
    linux 下jq的使用
    SHELL脚本获取域名对应的IP地址
    golang将切片或数组进行分组
    linux的统计实现
    Linux:“awk”命令的妙用
    rails 上传文件
  • 原文地址:https://www.cnblogs.com/fkissx/p/4803350.html
Copyright © 2020-2023  润新知