模糊数学在聚类分析中的作用(matlab代码)[1]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [M,N] = Example8_11
X=[1.8 2.1 3.2 2.2 2.5 2.8 1.9 2.0;
95 99 101 103 98 102 120 130;
0.15 0.21 0.18 0.17 0.16 0.20 0.09 0.11]; X=X'
%X=[80 10 6 2;50 1 6 4;90 6 4 6;40 5 7 3;10 1 2 4]
[M,N]=fuzzy_jlfx(4,5,X);
end
%%
function [M,N]=fuzzy_jlfx(bzh,fa,X)%得到聚类结果
[X]=F_JlSjBzh(bzh,X);%数据标准化
[R]=F_JlR(fa,X);%建立相似矩阵
[A]=fuzzy_cdbb(R);%得到传递闭包矩阵
[Alamd]=fuzzy_lamdjjz(A);%得到lamdf截矩阵从而得到聚类结果[M,N]=F_JlDtjl(R);%动态聚类并画出聚类图
%%
function [M,N]=F_JlDtjl(R)
%clc;
[A]=fuzzy_cdbb(R);
U=unique(A);
L=length(U);
M=1:L;
for i=L-1:-1:1
[m,n]=find(A==U(i));
N{i,1}=n;
N{i,2}=m;
A(m(1),:)=0;
mm=unique(m);
N{i,3}=mm;
len=length(find(m==mm(1)));
depth=length(find(m==mm(2)));
index1=find(M==mm(1));
MM=[M(1:index1-1),M(index1+depth:L)]; %
index2=find(MM==mm(2));
M=M(index1:index1+depth-1);
M=[MM(1:index2-1),M,MM(index2:end)];
end
M=[1:L;M;ones(1,L)];
h=(max(U)-min(U))/L;
figure
text(L,1,sprintf('%d',M(2,L)));
text(L+1,1-h,sprintf('%d',L));
text(0,1,sprintf('%3.2f',1));
text(0,(1+min(U))/2,sprintf('%3.2f',(1+min(U))/2));
text(0,min(U),sprintf('%3.2f',min(U)));
hold on
for i=L-1:-1:1
m=N{i,2};
n=N{i,1};
mm=N{i,3};
k=find(M(2,:)==mm(1));
l=find(M(2,:)==mm(2));
x1=M(1,k);
y1=M(3,k);
x2=M(1,l);
y2=M(3,l);
x=[x1,x1,x2,x2];
M(3,[k,l])=U(i);
M(1,[k,l])=sum(M(1,[k,l]))/length(M(1,[k,l]));
y=[y1,U(i),U(i),y2];
plot(x,y);
text(i,1,sprintf('%d',M(2,i)));
text(M(1,k(1)),U(i)+h*0.1,sprintf('%3.2f',U(i)));
text(L+1,1-i*h-h,sprintf('%d',L-i));
end
axis([0 L+1 min(U) max(U)])
axis off
hold off
end
end
%%
function[X]=F_JlSjBzh(cs,X)%定义函数
%模糊聚类分析数据标准化变换: [X]=F_JlSjBzh(cs,X)
%X,数据矩阵
%cs=0,不变换;cs=1,标准差变换;cs=2,极差变换;cs=其它,最大值规格化if(cs==0)return;end
[n,m]=size(X);%获得矩阵的行列数
if(cs==1)%平移?标准差变换
for(k=1:m)xk=0;
for(i=1:n)xk=xk+X(i,k);end
xk=xk/n;sk=0;
for(i=1:n)sk=sk+(X(i,k)-xk)^2;end
sk=sqrt(sk/n);
for(i=1:n)X(i,k)=(X(i,k)-xk)/sk;end
end
elseif(cs==2)%平移?极差变换
for(k=1:m)xmin=X(1,k);xmax=X(1,k);
for(i=1:n)
if(xmin>X(i,k))xmin=X(i,k);end
if(xmax end for(i=1:n)X(i,k)=(X(i,k)-xmin)/(xmax-xmin);end end else%最大值规格化 A=max(X); for(i=1:m) X(:,i)=X(:,i)/A(i);