最新C均值聚类实验报告共10页Word文档下载推荐.docx
《最新C均值聚类实验报告共10页Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新C均值聚类实验报告共10页Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
首先(shǒuxiān),随机选取k个对象作为(zuò
wé
i)初始的k个簇的质心(zhì
xīn);
然后,将其余对象根据其与各个簇质心的距离分配(fēnpè
i)到最近的簇;
再求新形成的簇的质心。
这个迭代重定位过程不断重复,直到(zhí
dà
o)目标函数最小化为止。
C-均值聚类算法使用的聚类准则函数是误差平方和准则:
为了使聚类结果优化,应该使准则最小化。
二、C均值聚类的实现步骤
C-均值算法步骤:
①给出n个混合样本,令,表示迭代运算次数,选取c个初始聚合中心
②计算每个样本与聚合中心的距离:
若
则
③令计算新的集合中心:
计算误差平方和值:
④对每个聚合中的每个样本,计算:
表示减少的部分。
表示增加的部分:
若,则把样本移到聚合中心中,并修改聚合中心和值。
⑤判断(pà
nduà
n):
若则,返回(fǎnhuí
)④。
否则(fǒuzé
),算法结束。
三.编写(biānxiě)的程序:
#include<
cfloat>
iostream>
iomanip>
fstream>
ctime>
cmath>
usingnamespacestd;
doubledistance(doublea[4],doubleb[4])
{
//TODO:
改马氏距离(jù
lí
)
doubled0=a[0]-b[0];
doubled1=a[1]-b[1];
doubled2=a[2]-b[2];
doubled3=a[3]-b[3];
returnsqrt(d0*d0+d1*d1+d2*d2+d3*d3);
}
intmain()
//读取数据
doubledata[150][4];
ifstreamf("
data.txt"
);
for(inti=0;
i<
150;
i++)
f>
>
data[i][0]>
data[i][1]>
data[i][2]>
data[i][3];
f.close();
//归一化
doublem[4]={DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX};
doubleM[4]={-DBL_MAX,-DBL_MAX,-DBL_MAX,-DBL_MAX};
for(i=0;
for(intj=0;
j<
4;
j++)
{
if(data[i][j]<
m[j])
m[j]=data[i][j];
if(data[i][j]>
M[j])
M[j]=data[i][j];
}
data[i][j]=(data[i][j]-m[j])/(M[j]-m[j]);
//打乱
使用(shǐyò
ng)随机排序
intrightLabels[150];
for(i=0;
50;
rightLabels[i]=0;
for(i=50;
100;
rightLabels[i]=1;
for(i=100;
rightLabels[i]=2;
srand(time(NULL));
{
intj=rand()%150;
doubletmp;
tmp=data[i][0];
data[i][0]=data[j][0];
data[j][0]=tmp;
tmp=data[i][1];
data[i][1]=data[j][1];
data[j][1]=tmp;
tmp=data[i][2];
data[i][2]=data[j][2];
data[j][2]=tmp;
tmp=data[i][3];
data[i][3]=data[j][3];
data[j][3]=tmp;
inttmp2;
tmp2=rightLabels[i];
rightLabels[i]=rightLabels[j];
rightLabels[j]=tmp2;
}
//分类(fēnlè
i)
intlabels[150];
doubleZ[3][4]={data[0][0],data[0][1],data[0][2],data[0][3],data[1][0],data[1][1],data[1][2],data[1][3],
data[2][0],data[2][1],data[2][2],data[2][3]};
intiterations=0;
while(true)
//cout<
<
setw(10)<
Z[0][0]<
Z[0][1]<
Z[0][2]<
Z[0][3]<
endl
//<
Z[1][0]<
Z[1][1]<
Z[1][2]<
Z[1][3]<
Z[2][0]<
Z[2][1]<
Z[2][2]<
Z[2][3]<
endl;
//cin.get();
iterations++;
//最小距离(jù
)分类到label
for(inti=0;
doubled0=distance(Z[0],data[i]);
doubled1=distance(Z[1],data[i]);
doubled2=distance(Z[2],data[i]);
if((d0<
d1)&
&
(d0<
d2))
labels[i]=0;
elseif(d1<
d2)
labels[i]=1;
else
labels[i]=2;
//计算均值(jūnzhí
)为新聚类中心到Z
doublesum[3][4]={0.0};
intcount[3]={0};
for(i=0;
intlabel=labels[i];
sum[label][0]+=data[i][0];
sum[label][1]+=data[i][1];
sum[label][2]+=data[i][2];
sum[label][3]+=data[i][3];
count[label]++;
boolchanged=false;
3;
for(intj=0;
{
if(Z[i][j]!
=sum[i][j]/count[i])//可以加入(jiārù
)e比较
{
Z[i][j]=sum[i][j]/count[i];
changed=true;
}
}
//聚类中心(zhōngxīn)没改变则退出
if(!
changed)
break;
//输出(shūchū)
intcount[3]={0};
cout<
data[i][0]<
"
\t"
data[i][1]<
data[i][2]<
data[i][3]<
labels[i]<
(char)(rightLabels[i]+'
A'
)<
count[labels[i]]++;
cout<
<
iterations:
"
iterations<
label0count:
count[0]<
label1count:
count[1]<
label2count:
count[2]<
cin.get();
return0;
四.运行(yù
nxí
ng)结果:
0.166667
0.389831
0.375
B
0.138889
0.416667
0.067797
1
A
0.472222
0.083333
0.677966
0.583333
C
0.333333
0.779661
0.875
2
0.25
0.084746
0.194444
0.423729
0.041667
0.5
0.627119
0.541667
0.291667
0.525424
0.75
0.458333
0.101695
0.491525
0.333