模糊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)=[];