模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx
- 文档编号:26746193
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:13
- 大小:18.45KB
模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx
《模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx》由会员分享,可在线阅读,更多相关《模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx(13页珍藏版)》请在冰豆网上搜索。
模糊c均值聚类+FCM算法的MATLAB代码教案资料
模糊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:
聚类数,1 %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: fuzzydistmaxrowffcmplot ifnargin<5 epsm=1.0e-6; end ifnargin<4 M=2; end ifnargin<3 plotflag=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; %计算或更新聚类中心P Um=U0.^M; P=Um*Data./(ones(S,1)*sum(Um'))'; %更新划分矩阵U fori=1: C forj=1: N Dist(i,j)=fuzzydist(P(i,: ),Data(j,: )); end end U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m)))); %目标函数值: 类内加权平方误差和 ifnargout>4|plotflag Obj_Fcn(iter)=sum(sum(Um.*Dist.^2)); end %FCM算法迭代停止条件 ifnorm(U-U0,Inf) break end U0=U; end %聚类结果 ifnargout>3 res=maxrowf(U); forc=1: C v=find(res==c); Cluster_Res(c,1: length(v))=v; end end %绘图 ifplotflag fcmplot(Data,U,P,Obj_Fcn); end m文件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: fuzzycm ifnargin<5 epsm=1.0e-6; end ifnargin<4 M=2; end ifnargin<3 plotflag=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; %计算或更新划分矩阵U fori=1: C forj=1: N Dist(i,j)=fuzzydist(P0(i,: ),Data(j,: )); end end U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m)))); %更新聚类中心P Um=U.^M; P=Um*Data./(ones(S,1)*sum(Um'))'; %目标函数值: 类内加权平方误差和 ifnargout>4|plotflag Obj_Fcn(iter)=sum(sum(Um.*Dist.^2)); end %FCM算法迭代停止条件 ifnorm(P-P0,Inf) break end P0=P; end %聚类结果 ifnargout>3 res=maxrowf(U); forc=1: C v=find(res==c); Cluster_Res(c,1: length(v))=v; end end %绘图 ifplotflag fcmplot(Data,U,P,Obj_Fcn); end m文件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==2 figure (2),plot(P(: 1),P(: 2),'rs'),holdon fori=1: C v=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: ') end gridon,title('2D聚类结果图','fontsize',8),holdoff end %3D绘图 ifS>2 figure (2),plot3(P(: 1),P(: 2),P(: 3),'rs'),holdon fori=1: C v=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) end gridon,title('3D聚类结果图','fontsize',8),holdoff end m文件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: addr ifnargin<2 c=1; end N=size(U,2);mr(1,N)=0; forj=1: N aj=addr(U(: j),'descend'); mr(j)=aj(c); end m文件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轴坐标,可缺省 ifnargin<4 style='b'; end ifnargin<3|isempty(center) center=[0,0]; end t=1: 360; x=a/2*cosd(t)+center (1); y=b/2*sind(t)+center (2); ifnargin>4 plot3(x,y,ones(1,360)*c_3d,style) else plot(x,y,style) end m文件7/7: functionf=addr(a,strsort) %返回向量升序或降序排列后各分量在原始向量中的索引 %函数调用: f=addr(a,strsort) %strsort: 'ascend'or'descend' %defaultis'ascend' %--------example-------- %addr([4512])returnsans: %[3412] ifnargin==1 strsort='ascend'; end sa=sort(a);ca=a; la=length(a);f(la)=0; fori=1: la f(i)=find(ca==sa(i),1); ca(f(i))=NaN; end ifstrcmp(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! '); end data_n=size(data,1);%求出data的第一维(rows)数,即样本个数 in_n=size(data,2); %求出data的第二维(columns)数,即特征值长度 %默认操作参数 default_options=[2; %隶属度矩阵U的指数 100; %最大迭代次数 1e-5; %隶属度最小变化量,迭代终止条件 1]; %每次迭代是否输出信息标志 ifnargin==2, options=default_options; else %分析有options做参数时候的情况 %如果输入参数个数是二那么就调用默认的option; iflength(options)<4,%如果用户给的opition数少于4个那么其他用默认值; tmp=default_options; tmp(1: length(options))=options; options=tmp; end %返回options中是数的值为0(如NaN),不是数时为1 nan_index=find(isnan(options)==1); %将denfault_options中对应位置的参数赋值给options中不是数的位置. options(nan_index)=default_options(nan_index); ifoptions (1)<=1,%如果模糊矩阵的指数小于等于1 error('Theexponentshouldbegreaterthan1! '); end end %将options中的分量分别赋值给四个变量; expo=options (1); %隶属度矩阵U的指数 max_iter=options (2); %最大迭代次数 min_impro=options(3); %隶属度最小变化量,迭代终止条件 display=options(4); %每次迭代是否输出信息标志 obj_fcn=zeros(max_iter,1); %初始化输出参数obj_fcn U=initfcm(cluster_n,data_n); %初始化模糊分配矩阵,使U满足列上相加为1, %Mainloop 主要循环 fori=1: max_iter, %在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值; [U,center,obj_fcn(i)]=stepfcm(data,U,cluster_n,expo); ifdisplay, fprintf('FCM: Iterationcount=%d,obj.fcn=%f\n',i,obj_fcn(i)); end %终止条件判别 ifi>1, ifabs(obj_fcn(i)-obj_fcn(i-1)) break; end, end end iter_n=i; %实际迭代次数 obj_fcn(iter_n+1: max_iter)=[];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模糊 均值 FCM 算法 MATLAB 代码 教案 资料