版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、模糊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 型矩
2、阵,聚类的原始数据,即一组有限的观测样本集,% Data 的每一行为一个观测样本的特征矢量,S 为特征矢量% 的维数,N 为样本点的个数% C: 聚类数,1<C<N% plotflag: 聚类结果 2D/3D 绘图标记,0 表示不绘图,为缺省值 % M: 加权指数,缺省值为 2% epsm: FCM 算法的迭代停止阈值,缺省值为 1.0e-6% 输出:% U: C×N 型矩阵,FCM 的划分矩阵% P: C×S 型矩阵,FCM 的聚类中心,每一行对应一个聚类原型% Dist: C×N 型矩阵,FCM 各聚类中心到各样本点的距离,聚类中% 心 i 到样本
3、点 j 的距离为 Dist(i,j)% Cluster_Res: 聚类结果,共 C 行,每一行对应一类% Obj_Fcn: 目标函数值% iter: FCM 算法迭代次数% See also: fuzzydist maxrowf fcmplotif nargin<5 epsm=1.0e-6; endif nargin<4 M=2;endif nargin<3 plotflag=0;endN,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
4、./(ones(C,1)*sum(U0);% FCM 的迭代算法while true % 迭代计数器 iter=iter+1; % 计算或更新聚类中心 P Um=U0.M; P=Um*Data./(ones(S,1)*sum(Um')' % 更新划分矩阵 U for i=1:C for j=1:N Dist(i,j)=fuzzydist(P(i,:),Data(j,:); end end U=1./(Dist.m.*(ones(C,1)*sum(Dist.(-m); % 目标函数值: 类内加权平方误差和 if nargout>4 | plotflag Obj_Fcn(it
5、er)=sum(sum(Um.*Dist.2); end % FCM 算法迭代停止条件 if norm(U-U0,Inf)<epsm break end U0=U; end% 聚类结果if nargout > 3 res = maxrowf(U); for c = 1:C v = find(res=c); Cluster_Res(c,1:length(v)=v; endend% 绘图if plotflag fcmplot(Data,U,P,Obj_Fcn);endm文件2/7:function U,P,Dist,Cluster_Res,Obj_Fcn,iter=fuzzycm2(D
6、ata,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 % See also: fuzzycmif nargin<5 epsm=1.0e-6; endif nargin<4 M=2;end
7、if nargin<3 plotflag=0;endN,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 的迭代算法while true % 迭代计数器 iter=iter+1; % 计算或更新划分矩阵 U for i=1:C for j=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*
8、Data./(ones(S,1)*sum(Um')' % 目标函数值: 类内加权平方误差和 if nargout>4 | plotflag Obj_Fcn(iter)=sum(sum(Um.*Dist.2); end % FCM 算法迭代停止条件 if norm(P-P0,Inf)<epsm break end P0=P;end% 聚类结果if nargout > 3 res = maxrowf(U); for c = 1:C v = find(res=c); Cluster_Res(c,1:length(v)=v; endend% 绘图if plotflag
9、 fcmplot(Data,U,P,Obj_Fcn);endm文件3/7:function fcmplot(Data,U,P,Obj_Fcn)% FCM 结果绘图函数% See also: fuzzycm maxrowf ellipseC,S = size(P); res = maxrowf(U);str = 'po*x+dv><.h' % 目标函数绘图figure(1),plot(Obj_Fcn)title('目标函数值变化曲线','fontsize',8)% 2D 绘图if S=2 figure(2),plot(P(:,1),P(
10、:,2),'rs'),hold on for i=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 grid on,title('2D 聚类结果图','fontsize',8),hold offend% 3D 绘图if S&g
11、t;2 figure(2),plot3(P(:,1),P(:,2),P(:,3),'rs'),hold on for i=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 grid on
12、,title('3D 聚类结果图','fontsize',8),hold offendm文件4/7:function D=fuzzydist(A,B)% 模糊聚类分析: 样本间的距离% D = fuzzydist(A,B)D=norm(A-B);m文件5/7:function mr=maxrowf(U,c)% 求矩阵 U 每列第 c 大元素所在行,c 的缺省值为 1% 调用格式: mr = maxrowf(U,c)% See also: addrif nargin<2 c=1;endN=size(U,2);mr(1,N)=0;for j=1:N aj=ad
13、dr(U(:,j),'descend'); mr(j)=aj(c);endm文件6/7:function ellipse(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 轴坐标,可缺省if nargin<4 style='b'en
14、dif nargin<3 | isempty(center) center=0,0;endt=1:360;x=a/2*cosd(t)+center(1);y=b/2*sind(t)+center(2);if nargin>4 plot3(x,y,ones(1,360)*c_3d,style)else plot(x,y,style)endm文件7/7:function f = addr(a,strsort)% 返回向量升序或降序排列后各分量在原始向量中的索引% 函数调用:f = addr(a,strsort)% strsort: 'ascend' or 'de
15、scend'% default is 'ascend'% - example -% addr( 4 5 1 2 ) returns ans:% 3 4 1 2 if nargin=1 strsort='ascend'endsa=sort(a); ca=a;la=length(a);f(la)=0;for i=1:la f(i)=find(ca=sa(i),1); ca(f(i)=NaN;endif strcmp(strsort,'descend') f=fliplr(f);end几天前我还在这里发帖求助,可是很幸运在其他地方找到了,在这里
16、和大家分享一下!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); %
17、 % 输入: % data - nxm矩阵,表示n个样本,每个样本具有m的维特征值 % N_cluster - 标量,表示聚合中心数目,即类别数 % options - 4x1矩阵,其中 % options(1): 隶属度矩阵U的指数,>1
18、; (缺省值: 2.0) % options(2): 最大迭代次数 (缺省值: 100) % options(3):
19、; 隶属度最小变化量,迭代终止条件 (缺省值: 1e-5) % options(4): 每次迭代是否输出信息标志 (缺省值: 1) % 输出: % center - 聚类中心 % U
20、60; - 隶属度矩阵 % obj_fcn - 目标函数值 % Example: % data = rand(100,2); % center,U,obj_fcn = FCMClust(data,2); % plot(data(:,1), data(:,2),
21、'o'); % hold on; % maxU = max(U); % index1 = find(U(1,:) = maxU); % index2 = find(U(2,:) = maxU); % line(data(index1,1),data(index1,2),'marker','*'
22、;,'color','g'); % line(data(index2,1),data(index2,2),'marker','*','color','r'); % plot(center(1 2,1),center(1 2,2),'*','color','k') % hold off; if nar
23、gin = 2 & nargin = 3, %判断输入参数个数只能是2个或3个 error('Too many or too few input arguments!'); end data_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数 in_n = size(data, 2); % 求出data的第二维(columns)数,即特征值长度 % 默认操作参数 default_options = 2;
24、 % 隶属度矩阵U的指数 100; % 最大迭代次数 1e-5; % 隶属度最小变化量,迭代终止条件 1;
25、; % 每次迭代是否输出信息标志 if nargin = 2, options = default_options; else %分析有options做参数时候的情况 % 如果输入参数个数是二那么就调用默认的option; if length(options) < 4, %如果用户给的opition数少
26、于4个那么其他用默认值; tmp = default_options; tmp(1:length(options) = options; options = tmp; end % 返回options中是数的值
27、为0(如NaN),不是数时为1 nan_index = find(isnan(options)=1); %将denfault_options中对应位置的参数赋值给options中不是数的位置. options(nan_index) = default_options(nan_index); if options(1) <= 1, %如果模糊矩阵的指数小于等于1
28、60; error('The exponent should be greater than 1!'); end end %将options 中的分量分别赋值给四个变量; expo = options(1); % 隶属度矩阵U的指数 max_iter = options(2); % 最大迭代次数 min_impro = options(3); % 隶属度最小变化量,迭代终止条件 display = options(4); % 每次迭代是否输出信息标志 obj_fcn = zero
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论