⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fkmcmd.m

📁 其中有五个程序
💻 M
字号:
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %          程序运行过程中调用:ddd函数,这个函数计算在本聚类模式下的两个模糊
                              %          数的距离          
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function FKMCMD(k,mm,x,e)      %其中,e表示预设的阈值;k类,mm表示模糊关系数,x为待聚类的模糊数据矩阵,
                               %每一行表示一个模糊数.若每一个模糊数包含m个不同的数据单元,则要求x为一个n*(4m)的矩阵.其中n表示
                               %模糊数的个数,每一行中前m个表示该模糊数据的m个中心位置,随后的m个数据表示内径,在后
                               %面的m个元素表示左区间长,最后面的m个元素表右区间长。
n=size(x);
m=n(2)/4;                      %求出模糊数据向量的规模,即其包含几个部分
n=n(1);                        %求出x的模糊数的个数n

                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %       判断类别数是不是大于数据个数      %
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if k>n
    fprintf('ERROR! The number of clusters is greater than the number of the data, namely %d>%d. Please revise your cluster number!\n',k,n)
else
    
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %                             声明变量空间                                                 
                              %    u:为初始关系矩阵
                              %    uu:为经优化后的关系矩阵
                              %    c:为数据的中心矩阵(这是一个矩阵,因为x为一个向量模糊数)                
                              %    g:为数据的内径矩阵
                              %    l:为数据的左区间长矩阵
                              %    r:为数据的右区间长矩阵
                              %    C:为k类初始中心矩阵
                              %    G:为k类初始内径矩阵
                              %    L:为k类初始左区间长矩阵
                              %    R:为k类初始右区间长矩阵
                              %    CC:为k类经优化后的中心矩阵
                              %    GG:为k类经优化后的内径矩阵
                              %    LL:k类经优化后的左区间长矩阵
                              %    RR:k类经优化后的右区间长矩阵
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u=ones(k,n)/n;
uu=ones(k,n);
c=ones(n,m);
g=ones(n,m);
l=ones(n,m);
r=ones(n,m);
C=ones(k,m);
G=ones(n,m);
L=ones(n,m);
R=ones(n,m);
CC=ones(k,m);
GG=ones(n,m);
LL=ones(n,m);
RR=ones(n,m);

                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %                         初始赋值
                              %   第一部分,将x分为中心,内径,左区间长和右区间长,分别赋值给c,g,l和r
                              %   第二部分,选取k个聚类中心,内径,左区间长和右区间长。不妨取为前k个元素,其中为了计算需要对中心做一个平移变换
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              
for i=1:n                                %第一部分                         
    c(i,:)=x(i,1:m);
    g(i,:)=x(i,(m+1):2*m);
    l(i,:)=x(i,(2*m+1):3*m);
    r(i,:)=x(i,(3*m+1):4*m);
end
for j=1:k                                %第二部分  
    C(j,:)=c(j,:)-0.1;
    G(j,:)=g(j,:);
    L(j,:)=l(j,:);
    R(j,:)=r(j,:);
end


                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %                  计算部分
                              %     第三部分,计算优化后的关系矩阵。其中用到的算法是根据论文中提供的方法。
                              %     第四部分,第五部分,第六部,和第七部分分分别为计算优化后的聚类中心,内径,
                              %                    左区间和右区间长度矩阵。其中用到的算法是根据论文中提供的方法。
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
d=ones(1,k);
for i=1:n                                %第三部分                  
    for j=1:k
        d(j)=1/(ddd(x(i,:),[C(j,:), G(j,:),L(j,:),R(j,:)])^(2/(mm-1)));
    end
    for j=1:k
        uu(j,i)=1/(ddd(x(i,:),[C(j,:), G(j,:),L(j,:),R(j,:)])^(2/(mm-1))*sum(d));
    end
    d=ones(1,k);
end

for i=1:k                               %第四部分
    CC(i,:)=0;
    for j=1:n
        CC(i,:)=uu(i,j).^mm*(8*c(j,:)-l(j,:)+r(j,:)+L(i,:)-R(i,:))+CC(i,:);
    end
    CC(i,:)=CC(i,:)/(8*sum(uu(i,:).^mm));
end
for i=1:k                               %第五部分
    GG(i,:)=0;
    for j=1:n
        GG(i,:)=uu(i,j).^mm*(4*g(j,:)+l(j,:)+r(j,:)-L(i,:)-R(i,:))+GG(i,:);
    end
    GG(i,:)=GG(i,:)/(8*sum(uu(i,:).^mm));
end
for i=1:k                               %第六部分
    LL(i,:)=0;
    for j=1:n
        LL(i,:)=uu(i,j).^mm*(-2*c(j,:)+g(j,:)+l(j,:)+2*C(i,:)-G(i,:))+LL(i,:);
    end
    LL(i,:)=LL(i,:)/(sum(uu(i,:).^mm));
end
for i=1:k                               %第七部分
    RR(i,:)=0;
    for j=1:n
        RR(i,:)=uu(i,j).^mm*(2*c(j,:)+g(j,:)+r(j,:)-2*C(i,:)-G(i,:))+RR(i,:);
    end
    RR(i,:)=RR(i,:)/(sum(uu(i,:).^mm));
end

                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %             进入循环项:若u和uu相应元素的差的最大值大于预设阈值e,则进入循环
                              %  将新算出的结果赋给就变量,重新计算相应的关系矩阵uu和聚类中心,内径,左区间和右区间矩阵,直到循环条件不被满足,跳出循环。
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while max(max(abs(u-uu)))>e 
    L=LL;
    R=RR;
    G=GG;
    C=CC;
    u=uu;
    d=ones(1,k);
for i=1:n                                           
    for j=1:k
        d(j)=1/(ddd(x(i,:),[C(j,:), G(j,:),L(j,:),R(j,:)])^(2/(mm-1)));
    end
    for j=1:k
        uu(j,i)=1/(ddd(x(i,:),[C(j,:), G(j,:),L(j,:),R(j,:)])^(2/(mm-1))*sum(d));
    end
    d=ones(1,k);
end

for i=1:k                               
    CC(i,:)=0;
    for j=1:n
        CC(i,:)=uu(i,j).^mm*(8*c(j,:)-l(j,:)+r(j,:)+L(i,:)-R(i,:))+CC(i,:);
    end
    CC(i,:)=CC(i,:)/(8*sum(uu(i,:).^mm));
end
for i=1:k                              
    GG(i,:)=0;
    for j=1:n
        GG(i,:)=uu(i,j).^mm*(4*g(j,:)+l(j,:)+r(j,:)-L(i,:)-R(i,:))+GG(i,:);
    end
    GG(i,:)=GG(i,:)/(8*sum(uu(i,:).^mm));
end
for i=1:k                            
    LL(i,:)=0;
    for j=1:n
        LL(i,:)=uu(i,j).^mm*(-2*c(j,:)+g(j,:)+l(j,:)+2*C(i,:)-G(i,:))+LL(i,:);
    end
    LL(i,:)=LL(i,:)/(sum(uu(i,:).^mm));
end
for i=1:k                               
    RR(i,:)=0;
    for j=1:n
        RR(i,:)=uu(i,j).^mm*(2*c(j,:)+g(j,:)+r(j,:)-2*C(i,:)-G(i,:))+RR(i,:);
    end
    RR(i,:)=RR(i,:)/(sum(uu(i,:).^mm));
end
end

                              %%%%%%%%%%%%%%%%%%%%%%%%%%
                              %    输出计算的结果,分别为聚类中心和关系矩阵
                              %%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf('The centers of the %d clustering is:\n',k)
CC
fprintf('The membership of the elements relating to the %d clusters is:\n',k)
uu=uu'
fprintf('The graph has shown the result of the clustering, in which the red point is the center of the clusters.\n')
                              %%%%%%%%%%%%%%%%%%%%%%%%%
                              %     画图
                              %%%%%%%%%%%%%%%%%%%%%%%%%
hold on
if m==2
for i=1:n
    plot([c(i,1)],[c(i,2)],'*')
    plot([c(i,1)-l(i,1),c(i,1)+l(i,1),c(i,1)+l(i,1),c(i,1)-l(i,1),c(i,1)-l(i,1)],[c(i,2)-l(i,2),c(i,2)-l(i,2),c(i,2)+l(i,2),c(i,2)+l(i,2),c(i,2)-l(i,2)])
end
else 
    for i=1:n
    plot([c(i,1)],[c(i,2)],'*')

    end
end
for i=1:k
plot([CC(i,1)],[CC(i,2)],'Marker','o','LineStyle','none','Color',[1 0 0])
end
hold off
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -