📄 ca_clut.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 + -