模糊聚类FCM的MATLAB实现

来源:互联网 发布:网络知识培训手机 编辑:程序博客网 时间:2024/04/30 12:32

FCM的原理在之前的博文中写过。现在按照它的算法流程,用MATLAB实现。共包括三个函数(myfcm.m, mydist.m, myplot.m)

测试数据集用的是鸢尾花(iris)数据集。下载地址  http://download.csdn.net/detail/u013657981/9241121

1. myfcm.m

function [U, V,objFcn] = myfcm(data, c, T, m, epsm)% fuzzy c-means algorithm% 输入: data: 待聚类数据,n行s列,n为数据个数,s为每个数据的特征数%        c  :  聚类中心个数%        m  :   模糊系数% 输出: U  :   隶属度矩阵,c行n列,元素uij表示第j个数据隶属于第i类的程度%        V  :  聚类中心向量,c行s列,有c个中心,每个中心有s维特征% written by Zhang Jin% see also  :  mydist.m  myplot.mif nargin < 3    T = 100;   %默认迭代次数为100endif nargin < 5    epsm = 1.0e-6;  %默认收敛精度endif nargin < 4    m = 2;   %默认模糊系数值为2end[n, s] = size(data); % 初始化隶属度矩阵U(0),并归一化U0 = rand(c, n);temp = sum(U0,1);for i=1:n    U0(:,i) = U0(:,i)./temp(i);enditer = 0; V(c,s) = 0; U(c,n) = 0; distance(c,n) = 0;while( iter<T  )    iter = iter + 1;%    U =  U0;    % 更新V(t)    Um = U0.^m;    V = Um*data./(sum(Um,2)*ones(1,s));   % MATLAB矩阵相乘啊,好东西    % 更新U(t)    for i = 1:c        for j = 1:n            distance(i,j) = mydist(data(j,:),V(i,:));        end    end    U=1./(distance.^m.*(ones(c,1)*sum(distance.^(-m))));     objFcn(iter) = sum(sum(Um.*distance.^2));    % FCM算法停止条件    if norm(U-U0,Inf)<epsm          break    end      U0=U;endmyplot(U,objFcn);

2. mydist.m

function  d = mydist(X,Y)% 计算向量Y到向量X的欧氏距离的开方d = sqrt(sum((X-Y).^2));end

3. myplot.m

function myplot(U,objFcn)% 将隶属度U矩阵可视化figure(1)subplot(3,1,1);plot(U(1,:),'-b');title('隶属度矩阵值')ylabel('第一类')subplot(3,1,2);plot(U(2,:),'-r');ylabel('第二类')subplot(3,1,3);plot(U(3,:),'-g');xlabel('样本数')ylabel('第三类')figure(2)grid onplot(objFcn);title('目标函数变化值');xlabel('迭代次数')ylabel('目标函数值')


结果


可以看到,大约迭代了8次左右,目标函数开始收敛,从隶属度矩阵上可以看出,第一类与其它类区分较为明显,第二类和第三类比较相似,区分度有所降低。


0 0
原创粉丝点击