c均值算法:
- %% c-均值算法
- %% 初始化操作
- clc
- close all
- clear all
- n=100;
- N=5*n;
- %% 產生5類隨機樣本,假設類別數已知
- %% 樣本1
- mu1=[2 2];
- SIGMA1=[1 1.5; 1.5 3];
- tra_sam1 = mvnrnd(mu1,SIGMA1,n);
- %% 樣本2
- mu2=[20,20];
- SIGMA2=[4 3;3 5];
- tra_sam2 = mvnrnd(mu2,SIGMA2,n);
- %% 樣本3
- mu2=[11,11];
- SIGMA2=[1 1;1 2];
- tra_sam3 = mvnrnd(mu2,SIGMA2,n);
- %% 樣本4
- mu2=[20,2];
- SIGMA2=[2 1.2;1.2 4];
- tra_sam4 = mvnrnd(mu2,SIGMA2,n);
- %% 樣本5
- mu2=[2,20];
- SIGMA2=[3 2;2 3];
- tra_sam5 = mvnrnd(mu2,SIGMA2,n);
- tra_sam=[tra_sam1;tra_sam2;tra_sam3;tra_sam4;tra_sam5];
- %% 將樣本隨機分成5類,計算代表點
- n1=1;n2=1;n3=1;n4=1;n5=1;
- for i=1:N
- t=rand;
- if t<=0.2
- cell_sam1(n1,:)=tra_sam(i,:);
- n1=n1+1;
- elseif t<=0.4
- cell_sam2(n2,:)=tra_sam(i,:);
- n2=n2+1;
- elseif t<=0.6
- cell_sam3(n3,:)=tra_sam(i,:);
- n3=n3+1;
- elseif t<0.8
- cell_sam4(n4,:)=tra_sam(i,:);
- n4=n4+1;
- else
- cell_sam5(n5,:)=tra_sam(i,:);
- n5=n5+1;
- end
- end
- %% 求每類的均值
- m1=mean(cell_sam1);
- m2=mean(cell_sam2);
- m3=mean(cell_sam3);
- m4=mean(cell_sam4);
- m5=mean(cell_sam5);
- m=[m1;m2;m3;m4;m5];
- cell_sam1=zeros(1,2);cell_sam2=zeros(1,2);
- cell_sam3=zeros(1,2);cell_sam4=zeros(1,2);
- cell_sam5=zeros(1,2);
- n1=1;n2=1;n3=1;n4=1;n5=1;
- %% 獲得初始分類
- for i=1:N
- for j=1:5
- distance1(j)=norm(tra_sam(i,:)-m(j,:));
- end
- [a,b]=min(distance1);
- if b==1
- cell_sam1(n1,:)=tra_sam(i,:);
- n1=n1+1;
- elseif b==2
- cell_sam2(n2,:)=tra_sam(i,:);
- n2=n2+1;
- elseif b==3
- cell_sam3(n3,:)=tra_sam(i,:);
- n3=n3+1;
- elseif b==4
- cell_sam4(n4,:)=tra_sam(i,:);
- n4=n4+1;
- else
- cell_sam5(n5,:)=tra_sam(i,:);
- n5=n5+1;
- end
- end
- %% 移動初始分類的樣本使分類更加合理
- j_num=0;j_e1=0;
- while (j_num<5)
- [cell_sam1,cell_sam2,cell_sam3,cell_sam4,cell_sam5]=y_move(cell_sam1,cell_sam2,cell_sam3,cell_sam4,cell_sam5);
- [cell_sam2,cell_sam1,cell_sam3,cell_sam4,cell_sam5]=y_move(cell_sam2,cell_sam1,cell_sam3,cell_sam4,cell_sam5);
- [cell_sam3,cell_sam1,cell_sam2,cell_sam4,cell_sam5]=y_move(cell_sam3,cell_sam1,cell_sam2,cell_sam4,cell_sam5);
- [cell_sam4,cell_sam1,cell_sam2,cell_sam3,cell_sam5]=y_move(cell_sam4,cell_sam1,cell_sam2,cell_sam3,cell_sam5);
- [cell_sam5,cell_sam1,cell_sam2,cell_sam3,cell_sam4]=y_move(cell_sam5,cell_sam1,cell_sam2,cell_sam3,cell_sam4);
- %% 計算改變后的誤差平方
- m1=mean(cell_sam1);
- m2=mean(cell_sam2);
- m3=mean(cell_sam3);
- m4=mean(cell_sam4);
- m5=mean(cell_sam5);
- [r1,c1]=size(cell_sam1);
- [r2,c2]=size(cell_sam2);
- [r3,c3]=size(cell_sam3);
- [r4,c4]=size(cell_sam4);
- [r5,c5]=size(cell_sam5);
- j_e=0;
- for i=1:r1
- j_e=j_e+norm(cell_sam1(i,:)-m1)^2;
- end
- for i=1:r2
- j_e=j_e+norm(cell_sam2(i,:)-m2)^2;
- end
- for i=1:r3
- j_e=j_e+norm(cell_sam3(i,:)-m3)^2;
- end
- for i=1:r4
- j_e=j_e+norm(cell_sam4(i,:)-m4)^2;
- end
- for i=1:r5
- j_e=j_e+norm(cell_sam5(i,:)-m5)^2;
- end
- if abs(j_e1-j_e)<=0.001
- j_num=j_num+1;
- else
- j_num=0;
- end
- j_e1=j_e;
- end
- % 繪圖
- figure('NumberTitle', 'off', 'Name', '待分類樣本點');
- scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
- hold on
- scatter(tra_sam2(:,1),tra_sam2(:,2),'k')
- hold on
- scatter(tra_sam3(:,1),tra_sam3(:,2),'b')
- hold on
- scatter(tra_sam4(:,1),tra_sam4(:,2),'y')
- hold on
- scatter(tra_sam5(:,1),tra_sam5(:,2),'g')
- title('待分類樣本點')
- xlabel('特征1')
- ylabel('特征2')
- legend('類1','類2','類3','類4','類5',2)
- figure('NumberTitle', 'off', 'Name', '分類后樣本點與正確分類樣本點對比');
- scatter(cell_sam1(:,1),cell_sam1(:,2),'rx')
- hold on
- scatter(cell_sam2(:,1),cell_sam2(:,2),'kx')
- hold on
- scatter(cell_sam3(:,1),cell_sam3(:,2),'bx')
- hold on
- scatter(cell_sam4(:,1),cell_sam4(:,2),'yx')
- hold on
- scatter(cell_sam5(:,1),cell_sam5(:,2),'gx')
- hold on
- scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
- hold on
- scatter(tra_sam2(:,1),tra_sam2(:,2),'k')
- hold on
- scatter(tra_sam3(:,1),tra_sam3(:,2),'b')
- hold on
- scatter(tra_sam4(:,1),tra_sam4(:,2),'y')
- hold on
- scatter(tra_sam5(:,1),tra_sam5(:,2),'g')
- title('分類后樣本點與正確分類樣本點對比')
- xlabel('特征1')
- ylabel('特征2')
- legend('類1','類2','類3','類4','類5',2)
復制代碼
|