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

📄 ca_clut.m

📁 CA算法可以将数量型属性划分成若干个优化的区间
💻 M
字号:
%function [ru,rv] = ca_clut(xj)
%function [ru,rv] = ca_clut2
function [ru,rv] = ca_clut(ej,no,cj,xj)
%对输入向量X的数据进行聚类,输出划分矩阵和聚类中心
%

%Data = csvread('wdbc.txt');
%xj = Data(:,1);
[len rr]= size(xj);

cmax = cj;
cf = 1;
ch = 1;
e_val = ej;
n_val = no;
t_val = 10;
breakval = 0.01;
iterval = 5;
%初始化模糊C划分矩阵u
[center,U,obj_fcn] = fcm(xj,cmax,[2 iterval NaN NaN]); %迭代次数的选择很重要,实验结果表明选择迭代次数在20以上的最终分类结果数会在12以上

%计算聚类的基数N
Ni = ones(1,cmax);
for j = 1:cmax
    Ni(1,j) = sum(U(j,:));
end
%disp(Ni);

%计算聚类中心V
V = ccenter(U,xj);
%disp(V);

k = 0;
Nj = ones(1,len); 
while( 1 )
    [cmax r] = size(U);
%计算输入数据到聚类中心的距离
    dis = zeros(cmax,len);
    for i = 1 : cmax
        for j = 1 : len
            dis(i,j) = norm(xj(j) - V(i)).^2;
        end
    end
    
%计算变量第k次的变量a
    U = U.^2;
    temp = n_val * exp(-k/t_val);
    sum1 = 0;
    for i = 1 : cmax
        for j = 1:len
        sum1 = sum1 + U(i,j)*dis(i,j);
        end
    end
    sum2 = sum(Ni.^2);
    
    kth = temp * (sum1 / sum2);
    str0 = strcat(strcat('第',num2str(k)),'次得到的kth值为:');
    disp(kth);
    
%修改划分矩阵
    UF = zeros(cmax,len);
    UB = zeros(cmax,len);
    for i = 1 : cmax
        for j = 1 : len
            UF(i,j) = (dis(i,j).^-1)/ sum((dis(:,j).^-1));
        end
    end
    for j = 1 : len
         Nj(j) = dot(dis(:,j).^-1,Ni)/sum((dis(:,j).^-1));
    end
    for i = 1 : cmax
        for j = 1 : len
            UB(i,j) = kth*(Ni(i) - Nj(j))/dis(i,j);
        end
    end
    U = UF + UB;
    negpos = U <= 0;
    U(negpos) = 0;
    lar1pos = U >= 1;
    U(lar1pos) = 1;
    
     
%计算聚类的基数
    for i = 1:cmax
        Ni(i) = sum(U(i,:));
    end
    pos = Ni < e_val;
    kn = sum(pos);
    flag = zeros(1,kn);
    ii = 1;
    for i = 1 : cmax
        if (pos(i) == 1)
            flag(ii) = i;
            ii = ii + 1;
        end           
    end
    U(flag,:) = [];
    Ni(flag) = [];
    [cf rc] = size(U);
    chgV = ccenter(U,xj);
    if ( size(V) == size(chgV))
        ch = sum(abs(V - chgV));
    end
    V = chgV;  
    str2 = strcat(strcat('第',num2str(k)),'次得到的聚类中心为:');
    disp(str2);
    disp(V);
    if (cmax == cf && ch <=breakval)
        break;
    end
    k = k + 1;
end

disp('最终得到的分类数为:');
disp(cf);
disp('最终得到的聚类中心为:');
sortV = sort(V);
disp(sortV);
xu = zeros(1,cf);
for i = 1:cf
    xu(i) = find( V == sortV(i));
end
sortU = zeros(cf,len);
for i = 1:cf
    sortU(i,:) = U(xu(i),:);
end
%根据最大隶属度原则根据划分矩阵将数据xj划分为cf类
for i = 1 : len
    maxmemval = max(sortU(:,i));
    mempos = (sortU(:,i) < maxmemval);
    sortU(mempos,i) = 0;    
end
interval = zeros(cf,2);
disp('最终得到的划分区间为:');
for i = 1:cf
    clustxj = xj;
    maxpos = (sortU(i,:) == 0);
    clustnum = sum(maxpos);
    clustflag = zeros(1,clustnum);
    ii = 1;
    for ki = 1 : len
        if (maxpos(ki) == 1)
            clustflag(ii) = ki;
            ii = ii + 1;
        end           
    end
    clustxj(clustflag) = [];
    if length(clustxj) == 0
        continue;
    end
    minval = min(clustxj);
    maxval = max(clustxj);
    interval(i,1) = minval;
    interval(i,2) = maxval;
    strinterval = strcat(strcat(strcat(strcat('[',num2str(minval)),','),num2str(maxval)),']');
    disp(strinterval);   
end
ru = interval;
rv = sortV;

function cv = ccenter(uc,xc)
%计算聚类中心V
[c r] = size(uc);
rv = ones(1,c);
for i = 1 : c
    rv(i) = dot((uc(i,:).^2),xc)/dot(uc(i,:),uc(i,:));
end
cv = rv;


⌨️ 快捷键说明

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