模糊均值聚类法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');