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

📄 adfknc.m

📁 其中有五个程序
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%          程序运行过程中调用:dddd函数(其中用到编写DFKNC时,所用到的距离函数d),这个函数计算在本聚类模式下的两个模糊数的距离           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function ADFKNC(c,mm,x,e,a,B)%其中,e表示预设的阈值;c类,mm表示模糊关系数,
                                               %x为待聚类的模糊数据矩阵,每一行表示一个模糊数(依次为中心,左区间长和右区间长);a,B分别充当lambda和rho的角色
n=size(x);
n=n(1);  %求出x的模糊数的个数n
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%       判断类别数是不是大于数据个数      %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if c>n
    fprintf('ERROR! The number of clusters is greater than the number of the data, namely %d>%d. Please revise your cluster number!\n',c,n)
else
    
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %                             声明变量空间    
                              %    b:为在这种计算模式下的参数
                              %    u:为初始关系矩阵
                              %    uu:为经优化后的关系矩阵
                              %    xx:为所有所有数据的相应的平均值
                              %    m:为数据点的中心向量(由于这里研究的只是一维情况,所以其只能形成向量)
                              %    l:为数据点的左区间长向量
                              %    r:为数据点的右区间长向量
                              %    M:为初始聚类的中心向量
                              %    L:为初始聚类的左区间长向量
                              %    R:为初始聚类的右区间长向量
                              %    MM:为优化后聚类的中心向量
                              %    LL:为优化后聚类的左区间长向量
                              %    RR:为优化后聚类的右区间长向量
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
b=0;
xx=sum(x)/n;
for i=1:n
    b=b+d(x(i,:),xx,a,B)*d(x(i,:),xx,a,B);
end
b=n/b;
u=ones(c,n)/n;      
uu=ones(c,n);
m=ones(1,n);        
l=ones(1,n);
r=ones(1,n);
M=ones(1,c);        
L=ones(1,c);
R=ones(1,c);
MM=ones(1,c);              
LL=ones(1,c);
RR=ones(1,c);
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %                         初始赋值
                              %   第一部分,将x分为中心,左区间长和区间长,分别赋值给m,l和r向量
                              %   第二部分,选取k个聚类中心,和区间长。不妨取为前k个元素,其中为了计算需要对中心做一个平移变换
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n                    %第一部分                 
    m(i)=x(i,1);
    l(i)=x(i,2);
    r(i)=x(i,3);
end
for i=1:c                    %第二部分             
    M(i)=x(i,1)-0.1;
    L(i)=x(i,2)-0.1;
    R(i)=x(i,3)-0.1;
end

                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %                  计算部分
                              %     第三部分,计算优化后的关系矩阵uu。其中用到的算法是根据论文中提供的方法。
                              %     第四部分,计算优化后的聚类中心和区间长度矩阵。其中用到的算法是根据论文中提供的方法。
                              %     第五部分,赋值给center,其中center为输出量,其包括各个聚类的最终中心,左区间长和右区间长
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dd=ones(1,c);
for j=1:n                    %第三部分
    for i=1:c
        dd(i)=1/(dddd([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B,b)^(2/(mm-1)));
    end
    for i=1:c
        uu(i,j)=1/(dddd([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B,b)^(2/(mm-1))*sum(dd));
    end
    dd=ones(1,c);
end

for i=1:c                   %第四部分    
     MM(i)=0;
     LL(i)=0;
     RR(i)=0;
     division=0;
    for j=1:n
        MM(i)=MM(i)+(uu(i,j).^mm)*(3*m(j)-a*(l(j)-L(i))+B*(r(j)-R(i)))*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
        LL(i)=LL(i)+(uu(i,j).^mm)*(M(i)+a*l(j)-m(j))*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
        RR(i)=RR(i)+(uu(i,j).^mm)*(m(j)+B*r(j)-M(i))*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
        division=division+(uu(i,j).^mm)*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
    end
    MM(i)=MM(i)/(3*division);
    LL(i)=LL(i)/(a*division);
    RR(i)=RR(i)/(B*division);
end
center(:,1)=MM(:);         %第五部分
center(:,2)=LL(:);
center(:,3)=RR(:);

                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %             进入循环项:若u和uu相应元素的差的最大值大于预设阈值e,则进入循环
                              %  将新算出的结果赋给就变量,重新计算相应的关系矩阵uu直到循环条件不被满足,跳出循环。
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while max(max(abs(u-uu)))>e 
    u=uu;
    M(:)=MM(:);
    L(:)=LL(:);
    R(:)=RR(:);
    dd=ones(1,c);
for j=1:n                    %第六部分
    for i=1:c
        dd(i)=1/(dddd([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B,b)^(2/(mm-1)));
    end
    for i=1:c
        uu(i,j)=1/(dddd([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B,b)^(2/(mm-1))*sum(dd));
    end
    dd=ones(1,c);
end

for i=1:c                   %第七部分    
     MM(i)=0;
     LL(i)=0;
     RR(i)=0;
     division=0;
    for j=1:n
        MM(i)=MM(i)+(uu(i,j).^mm)*(3*m(j)-a*(l(j)-L(i))+B*(r(j)-R(i)))*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
        LL(i)=LL(i)+(uu(i,j).^mm)*(M(i)+a*l(j)-m(j))*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
        RR(i)=RR(i)+(uu(i,j).^mm)*(m(j)+B*r(j)-M(i))*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
        division=division+(uu(i,j).^mm)*exp(-b*d([M(i),L(i),R(i)],[m(j),l(j),r(j)],a,B)^2);
    end
    MM(i)=MM(i)/(3*division);
    LL(i)=LL(i)/(a*division);
    RR(i)=RR(i)/(B*division);
end
center(:,1)=MM(:);         %第九部分
center(:,2)=LL(:);
center(:,3)=RR(:);
end
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %    输出计算的结果,分别为聚类中心和关系矩阵
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf('The centers of the %d clustering is:\n',c)
center
fprintf('The membership of the elements relating to the %d clusters is:\n',c)
uu=uu'
fprintf('The graph has shown the result of the clustering, in which the red point is the center of the clusters.\n')

                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                              %           作图,上面一张图表示原始数据(这里的隶属函数都认为是三角关系);第二张图为各类的模糊数据  %
                              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,1,1)
hold on
for i=1:n
    plot([m(i)-l(i),m(i),m(i)+r(i)],[0,1,0]);
end
hold off
title('The figure of the original data')
subplot(2,1,2)
hold on
for i=1:c
    plot([MM(i)-LL(i),MM(i),MM(i)+RR(i)],[0,1,0]);
end
title('The centers and spreads of the cluters')
hold off
end

⌨️ 快捷键说明

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