最新C均值聚类实验报告共10页Word文档下载推荐.docx

上传人:b****2 文档编号:14166180 上传时间:2022-10-19 格式:DOCX 页数:17 大小:61.61KB
下载 相关 举报
最新C均值聚类实验报告共10页Word文档下载推荐.docx_第1页
第1页 / 共17页
最新C均值聚类实验报告共10页Word文档下载推荐.docx_第2页
第2页 / 共17页
最新C均值聚类实验报告共10页Word文档下载推荐.docx_第3页
第3页 / 共17页
最新C均值聚类实验报告共10页Word文档下载推荐.docx_第4页
第4页 / 共17页
最新C均值聚类实验报告共10页Word文档下载推荐.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

最新C均值聚类实验报告共10页Word文档下载推荐.docx

《最新C均值聚类实验报告共10页Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新C均值聚类实验报告共10页Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。

最新C均值聚类实验报告共10页Word文档下载推荐.docx

首先(shǒuxiān),随机选取k个对象作为(zuò

i)初始的k个簇的质心(zhì

xīn);

然后,将其余对象根据其与各个簇质心的距离分配(fēnpè

i)到最近的簇;

再求新形成的簇的质心。

这个迭代重定位过程不断重复,直到(zhí

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ù

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1