C均值聚类实验报告Word格式文档下载.docx
- 文档编号:18963197
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:17
- 大小:78.57KB
C均值聚类实验报告Word格式文档下载.docx
《C均值聚类实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C均值聚类实验报告Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
则
③令计算新的集合中心:
计算误差平方和值:
④对每个聚合中的每个样本,计算:
表示减少的部分。
表示增加的部分:
若,则把样本移到聚合中心中,并修改聚合中心和值。
⑤判断:
若则,返回④。
否则,算法结束。
三.编写的程序:
#include<
cfloat>
iostream>
iomanip>
fstream>
ctime>
cmath>
usingnamespacestd;
doubledistance(doublea[4],doubleb[4])
{
//TODO:
改马氏距离
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]);
//打乱
使用随机排序
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;
}
//分类
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++;
//最小距离分类到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;
//计算均值为新聚类中心到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])//可以加入e比较
{
Z[i][j]=sum[i][j]/count[i];
changed=true;
}
}
//聚类中心没改变则退出
if(!
changed)
break;
//输出
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;
四.运行结果:
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.625
0.050848
0.666667
0.444444
0.542373
0.361111
0.79661
0.208333
0.661017
0.791667
0.805556
0.813559
0.694915
0.388889
0.611111
0.610169
0.694444
0.830508
0.916667
0.59322
0.527778
0.745763
0.555556
0.222222
0.338983
0.644068
0.708333
0.125
0.559322
0.033898
0.118644
0.111111
0.152542
0.305556
0.638889
0.711864
0.722222
0.833333
0.898305
0.576271
0.457627
0.958333
0.944444
0.777778
0.864407
0.508475
0.762712
0.728814
0.847458
0.474576
0.949153
0.055556
0.027778
0.861111
0.016949
0.915254
0.966102
0.440678
0.277778
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 均值 实验 报告