K均值聚类(C++)
2015-09-12 18:07
351 查看
#include<math.h> #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; void kmeans(int n, float* xy, int k, float* cxy) { int i,j; for(i=0;i<k;i++) { cxy[2*i]=xy[2*i]; cxy[2*i+1]=xy[2*i+1]; } int* mindis=(int*)malloc(n*sizeof(int)); int* premindis=(int*)malloc(n*sizeof(int)); for(i=0;i<n;i++) { mindis[i]=-1; } int change=1; while(change) { for(i=0;i<n;i++) { premindis[i]=mindis[i]; } for(i=0;i<n;i++) { float min=9999; for(j=0;j<k;j++) { 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])); if(s<min) { min=s; mindis[i]=j; } } } /* for(i=0;i<2;i++) { printf("%.3f ",cxy[2*i]); printf("%.3f\n",cxy[2*i+1]); } */ for(i=0;i<k;i++) { int num=0; float s0=0.0; float s1=0.0; //cout<<i<<":"; for(j=0;j<n;j++) { if(mindis[j]==i) { num++; //cout<<j<<" "; s0+=xy[2*j]; s1+=xy[2*j+1]; } } if(num) { cxy[2*i]=s0/num; cxy[2*i+1]=s1/num; } //cout<<endl; } int flag=0; for(i=0;i<n;i++) { if(mindis[i]!=premindis[i]) { flag=1; break; } } if(flag==0) change=0; } } int main() { 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}; float cxy[4]={0.0, 0.0, 0.0, 0.0}; kmeans(6,xy,2,cxy); int i; for(i=0;i<2;i++) { printf("%.3f ",cxy[2*i]); printf("%.3f\n",cxy[2*i+1]); } return 0; }
View Code
相关文章推荐
- 解析C++中的字符串处理函数和指针
- c++11——tuple元组
- Effective C++ —— 资源管理(三)
- c语言实现 去除字符串两端空格及回车 v1.0
- C++ Primer Plus 第九章(单独编译)
- C/C++下的JSON解析/生成库cJSON
- C/C++几种strcpy函数的实现与详解
- C++指针和引用简介
- c++11——lambda表达式
- C++字符数组的输入输出和字符串结束标志使用讲解
- C语言:二叉树的相关操作
- C++ explicit的用法
- 深入解析C++中的字符数组和处理字符串的方法
- 「C语言回 4000 顾之旅」第一篇:指针详解
- 「C语言回顾之旅」第一篇:指针详解
- C++中智能指针的设计和使用
- Windows下Setting Up a Project(建立一个工程)
- 哈希表实现电话号码查询系统(c++)
- [C++]函数调用栈
- c++11——std::function和bind绑定器