结果和中心的初始有关
#include<stdio.h>
#include<MATH.H>
#define DGREE 2 //维度
#define SAMPLENUM 10 //样本数量
#define K 3 //分类个数
typedef struct
{
int v[DGREE]; //向量
int classify; //分类
}sample;
//欧式距离
double getDis(const sample *a,double *center)
{
int i=0;
double dis=0;
for (i=0;i<DGREE;++i)
{
dis = pow((a->v[i] - center[i]),2);
}
return pow(dis,0.5);
}
//获取最小值下标
int getMinTip(double *dis)
{
int i=0,j=0;
double temp = dis[0];
for (i=0;i<K;++i)
{
if (dis[i]<=temp)
{
temp = dis[i];
j=i;
}
}
return j;
}
//计算聚类中心
void getClassCenter(const sample *s,double center[K][DGREE])
{
int i=0,j=0,k=0,count=0,sum[DGREE]={0};
for (i=0;i<K;++i)
{
count=0;
for (j=0;j<DGREE;++j) sum[j]=0;
for (k=0;k<SAMPLENUM;++k)
{
if (s[k].classify == i)
{
count++;
for (j=0;j<DGREE;++j)
{
sum[j] += s[k].v[j];
}
}
}
for (j=0;j<DGREE;++j)
{
if (count == 0)
{
center[i][j] = 0.0;
}
else{
center[i][j] = (double)sum[j]/(double)count;
}
}
}
}
int isClassOk(double center[K][DGREE],double oldCenter[K][DGREE])
{
int i,j;
for (i=0;i<K;++i)
{
for (j=0;j<DGREE;++j)
{
if (fabs(center[i][j]-oldCenter[i][j]) >0.000000001)
{
return 0;
}
}
}
return 1;
}
void printResult(const sample *s,double center[K][DGREE])
{
int i,j,k;
for (i=0;i<K;++i)
{
printf("class-------%d\n",i);
printf("center------: ");
for (j=0;j<DGREE;++j) printf("%f ",center[i][j]);
printf("\n");
for (k=0;k<SAMPLENUM;++k)
{
if (s[k].classify == i)
{
printf("(");
for (j=0;j<DGREE;++j) printf("%d ",s[k].v[j]);
printf(")\t");
}
}
printf("\n\n");
}
}
//分类
void getClass(sample *s,double center[K][DGREE])
{
double dis[K] = {0};
double tempCenter[K][DGREE] = {0};
int i,j,k;//test=0;
while (!isClassOk(center,tempCenter))
{
for (k=0;k<SAMPLENUM;++k)
{
for (i=0;i<K;++i)
{
dis[i] = getDis(&s[k],center[i]);
}
s[k].classify = getMinTip(dis);
}
for (i=0;i<K;++i)
{
for (j=0;j<DGREE;++j)
{
tempCenter[i][j] = center[i][j];
}
}
getClassCenter(s,center);
//printf("%d\n",test++);
// printResult(s,center);
}
}
int main(int argc, char* argv[])
{
sample s[SAMPLENUM] ={{{0,0},0},{{1,1},0},{{2,1},0},{{4,3},0},{{5,3},0},{{5,4},0},{{6,5},0},{{1,4},0},{{1,5},0},{{1,6},0}};
double center[K][DGREE] = {{0,0},{1,5},{5,4}};
getClass(s,center);
printResult(s,center);
return 0;
}