您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: