CmeansFCM.docx
《CmeansFCM.docx》由会员分享,可在线阅读,更多相关《CmeansFCM.docx(20页珍藏版)》请在冰点文库上搜索。
CmeansFCM
模式识别大作业报告
非监督模式识别:
对Iris数据进行C均值聚类和模糊C均值聚类
一、C均值聚类
ⅠC均值聚类概述
初始划分3个聚类,选定其初始中心分别为第1、51、101组数据。
第一次聚类采用近邻法进行聚类,并更新各聚类中心;之后对于每组数据求其与各聚类中心的平均距离,按照各样本与中心之间的误差平方和最小的方向进行聚类。
即若
2<
2时则将y分为第j类,否则分为第k类;分类后计算新的聚类中心,之后迭代重复以上两步骤直到聚类中心不再改变,停止迭代,完成聚类。
Ⅱ源代码
本程序采用MATLAB编写:
clear,closeall
%¶ÁÈ¡È«²¿Êý¾Ý
total=xlsread('C:
\Users\Administrator\Documents\data\total');
pa_cluster=total(:
1:
4);
%Ñ¡È¡¾ÛÀàÖÐÐļ°²ÎÊý¶¨Òå
m1=pa_cluster(1,:
);a1=zeros(1,4);
m2=pa_cluster(51,:
);a2=zeros(1,4);
m3=pa_cluster(101,:
);a3=zeros(1,4);
dis_cemtre=zeros(1,3);
e=0.0001;
%¾ÛÀ࿪ʼ
class1=zeros(150,4);
class2=zeros(150,4);
class3=zeros(150,4);
%µÚÒ»´Î¾ÛÀà
num=zeros(1,3);
fori=1:
150
dist=[(pa_cluster(i,:
)-m1)*(pa_cluster(i,:
)-m1)',(pa_cluster(i,:
)-m2)*(pa_cluster(i,:
)-m2)',(pa_cluster(i,:
)-m3)*(pa_cluster(i,:
)-m3)'];
if(dist
(1)<=dist
(2)&&dist
(1)<=dist(3))
num
(1)=num
(1)+1;
class1(num
(1),:
)=pa_cluster(i,:
);
elseif(dist
(2)(1)&&dist
(2)num
(2)=num
(2)+1;
class2(num
(2),:
)=pa_cluster(i,:
);
else
num(3)=num(3)+1;
class3(num(3),:
)=pa_cluster(i,:
);
end
end
%¸üоÛÀàÖÐÐÄ
a1=m1;a2=m2;a3=m3;
m1=mean(class1,1);m2=mean(class2,1);m3=mean(class3,1);
dis_centre=[(m1-a1)*(m1-a1)',(m2-a2)*(m2-a2)',(m3-a3)*(m3-a3)'];
%c¾ùÖµ¾ÛÀà
while(dis_centre
(1)>=e&&dis_centre
(2)>=e&&dis_centre(3)>=e)
dist=[(class1(i,:
)-m1)*(class1(i,:
)-m1)',(class1(i,:
)-m2)*(class1(i,:
)-m2)',(class1(i,:
)-m3)*(class1(i,:
)-m3)'];
forj=1:
num
(1)
if((num
(1)*dist
(1)/(num
(1)-1))>(num
(2)*dist
(2)/(num
(2)+1))&&(num
(2)*dist
(2)/(num
(2)+1))<(num(3)*dist(3)/num(3)+1))
class2(num
(2)+1,:
)=class1(j,:
);
class1(j,:
)=[];
num
(1)=num
(1)-1;num
(2)=num
(2)+1;
end
if((num
(1)*dist
(1)/(num
(1)-1))>(num
(2)*dist
(2)/(num
(2)+1))&&(num
(2)*dist
(2)/(num
(2)+1))>(num(3)*dist(3)/num(3)+1))
class3(num(3)+1,:
)=class1(j,:
);
class1(j,:
)=[];
num
(1)=num
(1)-1;num(3)=num(3)+1;
end
end
forj=1:
num
(2)
if((num
(2)*dist
(2)/(num
(2)-1))>(num
(1)*dist
(1)/(num
(1)+1))&&(num
(1)*dist
(1)/(num
(1)+1))<(num(3)*dist(3)/num(3)+1))
class1(num
(1)+1,:
)=class2(j,:
);
class2(j,:
)=[];
num
(1)=num
(1)+1;num
(2)=num
(2)-1;
end
if((num
(2)*dist
(2)/(num
(2)-1))>(num
(1)*dist
(1)/(num
(1)+1))&&(num
(1)*dist
(1)/(num
(1)+1))>(num(3)*dist(3)/num(3)+1))
class3(num(3)+1,:
)=class2(j,:
);
class2(j,:
)=[];
num
(2)=num
(2)-1;num(3)=num(3)+1;
end
end
forj=1:
num(3)
if((num(3)*dist(3)/(num(3)-1))>(num
(1)*dist
(1)/(num
(1)+1))&&(num
(1)*dist
(1)/(num
(1)+1))<(num
(2)*dist
(2)/num
(2)+1))
class1(num
(1)+1,:
)=class3(j,:
);
class3(j,:
)=[];
num
(1)=num
(1)+1;num(3)=num(3)-1;
end
if((num(3)*dist(3)/(num(3)-1))>(num
(1)*dist
(1)/(num
(1)+1))&&(num
(1)*dist
(1)/(num
(1)+1))>(num
(2)*dist
(2)/num
(2)+1))
class2(num(3)+1,:
)=class3(j,:
);
class3(j,:
)=[];
num
(2)=num
(2)+1;num(3)=num(3)-1;
end
end
a1=m1;a2=m2;a3=m3;
m1=mean(class1,1);m2=mean(class2,1);m3=mean(class3,1);
dis_centre=[(m1-a1)*(m1-a1)',(m2-a2)*(m2-a2)',(m3-a3)*(m3-a3)'];
end
class1(sum(class1,2)==0,:
)=[];
class2(sum(class2,2)==0,:
)=[];
class3(sum(class3,2)==0,:
)=[];
disp('thefirstclassis:
');
disp(class1);
disp('thesecondclassis:
');
disp(class2);
disp('thethirdclassis:
');
disp(class3);
disp(size(class1,1));
disp(size(class2,1));
disp(size(class3,1));
Ⅲ运行结果
>>cluster
thefirstclassis:
5.10003.50001.40000.2000
4.90003.00001.40000.2000
4.70003.20001.30000.2000
4.60003.10001.50000.2000
5.00003.60001.40000.2000
5.40003.90001.70000.4000
4.60003.40001.40000.3000
5.00003.40001.50000.2000
4.40002.90001.40000.2000
4.90003.10001.50000.1000
5.40003.70001.50000.2000
4.80003.40001.60000.2000
4.80003.00001.40000.1000
4.30003.00001.10000.1000
5.80004.00001.20000.2000
5.70004.40001.50000.4000
5.40003.90001.30000.4000
5.10003.50001.40000.3000
5.70003.80001.70000.3000
5.10003.80001.50000.3000
5.40003.40001.70000.2000
5.10003.70001.50000.4000
4.60003.60001.00000.2000
5.10003.30001.70000.5000
4.80003.40001.90000.2000
5.00003.00001.60000.2000
5.00003.40001.60000.4000
5.20003.50001.50000.2000
5.20003.40001.40000.2000
4.70003.20001.60000.2000
4.80003.10001.60000.2000
5.40003.40001.50000.4000
5.20004.10001.50000.1000
5.50004.20001.40000.2000
4.90003.10001.50000.1000
5.00003.20001.20000.2000
5.50003.50001.30000.2000
4.90003.10001.50000.1000
4.40003.00001.30000.2000
5.10003.40001.50000.2000
5.00003.50001.30000.3000
4.50002.30001.30000.3000
4.40003.20001.30000.2000
5.00003.50001.60000.6000
5.10003.80001.90000.4000
4.80003.00001.40000.3000
5.10003.80001.60000.2000
4.60003.20001.40000.2000
5.30003.70001.50000.2000
5.00003.30001.40000.2000
4.90002.40003.30001.0000
5.00002.30003.30001.0000
5.10002.50003.00001.1000
7.00003.20004.70001.4000
6.90003.10004.90001.5000
6.50002.80004.60001.5000
6.30003.30004.70001.6000
5.20002.70003.90001.4000
5.90003.00004.20001.5000
6.10002.90004.70001.4000
6.70003.10004.40001.4000
5.80002.70004.10001.0000
5.60002.50003.90001.1000
6.10002.80004.00001.3000
6.10002.80004.70001.2000
6.60003.00004.40001.4000
6.70003.00005.00001.7000
5.70002.60003.50001.0000
5.50002.40003.70001.0000
6.00002.70005.10001.6000
6.00003.40004.50001.6000
6.30002.30004.40001.3000
5.50002.50004.00001.3000
6.10003.00004.60001.4000
5.60002.70004.20001.3000
5.70002.90004.20001.3000
5.70002.80004.10001.3000
6.50003.20005.10002.0000
6.00002.20005.00001.5000
6.20002.80004.80001.8000
7.20003.00005.80001.6000
6.00003.00004.80001.8000
6.30002.50005.00001.9000
thesecondclassis:
6.40003.20004.50001.5000
5.50002.30004.00001.3000
5.70002.80004.50001.3000
6.60002.90004.60001.3000
5.00002.00003.50001.0000
6.00002.20004.00001.0000
5.60002.90003.60001.3000
5.60003.00004.50001.5000
6.20002.20004.50001.5000
5.90003.20004.80001.8000
6.30002.50004.90001.5000
6.40002.90004.30001.3000
6.80002.80004.80001.4000
6.00002.90004.50001.5000
5.50002.40003.80001.1000
5.80002.70003.90001.2000
5.40003.00004.50001.5000
6.70003.10004.70001.5000
5.60003.00004.10001.3000
5.50002.60004.40001.2000
5.80002.60004.00001.2000
5.70003.00004.20001.2000
6.20002.90004.30001.3000
4.90002.50004.50001.7000
6.40002.70005.30001.9000
6.30002.70004.90001.8000
6.10003.00004.90001.8000
6.30002.80005.10001.5000
6.90003.10005.10002.3000
6.50003.00005.20002.0000
thethirdclassis:
6.30003.30006.00002.5000
5.80002.70005.10001.9000
7.10003.00005.90002.1000
6.30002.90005.60001.8000
6.50003.00005.80002.2000
7.60003.00006.60002.1000
7.30002.90006.30001.8000
6.70002.50005.80001.8000
7.20003.60006.10002.5000
6.80003.00005.50002.1000
5.70002.50005.00002.0000
5.80002.80005.10002.4000
6.40003.20005.30002.3000
6.50003.00005.50001.8000
7.70003.80006.70002.2000
7.70002.60006.90002.3000
6.90003.20005.70002.3000
5.60002.80004.90002.0000
7.70002.80006.70002.0000
6.70003.30005.70002.1000
7.20003.20006.00001.8000
6.40002.80005.60002.1000
7.40002.80006.10001.9000
7.90003.80006.40002.0000
6.40002.80005.60002.2000
6.10002.60005.60001.4000
7.70003.00006.10002.3000
6.30003.40005.60002.4000
6.40003.10005.50001.8000
6.90003.10005.40002.1000
6.70003.10005.60002.4000
5.80002.70005.10001.9000
6.80003.20005.90002.3000
6.70003.30005.70002.5000
6.70003.00005.20002.3000
6.20003.40005.40002.3000
5.90003.00005.10001.8000
83
30
37
二、模糊C均值聚类
Ⅰ模糊C均值概述
仍然初始划分3个聚类,选定其初始中心分别为第1、51、101组数据。
参数b的值设为3。
重复以下两步:
1.用当前的聚类中心计算各样本对各中心的隶属度
2.用当前的隶属度更新各聚类中心
算法收敛的标准是
该算法收敛后,分类完成。
再进行去模糊化,即将样本隶属度值大的分到对应的类中。
Ⅱ源代码
该程序用MATLAB编写
clear,closeall
%¶ÁÈ¡È«²¿Êý¾Ý
total=xlsread('C:
\Users\Administrator\Documents\data\total');
pa_cluster=total(:
1:
4);
%Ñ¡È¡¾ÛÀàÖÐÐļ°²ÎÊý¶¨Òå
m1=pa_cluster(1,:
);
m2=pa_cluster(51,:
);
m3=pa_cluster(101,:
);
b=3;x=1/(b-1);
u=zeros(150,3);v=zeros(150,3);
e=0.0001;udis=1;
%Ä£ºý¾ÛÀà
while(udis>=e)
%¼ÆËãÁ¥Êô¶Èº¯Êý
fori=1:
150
dist=[(pa_cluster(i,:
)-m1)*(pa_cluster(i,:
)-m1)',(pa_cluster(i,:
)-m2)*(pa_cluster(i,:
)-m2)',(pa_cluster(i,:
)-m3)*(pa_cluster(i,:
)-m3)'];
u(i,1)=((1/dist
(1))^x)/(((1/dist
(1))^x)+((1/dist
(2))^x)+((1/dist
(2))^x));
u(i,2)=((1/dist
(2))^x)/(((1/dist
(1))^x)+((1/dist
(2))^x)+((1/dist
(2))^x));
u(i,3)=((1/dist(3))^x)/(((1/dist
(1))^x)+((1/dist
(2))^x)+((1/dist
(2))^x));
if(u(i,1)==0&&u(i,2)==0)
u(i,3)=1;
end
if(u(i,2)==0&&u(i,3)==0)
u(i,1)=1;
end
if(u(i,1)==0&&u(i,3)==0)
u(i,2)=1;
end
if(isnan(u(i,1)))
u(i,1)=1-u(i,2)-u(i,3);
end
if(isnan(u(i,2)))
u(i,2)=1-u(i,1)-u(i,3);
end
if(isnan(u(i,3)))
u(i,3)=1-u(i,2)-u(i,1);
end
end
dif=u-v;
udis=norm(dif);
%¸üоÛÀàÖÐÐÄ
su1=u(:
1).^b;
su2=u(:
2).^b;
su3=u(:
3).^b;
m1=(su1'*pa_cluster)/sum(su1,1);
m2=(su2'*pa_cluster)/sum(su2,1);
m3=(su3'*pa_cluster)/sum(su3,1);
v=u;
end
%ȥģºý»¯
class1=zeros(150,5);
class2=zeros(150,5);
class3=zeros(150,5);
forj=1:
150
if(u(j,1)>=u(j,2)&&u(j,1)>=u(j,3))
class1(j,:
)=total(j,:
);
end
if(u(j,2)>u(j,1)&&u(j,2)>u(j,3))
class2(j,:
)=total(j,:
);
end
if(u(j,3)>u(j,1)&&u(j,3)>u(j,2))
class3(j,:
)=total(j,:
);
end
end
%È·¶¨×îÖÕ¾ÛÀà½á¹û
class1(sum(class1,2)==0,:
)=[];
class2(sum(class2,2)==0,:
)=[];
class3(sum(class3,2)==0,:
)=[];
disp('thefirstclassis:
');
disp(class1);
disp('thesecondclassis:
');
disp(class2);
disp('thethirdclassis:
');
disp(class3);
disp(size(class1,1));
disp(size(class2,1));
disp(size(class3,1));
Ⅲ运行结果
行向量的最后一维是Iris数据原先分类的类标。
>>fuzzy_cmeans
thefirstclassis:
5.10003.50001.40000.20001.0000
4.90003.00001.40000.20001.0000
4.70003.20001.30000.20001.0000
4.60003.10001.500