模糊均值聚类法Matlab实现以及注意事项

本文详细介绍了如何在Matlab中实现模糊均值聚类法,包括算法流程、关键公式及Matlab代码示例。通过迭代更新权值矩阵和中心点,最终完成数据点的分类。注意点包括初始化、结束条件、权值和中心点计算等,适用于多类别聚类问题。
摘要由CSDN通过智能技术生成

模糊均值聚类法Matlab实现

简介

本文主要介绍模糊均值聚类法在Matlab的实现,以及实现过程中需要注意的地方。算法的推算部分,原理介绍不再赘述,可以移步到以下文章。

链接: link.
链接: link.

相关公式

公式一:权值

Alt

公式二:中心点

在这里插入图片描述

公式三:结束条件

在这里插入图片描述

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);                      %UU1用于检测迭代是否结束
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');

注意点:

一、本程序将10个点分为三类,如果读者需要分成两类可删减对应标注的代码行。而需要分更多类的则可以整合成类。

二、因为权值公式与中心点公式相互关联,所以在开始的时候需要随机生成其中一个,本文选择随机生成权值矩阵。

三、注意通分权值公式,另外公式中m为你需要分的类,本文需要分出三类,所以m=3,则权值公式分母部分为 2/(3-1)=1。

四、注意每次迭代需要将中心点归零,另外把中心点公式进行展开,可方便理解公式。

五、程序需要存储新的权值矩阵U(t+1)以及旧的权值矩阵U(t)用来验算迭代是否结束。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值