模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx

上传人:b****4 文档编号:26746193 上传时间:2023-06-22 格式:DOCX 页数:13 大小:18.45KB
下载 相关 举报
模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx_第1页
第1页 / 共13页
模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx_第2页
第2页 / 共13页
模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx_第3页
第3页 / 共13页
模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx_第4页
第4页 / 共13页
模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx

《模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx》由会员分享,可在线阅读,更多相关《模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx(13页珍藏版)》请在冰豆网上搜索。

模糊c均值聚类+FCM算法的MATLAB代码教案资料.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1