模糊均值聚類法Matlab實現以及注意事項
阿新 • • 發佈:2021-01-13
模糊均值聚類法Matlab實現
簡介
本文主要介紹模糊均值聚類法在Matlab的實現,以及實現過程中需要注意的地方。演算法的推算部分,原理介紹不再贅述,可以移步到以下文章。
相關公式
公式一:權值
公式二:中心點
公式三:結束條件
Matlab實現程式碼:
// An highlighted block
clear;clc;
U1=zeros(3,10);
A = [0 0 1 1 5 5 3 3 4 6;0 1 0 1 2 4 5 6 5 2];
for i=1:10 % 此部分為生成隨機數,初始化各點權值。
rand1=rand();
rand2=rand();
U1(1,i)=min(rand1,rand2);
U1(2,i)=abs(rand1-rand2);
U1(3,i)=1-max(rand1,rand2);
end %初始化結束
times=0; %記錄迭代次數
U=zeros(3,10); %U與U1用於檢測迭代是否結束
while(max(U1(:)-U(:))>0.000001) %由兩者之差的最大值為結束條件
U =U1; %覆蓋
C=zeros(2,3); %中心點歸零
for i=1:10 %重新計算新的中心點
C(:,1)= C(:,1)+(U(1,i)^3*A(:,i));
C(:,2)= C(:,2)+(U(2,i)^3*A(:,i));
C(:,3)= C(:,3)+(U(3,i)^3*A(:,i));
end
C(:,1)= C(:,1)/sum(U(1,:).^3);
C(:,2)= C(:,2)/sum(U(2,:).^3);
C(:,3)= C( :,3)/sum(U(3,:).^3);
for j=1:3 %重新計算新的權值
for i=1:10
dist1=sqrt(sum((A(:,i)-C(:,j)).^2)); %Cj距離
dist2=sqrt(sum((A(:,i)-C(:,1)).^2)); %C1距離
dist3=sqrt(sum((A(:,i)-C(:,2)).^2)); %C2距離
dist4=sqrt(sum((A(:,i)-C(:,3)).^2)); %C3距離
if(j==1) %點到不同簇類的計算方法不同
U1(j,i)=(dist2*dist3*dist4)/(dist2*dist3*dist4+dist1^2*dist3+dist1^2*dist4);
elseif(j==2)
U1(j,i)=(dist2*dist3*dist4)/(dist2*dist3*dist4+dist1^2*dist2+dist1^2*dist4);
else
U1(j,i)=(dist2*dist3*dist4)/(dist2*dist3*dist4+dist1^2*dist2+dist1^2*dist3);
end
end
end
times=times+1 %迭代次數
end
n1=0;n2=0;n3=0; %分類
for k = 1: 10
[MIN,index] = max(U1(:,k));
if index == 1 % 點屬於第一個聚類中心
n1=n1+1;
N1(1,n1) = A(1,k);
N1(2,n1) = A(2,k);
elseif index==2 % 點屬於第二個聚類中心
n2=n2+1;
N2(1,n2) = A(1,k);
N2(2,n2) = A(2,k);
else % 點屬於第三個聚類中心
n3=n3+1;
N3(1,n3) = A(1,k);
N3(2,n3) = A(2,k);
end
end
figure;
plot(N1(1,1:n1) , N1(2,1:n1), '*b'); % 作出第一類點的圖形
hold on
plot(N2(1,1:n2) , N2(2,1:n2), 'oc'); %作出第二類點的圖形
hold on
plot(N3(1,1:n3) , N3(2,1:n3), 'sm'); %作出第三類點的圖形
hold on
plot(C(1,1:3) , C(2,1:3), '+r','MarkerSize',20); % 畫出三個聚類中心點
xlabel('X');
ylabel('Y');