📄 dfwkmc.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 程序运行过程中调用:dddddc,dddddl函数,这个函数计算在本聚类模式下的两个模糊数的距离 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function DFWKMC(k,mm,x,e,v) %其中,e表示预设的阈值;k类,mm表示模糊关系数,x为待聚类的模糊数据矩阵,
%每一行表示一个模糊数.若每一个模糊数包含m个不同的数据单元,则要求x为一个n*(2m)的矩阵.其中n表示
%模糊数的个数,每一行中前m个表示该模糊数据的m个中心位置,后m个数据表示区间长。当然,
%这种模式也只能处理左右对称型的数据。其中,v表示这个计算模型下要求的参数,其范围应该是
%0<=v<=0.5
n=size(x);
m=n(2)/2; %求出模糊数据向量的规模,即其包含几个部分
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为一个向量模糊数)
% l:为数据的区间长矩阵
% C:为k类初始中心矩阵
% L:为k类初始区间长矩阵
% CC:为k类经优化后的中心矩阵
% LL:k类经优化后的左区间长矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u=ones(k,n)/n;
uu=ones(k,n);
c=ones(n,m);
l=ones(n,m);
C=ones(k,m);
CC=ones(k,m);
L=ones(k,m);
LL=ones(k,m);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 初始赋值
% 第一部分,将x分为中心和区间长,分别赋值给c,g,l和r
% 第二部分,选取k个聚类中心,区间长。不妨取为前k个元素,其中为了计算需要对中心做一个平移变换
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n %第一部分
c(i,:)=x(i,1:m);
l(i,:)=x(i,m+1:2*m);
end
for i=1:k %第二部分
C(i,:)=c(i,:)-0.1;
L(i,:)=l(i,:);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算部分
% 第三部分,计算优化后的关系矩阵。其中用到的算法是根据论文中提供的方法。
% 第四部分,为计算优化后的聚类中心和区间长度矩阵。其中用到的算法是根据论文中提供的方法。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:n %第三部分
d=ones(1,k);
for i=1:k
d(i)=1/(((1-v)^2*dddddc(x(j,:),[C(i,:),L(i,:)])^2+v^2*dddddl(x(j,:),[C(i,:),L(i,:)])^2)^(1/(mm-1)));
end
for i=1:k
uu(i,j)=1/((((1-v)^2*dddddc(x(j,:),[C(i,:),L(i,:)])^2+v^2*dddddl(x(j,:),[C(i,:),L(i,:)])^2)^(1/(mm-1)))*sum(d));
end
end
for i=1:k %第四部分
CC(i,:)=0;
LL(i,:)=0;
for j=1:n
CC(i,:)=uu(i,j)^mm*c(j,:)+CC(i,:);
LL(i,:)=uu(i,j)^mm*l(j,:)+LL(i,:);
end
CC(i,:)=CC(i,:)/(sum(uu(i,:).^mm));
LL(i,:)=LL(i,:)/(sum(uu(i,:).^mm));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算v根据论文要求,若v大于0.5,则将其值修正为0.5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fz=ones(k,n);
for i=1:k
for j=1:n
fz(i,j)=dddddc(x(j,:),[CC(i,:),LL(i,:)])^2;
end
end
fm=ones(k,n);
for i=1:k
for j=1:n
fm(i,j)=dddddc(x(j,:),[CC(i,:),LL(i,:)])^2+dddddl(x(j,:),[CC(i,:),LL(i,:)])^2;
end
end
v=sum(sum((uu.^mm).*fz))/sum(sum((uu.^mm).*fm));
if v>0.5
v=0.5;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 进入循环项:若u和uu相应元素的差的最大值大于预设阈值e,则进入循环
% 将新算出的结果赋给就变量,重新计算相应的关系矩阵uu和聚类中心和区间矩阵,直到循环条件不被满足,跳出循环。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while max(max(abs(u-uu)))>e
u=uu;
C=CC;
L=LL;
for j=1:n %第三部分
d=ones(1,k);
for i=1:k
d(i)=1/(((1-v)^2*dddddc(x(j,:),[C(i,:),L(i,:)])^2+v^2*dddddl(x(j,:),[C(i,:),L(i,:)])^2)^(1/(mm-1)));
end
for i=1:k
uu(i,j)=1/((((1-v)^2*dddddc(x(j,:),[C(i,:),L(i,:)])^2+v^2*dddddl(x(j,:),[C(i,:),L(i,:)])^2)^(1/(mm-1)))*sum(d));
end
end
for i=1:k %第四部分
CC(i,:)=0;
LL(i,:)=0;
for j=1:n
CC(i,:)=uu(i,j)^mm*c(j,:)+CC(i,:);
LL(i,:)=uu(i,j)^mm*l(j,:)+LL(i,:);
end
CC(i,:)=CC(i,:)/(sum(uu(i,:).^mm));
LL(i,:)=LL(i,:)/(sum(uu(i,:).^mm));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算v根据论文要求,若v大于0.5,则将其值修正为0.5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fz=ones(k,n);
for i=1:k
for j=1:n
fz(i,j)=dddddc(x(j,:),[CC(i,:),LL(i,:)])^2;
end
end
fm=ones(k,n);
for i=1:k
for j=1:n
fm(i,j)=dddddc(x(j,:),[CC(i,:),LL(i,:)])^2+dddddl(x(j,:),[CC(i,:),LL(i,:)])^2;
end
end
v=sum(sum((uu.^mm).*fz))/sum(sum((uu.^mm).*fm));
if v>0.5
v=0.5;
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 + -