模糊c均值聚类+FCM算法的MATLAB代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

模糊c均值聚类FCM算法的MATLAB代码我做毕业论文时需要模糊C-均值聚类,找了好长时间才找到这个,分享给大家:FCM算法的两种迭代形式的MATLAB代码写于下,也许有的同学会用得着:m文件1/7:function[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)%模糊C均值聚类FCM:从随机初始化划分矩阵开始迭代%[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)%输入:%Data:N×S型矩阵,聚类的原始数据,即一组有限的观测样本集,%Data的每一行为一个观测样本的特征矢量,S为特征矢量%的维数,N为样本点的个数%C:聚类数,1CN%plotflag:聚类结果2D/3D绘图标记,0表示不绘图,为缺省值%M:加权指数,缺省值为2%epsm:FCM算法的迭代停止阈值,缺省值为1.0e-6%输出:%U:C×N型矩阵,FCM的划分矩阵%P:C×S型矩阵,FCM的聚类中心,每一行对应一个聚类原型%Dist:C×N型矩阵,FCM各聚类中心到各样本点的距离,聚类中%心i到样本点j的距离为Dist(i,j)%Cluster_Res:聚类结果,共C行,每一行对应一类%Obj_Fcn:目标函数值%iter:FCM算法迭代次数%Seealso:fuzzydistmaxrowffcmplotifnargin5epsm=1.0e-6;endifnargin4M=2;endifnargin3plotflag=0;end[N,S]=size(Data);m=2/(M-1);iter=0;Dist(C,N)=0;U(C,N)=0;P(C,S)=0;%随机初始化划分矩阵U0=rand(C,N);U0=U0./(ones(C,1)*sum(U0));%FCM的迭代算法whiletrue%迭代计数器iter=iter+1;%计算或更新聚类中心PUm=U0.^M;P=Um*Data./(ones(S,1)*sum(Um'))';%更新划分矩阵Ufori=1:Cforj=1:NDist(i,j)=fuzzydist(P(i,:),Data(j,:));endendU=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));%目标函数值:类内加权平方误差和ifnargout4|plotflagObj_Fcn(iter)=sum(sum(Um.*Dist.^2));end%FCM算法迭代停止条件ifnorm(U-U0,Inf)epsmbreakendU0=U;end%聚类结果ifnargout3res=maxrowf(U);forc=1:Cv=find(res==c);Cluster_Res(c,1:length(v))=v;endend%绘图ifplotflagfcmplot(Data,U,P,Obj_Fcn);endm文件2/7:function[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm2(Data,P0,plotflag,M,epsm)%模糊C均值聚类FCM:从指定初始聚类中心开始迭代%[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm2(Data,P0,plotflag,M,epsm)%输入:Data,plotflag,M,epsm:见fuzzycm.m%P0:初始聚类中心%输出:U,P,Dist,Cluster_Res,Obj_Fcn,iter:见fuzzycm.m%Seealso:fuzzycmifnargin5epsm=1.0e-6;endifnargin4M=2;endifnargin3plotflag=0;end[N,S]=size(Data);m=2/(M-1);iter=0;C=size(P0,1);Dist(C,N)=0;U(C,N)=0;P(C,S)=0;%FCM的迭代算法whiletrue%迭代计数器iter=iter+1;%计算或更新划分矩阵Ufori=1:Cforj=1:NDist(i,j)=fuzzydist(P0(i,:),Data(j,:));endendU=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));%更新聚类中心PUm=U.^M;P=Um*Data./(ones(S,1)*sum(Um'))';%目标函数值:类内加权平方误差和ifnargout4|plotflagObj_Fcn(iter)=sum(sum(Um.*Dist.^2));end%FCM算法迭代停止条件ifnorm(P-P0,Inf)epsmbreakendP0=P;end%聚类结果ifnargout3res=maxrowf(U);forc=1:Cv=find(res==c);Cluster_Res(c,1:length(v))=v;endend%绘图ifplotflagfcmplot(Data,U,P,Obj_Fcn);endm文件3/7:functionfcmplot(Data,U,P,Obj_Fcn)%FCM结果绘图函数%Seealso:fuzzycmmaxrowfellipse[C,S]=size(P);res=maxrowf(U);str='po*x+d^v.h';%目标函数绘图figure(1),plot(Obj_Fcn)title('目标函数值变化曲线','fontsize',8)%2D绘图ifS==2figure(2),plot(P(:,1),P(:,2),'rs'),holdonfori=1:Cv=Data(find(res==i),:);plot(v(:,1),v(:,2),str(rem(i,12)+1))ellipse(max(v(:,1))-min(v(:,1)),...max(v(:,2))-min(v(:,2)),...[max(v(:,1))+min(v(:,1)),...max(v(:,2))+min(v(:,2))]/2,'r:')endgridon,title('2D聚类结果图','fontsize',8),holdoffend%3D绘图ifS2figure(2),plot3(P(:,1),P(:,2),P(:,3),'rs'),holdonfori=1:Cv=Data(find(res==i),:);plot3(v(:,1),v(:,2),v(:,3),str(rem(i,12)+1))ellipse(max(v(:,1))-min(v(:,1)),...max(v(:,2))-min(v(:,2)),...[max(v(:,1))+min(v(:,1)),...max(v(:,2))+min(v(:,2))]/2,...'r:',(max(v(:,3))+min(v(:,3)))/2)endgridon,title('3D聚类结果图','fontsize',8),holdoffendm文件4/7:functionD=fuzzydist(A,B)%模糊聚类分析:样本间的距离%D=fuzzydist(A,B)D=norm(A-B);m文件5/7:functionmr=maxrowf(U,c)%求矩阵U每列第c大元素所在行,c的缺省值为1%调用格式:mr=maxrowf(U,c)%Seealso:addrifnargin2c=1;endN=size(U,2);mr(1,N)=0;forj=1:Naj=addr(U(:,j),'descend');mr(j)=aj(c);endm文件6/7:functionellipse(a,b,center,style,c_3d)%绘制一个椭圆%调用:ellipse(a,b,center,style,c_3d)%输入:%a:椭圆的轴长(平行于x轴)%b:椭圆的轴长(平行于y轴)%center:椭圆的中心[x0,y0],缺省值为[0,0]%style:绘制的线型和颜色,缺省值为实线蓝色%c_3d:椭圆的中心在3D空间中的z轴坐标,可缺省ifnargin4style='b';endifnargin3|isempty(center)center=[0,0];endt=1:360;x=a/2*cosd(t)+center(1);y=b/2*sind(t)+center(2);ifnargin4plot3(x,y,ones(1,360)*c_3d,style)elseplot(x,y,style)endm文件7/7:functionf=addr(a,strsort)%返回向量升序或降序排列后各分量在原始向量中的索引%函数调用:f=addr(a,strsort)%strsort:'ascend'or'descend'%defaultis'ascend'%--------example--------%addr([4512])returnsans:%[3412]ifnargin==1strsort='ascend';endsa=sort(a);ca=a;la=length(a);f(la)=0;fori=1:laf(i)=find(ca==sa(i),1);ca(f(i))=NaN;endifstrcmp(strsort,'descend')f=fliplr(f);end几天前我还在这里发帖求助,可是很幸运在其他地方找到了,在这里和大家分享一下!function[center,U,obj_fcn]=FCMClust(data,cluster_n,options)%FCMClust.m采用模糊C均值对数据集data聚为cluster_n类%%用法:%1.[center,U,obj_fcn]=FCMClust(Data,N_cluster,options);%2.[center,U,obj_fcn]=FCMClust(Data,N_cluster);%%输入:%data----nxm矩阵,表示n个样本,每个样本具有m的维特征值%N_cluster----标量,表示聚合中心数目,即类别数%options----4x1矩阵,其中%options(1):隶属度矩阵U的指数,1(缺省值:2.0)%options(2):最大迭代次数(缺省值:100)%options(3):隶属度最小变化量,迭代终止条件(缺省值:1e-5)%options(4):每次迭代是否输出信息标志(缺省值:1)%输出:%center----聚类中心%U----隶属度矩阵%obj_fcn----目标函数值%Example:%data=rand(100,2);%[center,U,obj_fcn]=FCMClust(data,2);%plot(data(:,1),data(:,2),'o');%holdon;%maxU=max(U);%index1=find(U(1,:)==maxU);%index2=find(U(2,:)==maxU);%line(data(index1,1),data(index1,2),'marker','*','color','g');%line(data(index2,1),data(index2,2),'marker','*','color','r');%plot([center([12],1)],[center([12],2)],'*','color','k')%holdoff;ifnargin~=2&nargin~=3,%判断输入参数个数只能是2个或3个error('Toomanyortoofewinputarguments!');enddata_n=size(data,1);%求出data的第一维(rows)数,即样本个数in_n=size(data,2);%求出data的第二维(columns)数,即特征值长度%默认操作参数default_op

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功