首页 > 其他分享 >模糊聚类的matlab仿真

模糊聚类的matlab仿真

时间:2022-10-10 16:09:32浏览次数:65  
标签:仿真 Dist iter matlab 聚类 end Data FCM


1.问题描述:

 模糊聚类分析是一种采用​​模糊数学​​​语言对事物按一定的要求进行描述和分类的数学方法。 [1]  模糊聚类分析一般是指根据研究对象本身的属性来构造​​模糊矩阵​​​,并在此基础上根据一定的隶属度来确定​​聚类关系​​​,即用​​模糊数学​​​的方法把样本之间的​​模糊关系​​​定量的确定,从而客观且准确地进行​​聚类​​​。聚类就是将数据集分成多个​​类​​​或​​簇​​,使得各个类之间的数据差别应尽可能大,类内之间的数据差别应尽可能小,即为“最小化类间相似性,最大化类内相似性”原则

2.部分程序:

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

%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<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 到样本点 j 的距离为 Dist(i,j)
%     Cluster_Res: 聚类结果,共 C 行,每一行对应一类
%     Obj_Fcn: 目标函数值
%     iter: FCM 算法迭代次数
% See also: fuzzydist maxrowf fcmplot
if nargin<5
    epsm=1.0e-6; 
end
if nargin<4
    M=2;
end
if nargin<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 的迭代算法
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(iter)=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;
    end
end
% 绘图
if plotflag
    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    
% See also: fuzzycm
if nargin<5
    epsm=1.0e-6; 
end
if nargin<4
    M=2;
end
if nargin<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 的迭代算法
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*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;
    end
end
% 绘图
if plotflag
    fcmplot(Data,U,P,Obj_Fcn);
end
% m文件3/7:
function fcmplot(Data,U,P,Obj_Fcn)
% FCM 结果绘图函数
% See also: fuzzycm maxrowf ellipse
[C,S] = size(P); res = maxrowf(U);
str = 'po*x+d^v><.h'; 
% 目标函数绘图
figure(1),plot(Obj_Fcn)
title('目标函数值变化曲线','fontsize',8)
% 2D 绘图
if S==2 
    figure(2),plot(P(:,1),P(:,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 off
end
% 3D 绘图
if S>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,title('3D 聚类结果图','fontsize',8),hold off
end
%% m文件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: addr
if nargin<2
    c=1;
end
N=size(U,2);mr(1,N)=0;
for j=1:N
    aj=addr(U(:,j),'descend');
    mr(j)=aj(c);
end
%% m文件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';
end
if nargin<3 | isempty(center)
    center=[0,0];
end
t=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)
end
%%m文件7/7:
function f = addr(a,strsort)
% 返回向量升序或降序排列后各分量在原始向量中的索引
% 函数调用:f = addr(a,strsort)
% strsort: 'ascend' or 'descend'
%          default is 'ascend'
% -------- example --------
% addr([ 4 5 1 2 ]) returns ans:
%       [ 3   4   1   2 ]
if nargin==1
    strsort='ascend';
end
sa=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;
end
if strcmp(strsort,'descend')
    f=fliplr(f);
end

3.仿真结论:

模糊聚类的matlab仿真_迭代

D19

标签:仿真,Dist,iter,matlab,聚类,end,Data,FCM
From: https://blog.51cto.com/u_15815923/5744379

相关文章