文档库 最新最全的文档下载
当前位置:文档库 › 模糊数学在聚类分析中的作用(matlab代码)[1]

模糊数学在聚类分析中的作用(matlab代码)[1]

模糊数学在聚类分析中的作用(matlab代码)[1]
模糊数学在聚类分析中的作用(matlab代码)[1]

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);

end

end

end

%%

function[R]=F_JlR(cs,X)%定义函数

%模糊聚类分析建立模糊相似矩阵: [R]=F_JlR(cs,X)

%X,数据矩阵

%cs=1,数量积法

%cs=2,夹角余弦法

%cs=3,相关系数法

%cs=4,指数相似系数法

%cs=5,最大最小法

%cs=6,算术平均最小法

%cs=7,几何平均最小法

%cs=8,一般欧式距离法

%cs=9,一般海明距离法

%cs=10,一般切比雪夫距离法

%cs=11,倒数欧式距离法

%cs=12,倒数海明距离法

%cs=13,倒数切比雪夫距离法

%cs=14,指数欧式距离法

%cs=15,指数海明距离法

%cs=16,指数切比雪夫距离法

[n,m]=size(X);%获得矩阵的行列数

R=[];

if(cs==1)maxM=0;pd=0;%数量积法

for(i=1:n)for(j=1:n)if(j~=i)x=0;

for(k=1:m)x=x+X(i,k)*X(j,k);end

if(maxM

end;end;end

if(maxM<0.000001)return;end

for(i=1:n)for(j=1:n)

if(i==j)R(i,j)=1;

else R(i,j)=0;

for(k=1:m)R(i,j)=R(i,j)+X(i,k)*X(j,k);end

R(i,j)=R(i,j)/maxM;

if(R(i,j)<0)pd=1;end

end

end;end

if(pd)for(i=1:n)for(j=1:n)R(i,j)=(R(i,j)+1)/2;end;end;end elseif(cs==2)%夹角余弦法

for(i=1:n)for(j=1:n)xi=0;xj=0;

for(k=1:m)xi=xi+X(i,k)^2;xj=xj+X(j,k)^2;end

s=sqrt(xi*xj);R(i,j)=0;

for(k=1:m)R(i,j)=R(i,j)+X(i,k)*X(j,k);end

R(i,j)=R(i,j)/s;

end;end

elseif(cs==3)%相关系数法

for(i=1:n)for(j=1:n)xi=0;xj=0;

for(k=1:m)xi=xi+X(i,k);xj=xj+X(j,k);end

xi=xi/m;xj=xj/m;xis=0;xjs=0;

for(k=1:m)xis=xis+(X(i,k)-xi)^2;xjs=xjs+(X(j,k)-xj)^2;end

s=sqrt(xis*xjs);R(i,j)=0;

for(k=1:m)R(i,j)=R(i,j)+abs((X(i,k)-xi)*(X(j,k)-xj));end

R(i,j)=R(i,j)/s;

end;end

elseif(cs==4)%指数相似系数法

for(i=1:n)for(j=1:n)R(i,j)=0;

for(k=1:m)xk=0;

for(z=1:n)xk=xk+X(z,k);end

xk=xk/n;sk=0;

for(z=1:n)sk=sk+(X(z,k)-xk)^2;end

sk=sk/n;R(i,j)=R(i,j)+exp(-0.75*((X(i,k)-X(j,k))/sk)^2);

end

R(i,j)=R(i,j)/m;

end;end

elseif(cs<=7)%最大最小法算术平均最小法几何平均最小法

for(i=1:n)for(j=1:n)fz=0;fm=0;

for(k=1:m)

if(X(j,k)<0)R=[];return;end

if(X(j,k)>X(i,k))x=X(i,k);

else x=X(j,k);end

fz=fz+x;

end

if(cs==5)%最大最小法

for(k=1:m)if(X(i,k)>X(j,k))x=X(i,k);else x=X(j,k);end

fm=fm+x;end

elseif(cs==6)for(k=1:m)fm=fm+(X(i,k)+X(j,k))/2;end%算术平均最小法

else for(k=1:m)fm=fm+sqrt(X(i,k)*X(j,k));end;end%几何平均最小法

R(i,j)=fz/fm;

end;end

elseif(cs<=10)C=0;%一般距离法

for(i=1:n)for(j=i+1:n)d=0;

if(cs==8)for(k=1:m)d=d+(X(i,k)-X(j,k))^2;end

d=sqrt(d);%欧式距离

elseif(cs==9)for(k=1:m)d=d+abs(X(i,k)-X(j,k));end%海明距离

else for(k=1:m)if(d

if(C

end;end

C=1/(1+C);

for(i=1:n)for(j=1:n)d=0;

if(cs==8)for(k=1:m)d=d+(X(i,k)-X(j,k))^2;end

d=sqrt(d);%欧式距离

elseif(cs==9)for(k=1:m)d=d+abs(X(i,k)-X(j,k));end%海明距离

else for(k=1:m)if(d

R(i,j)=1-C*d;

end;end

elseif(cs<=13)minM=Inf;%倒数距离法

for(i=1:n)for(j=i+1:n)d=0;

if(cs==11)for(k=1:m)d=d+(X(i,k)-X(j,k))^2;end

d=sqrt(d);%欧式距离

elseif(cs==12)for(k=1:m)d=d+abs(X(i,k)-X(j,k));end%海明距离

else for(k=1:m)if(d

if(minM>d)minM=d;end

end;end

minM=0.9999*minM;

if(minM<0.000001)return;end

for(i=1:n)for(j=1:n)d=0;

if(j==i)R(i,j)=1;continue;end

if(cs==11)for(k=1:m)d=d+(X(i,k)-X(j,k))^2;end

d=sqrt(d);%欧式距离

elseif(cs==12)for(k=1:m)d=d+abs(X(i,k)-X(j,k));end%海明距离

else for(k=1:m)if(d

R(i,j)=minM/d;

end;end

else for(i=1:n)for(j=1:n)d=0;%指数距离法

if(cs==14)for(k=1:m)d=d+(X(i,k)-X(j,k))^2;end

d=sqrt(d);%欧式距离

elseif(cs==15)for(k=1:m)d=d+abs(X(i,k)-X(j,k));end%海明距离

else for(k=1:m)if(d

R(i,j)=exp(-d);

end;end;end

end

%%

function [A]=fuzzy_cdbb(R) %由模糊相似矩阵求传递闭包

js0=0;

while(1)

A=Max_Min(R,R);

js0=js0+1;

if(A==R)

break;

else

R=A;

end

end

end

%%

function[C]=Max_Min(A,B) %模糊矩阵的合成,先取小后取大

C=[];

[m,s1]=size(A);

[s2,n]=size(B);

if(s1~=s2)

disp('A的列不等于B的行');

else

for(i=1:m)

for(j=1:n)

C(i,j)=0;

for(k=1:s1)

x=0;

if(A(i,k)

x=A(i,k);

else

x=B(k,j);

end

if(C(i,j)

C(i,j)=x;

end

end

end

end

end

end

%%

function[Alamd]=fuzzy_lamdjjz(A) %求矩阵的lamd截矩阵并输出聚类结果[m,n]=size(A);

p=m*n;%矩阵A中总的元素个数

C=A(1:p);%把矩阵变成一个行向量

D=sort(C);%把向量C中的元素从小到大排序

for(i=1:p)

for(j=i+1:p)

if(D(i)==D(j))

D(j)=0;%把向量C中相同元素只保留一个其他的变为零

end

end

end

E=sort(D);%将D按从小到大进行排序

x=0;

for(i=1:p)

if(E(i)==0)

x=x+1;%统计E中零的个数

end

end

F=E(p:(-1):(x+1));%从E中挑出非零元素并按从大到小的顺序排列

s=length(F);

for(i=1:s)

disp('-------------------');

lamd=F(i)%顺次从F中从大到小取lamd

disp('所对应的截矩阵是');

Alamd=A>=F(i)%得到lamd截矩阵

[C]=fuzzy_jl(Alamd)%得到聚类结果

end

end

%%

function [C]=fuzzy_jl(A)%聚类结果

B=[];

[m1,n1]=size(A);

for(i=1:m1)

x=0;

for(j=1:n1)

if(A(i,j)==1)%找到每一行的元素1

x=x+1;

B(i,x)=j;%把每一行找到的元素1的列下标顺次储存在矩阵的每一行中end

end

end

B;

[m2,n2]=size(B);

for(i=1:m2)

for(j=2:n2)

if(B(i,j)~=0)

B(B(i,j),:)=0;%将相同行只保留一个其他变为零行

end

end

end

B;

C=[];

y=0;

for(i=1:m2)

if(sum(B(i,:))~=0)%找到非零行

y=y+1;

C(y,:)=B(i,:);%用非零行构成矩阵C,得到聚类结果

end

end

end

%%

matlab、lingo程序代码14-模糊聚类(聚类分析)

模糊聚类 function c=fuz_hc(a,b) %模糊矩阵的合成运算程序 %输入模糊矩阵a,b,输出合成运算结果c m=size(a,1);n=size(b,2);p=size(a,2); %错误排除 if size(a,2)~=size(b,1) disp('输入数据错误!');return; end %合成运算 for i=1:m for j=1:n for k=1:p temp(k)=min(a(i,k),b(k,j)); end c(i,j)=max(temp); end end disp('模糊矩阵a与b作合成运算后结果矩阵c为:'); c % 求模糊等价矩阵 function r_d=mhdj(r) [m,n]=size(r); for i=1:n for j=1:n for k=1:n r1(i,j,k)=min(r(i,k),r(k,j)); end r1max(i,j)=r1(i,j,1); end end for i=1:n for j=1:n for k=1:n

if r1(i,j,k)>r1max(i,j) r1max(i,j)=r1(i,j,k); end end r_d(i,j)=r1max(i,j); end end %模糊聚类程序 function f=mujl(x,lamda) %输入原始数据以及lamda的值 if lamda>1 disp('error!') %错误处理 end [n,m]=size(x); y=pdist(x); disp('欧式距离矩阵:'); dist=squareform(y) %欧氏距离矩阵 dmax=dist(1,1); for i=1:n for j=1:n if dist(i,j)>dmax dmax=dist(i,j); end end end disp('处理后的欧氏距离矩阵,其特点为每项元素均不超过1:'); sdist=dist/dmax %使距离值不超过1 disp('模糊关系矩阵:'); r=ones(n,n)-sdist %计算对应的模糊关系矩阵 t=mhdj(r); le=t-r; while all(all(le==0)==0)==1 %如果t与r相等,则继续求r乘以r r=t; t=mhdj(r); le=t-r;

聚类分析Matlab程序实现

2. Matlab程序 2.1 一次聚类法 X=[11978 12.5 93.5 31908;…;57500 67.6 238.0 15900]; T=clusterdata(X,0.9) 2.2 分步聚类 Step1 寻找变量之间的相似性 用pdist函数计算相似矩阵,有多种方法可以计算距离,进行计算之前最好先将数据用zscore 函数进行标准化。 X2=zscore(X); %标准化数据 Y2=pdist(X2); %计算距离 Step2 定义变量之间的连接 Z2=linkage(Y2); Step3 评价聚类信息 C2=cophenet(Z2,Y2); //0.94698 Step4 创建聚类,并作出谱系图 T=cluster(Z2,6); H=dendrogram(Z2); Matlab提供了两种方法进行聚类分析。 一种是利用 clusterdata函数对样本数据进行一次聚类,其缺点为可供用户选择的面较窄,不能更改距离的计算方法; 另一种是分步聚类:(1)找到数据集合中变量两两之间的相似性和非相似性,用pdist函数计算变量之间的距离;(2)用 linkage函数定义变量之间的连接;(3)用 cophenetic函数评价聚类信息;(4)用cluster函数创建聚类。 1.Matlab中相关函数介绍 1.1 pdist函数 调用格式:Y=pdist(X,’metric’) 说明:用‘metric’指定的方法计算 X 数据矩阵中对象之间的距离。’ X:一个m×n的矩阵,它是由m个对象组成的数据集,每个对象的大小为n。 metric’取值如下: ‘euclidean’:欧氏距离(默认);‘seuclidean’:标准化欧氏距离; ‘mahalanobis’:马氏距离;‘cityblock’:布洛克距离; ‘minkowski’:明可夫斯基距离;‘cosine’: ‘correlation’:‘hamming’: ‘jaccard’:‘chebychev’:Chebychev距离。 1.2 squareform函数 调用格式:Z=squareform(Y,..) 说明:强制将距离矩阵从上三角形式转化为方阵形式,或从方阵形式转化为上三角形式。 1.3 linkage函数 调用格式:Z=linkage(Y,’method’) 说明:用‘method’参数指定的算法计算系统聚类树。 Y:pdist函数返回的距离向量;

MATLAB实现FCM 聚类算法

本文在阐述聚类分析方法的基础上重点研究FCM 聚类算法。FCM 算法是一种基于划分的聚类算法,它的思想是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小。最后基于MATLAB实现了对图像信息的聚类。 第 1 章概述 聚类分析是数据挖掘的一项重要功能,而聚类算法是目前研究的核心,聚类分析就是使用聚类算法来发现有意义的聚类,即“物以类聚” 。虽然聚类也可起到分类的作用,但和大多数分类或预测不同。大多数分类方法都是演绎的,即人们事先确定某种事物分类的准则或各类别的标准,分类的过程就是比较分类的要素与各类别标准,然后将各要素划归于各类别中。确定事物的分类准则或各类别的标准或多或少带有主观色彩。 为获得基于划分聚类分析的全局最优结果,则需要穷举所有可能的对象划分,为此大多数应用采用的常用启发方法包括:k-均值算法,算法中的每一个聚类均用相应聚类中对象的均值来表示;k-medoid 算法,算法中的每一个聚类均用相应聚类中离聚类中心最近的对象来表示。这些启发聚类方法在分析中小规模数据集以发现圆形或球状聚类时工作得很好,但当分析处理大规模数据集或复杂数据类型时效果较差,需要对其进行扩展。 而模糊C均值(Fuzzy C-means, FCM)聚类方法,属于基于目标函数的模糊聚类算法的范畴。模糊C均值聚类方法是基于目标函数的模糊聚类算法理论中最为完善、应用最为广泛的一种算法。模糊c均值算法最早从硬聚类目标函数的优化中导出的。为了借助目标函数法求解聚类问题,人们利用均方逼近理论构造了带约束的非线性规划函数,以此来求解聚类问题,从此类内平方误差和WGSS(Within-Groups Sum of Squared Error)成为聚类目标函数的普遍形式。随着模糊划分概念的提出,Dunn [10] 首先将其推广到加权WGSS 函数,后来由Bezdek 扩展到加权WGSS 的无限族,形成了FCM 聚类算法的通用聚类准则。从此这类模糊聚类蓬勃发展起来,目前已经形成庞大的体系。 第 2 章聚类分析方法 2-1 聚类分析 聚类分析就是根据对象的相似性将其分群,聚类是一种无监督学习方法,它不需要先验的分类知识就能发现数据下的隐藏结构。它的目标是要对一个给定的数据集进行划分,这种划分应满足以下两个特性:①类内相似性:属于同一类的数据应尽可能相似。②类间相异性:属于不同类的数据应尽可能相异。图2.1是一个简单聚类分析的例子。

模糊聚类分析

目录 1引言: (3) 2 理论准备: (3) 2.1 模糊集合理论 (3) 2.2模糊C均值聚类(FCM) (4) 2.3 加权模糊C均值聚类(WFCM) (4) 3 聚类分析实例 (5) 3.1数据准备 (5) 3.1.1数据表示 (5) 3.1.2数据预处理 (5) 3.1.3 确定聚类个数 (6) 3.2 借助clementine软件进行K-means聚类 (7) 3.2.1 样本在各类中集中程度 (8) 3.2.2 原始数据的分类结果 (8) 3.2.3结果分析 (9) 3.3模糊C均值聚类 (10) 3.3.1 数据集的模糊C划分 (10) 3.3.2 模糊C均值聚类的目标函数求解方法 (10) 3.3.3 MATLAB软件辅助求解参数设置 (11) 3.3.4符号表示 (11)

3.3.5代码实现过程 (11) 3.3.6 FCM聚类分析 (11) 3.4 WFCM算法 (14) 3.4.1 WFCM聚类结果展示 (14) 3.4.2样本归类 (16) 3.4.3归类代码实现 (16) 4.结论 (17) 5 参考文献 (18) 6 附录 (18)

模糊聚类与非模糊聚类比较分析 摘要: 聚类分析是根据样本间的相似度实现对样本的划分,属于无监督分类。传统的聚类分析是研究“非此即彼”的分类问题,分类结果样本属于哪一类很明确,而很多实际的分类问题常伴有模糊性,即它不仅仅是属于一个特定的类,而是“既此又彼”。因此为了探究模糊聚类与非模糊聚类之间聚类结果的差别,本文首先采用系统聚类方法对上市公司132支股票数据进行聚类,确定比较合理的聚类数目为11类,然后分别采用K-means聚类与模糊聚类方法对股票数据进行聚类分析,最终得出模糊聚类在本案例中比K-means聚类更符合实际。 关键字:模糊集合,K-means聚类,FCM聚类,WFCM聚类 1引言: 聚类分析是多元统计分析的方法之一,属于无监督分类,是根据样本集的内在结构,按照样本之间相似度进行划分,使得同类样本之间相似性尽可能大,不同类样本之间差异性尽可能大。传统的聚类分析属于硬化分,研究对象的性质是非此即彼的,然而,现实生活中大多数事物具有亦此亦彼的性质。因此传统的聚类分析方法往往不能很好的解决具有模糊性的聚类问题。为此,模糊集合理论开始被应用到分类领域,并取得不错成果。 本文的研究目的是通过对比传统聚类和模糊聚类的聚类结果,找出二者之间的不同之处,并说明两种聚类分析方法在实例中应用的优缺点。 2理论准备: 2.1 模糊集合理论 模糊集合定义:设U为论域,则称由如下实值函数μA:U→ [ 0,1 ],u →μ ( u )所确定的集合A 为U上的模糊集合,而称μA为模糊集合A 的隶A 属函数,μ A ( u)称为元素u 对于A 的隶属度。若μA(u) =1,则认为u完全属于A;若μA(u) =0,则认为u完全不属于A,模糊集合是经典集合的推广。

数学实验05聚类分析---用matlab做聚类分析

用matlab做聚类分析 Matlab提供了两种方法进行聚类分析。 一种是利用clusterdata函数对样本数据进行一次聚类,其缺点为可供用户选择的面较窄,不能更改距离的计算方法; 另一种是分步聚类:(1)找到数据集合中变量两两之间的相似性和非相似性,用pdist函数计算变量之间的距离;(2)用linkage函数定义变量之间的连接;(3)用cophenetic函数评价聚类信息;(4)用cluster函数创建聚类。1.Matlab中相关函数介绍 1.1pdist函数 调用格式:Y=pdist(X,’metric’) 说明:用‘metric’指定的方法计算X数据矩阵中对象之间的距离。’X:一个m×n的矩阵,它是由m个对象组成的数据集,每个对象的大小为n。 metric’取值如下: ‘euclidean’:欧氏距离(默认);‘seuclidean’:标准化欧氏距离; ‘mahalanobis’:马氏距离;‘cityblock’:布洛克距离; ‘minkowski’:明可夫斯基距离;‘cosine’: ‘correlation’:‘hamming’: ‘jaccard’:‘chebychev’:Chebychev距离。 1.2squareform函数 调用格式:Z=squareform(Y,..)

说明:强制将距离矩阵从上三角形式转化为方阵形式,或从方阵形式转化为上三角形式。 1.3linkage函数 调用格式:Z=linkage(Y,’method’) 说明:用‘method’参数指定的算法计算系统聚类树。 Y:pdist函数返回的距离向量; method:可取值如下: ‘single’:最短距离法(默认);‘complete’:最长距离法; ‘average’:未加权平均距离法;‘weighted’:加权平均法; ‘centroid’:质心距离法;‘median’:加权质心距离法; ‘ward’:内平方距离法(最小方差算法) 返回:Z为一个包含聚类树信息的(m-1)×3的矩阵。 1.4dendrogram函数 调用格式:[H,T,…]=dendrogram(Z,p,…) 说明:生成只有顶部p个节点的冰柱图(谱系图)。 1.5cophenet函数 调用格式:c=cophenetic(Z,Y) 说明:利用pdist函数生成的Y和linkage函数生成的Z计算cophenet相关系数。 1.6cluster函数 调用格式:T=cluster(Z,…) 说明:根据linkage函数的输出Z创建分类。

模糊聚类分析报告例子

1. 模糊聚类分析模型 环境区域的污染情况由污染物在4个要素中的含量超标程度来衡量。设这5个环境区域的污染数据为1x =(80, 10, 6, 2), 2x =(50, 1, 6, 4), 3x =(90, 6, 4, 6), 4x =(40, 5, 7, 3), 5x =(10, 1, 2, 4). 试用模糊传递闭包法对X 进行分类。 解 : 由题设知特性指标矩阵为: * 80106250164906464057310124X ????????=???????? 数据规格化:最大规格化' ij ij j x x M = 其中: 12max(,,...,)j j j nj M x x x = 00.8910.860.330.560.1 0.860.671 0.60.5710.440.510.50.11 0.1 0.290.67X ????????=?? ?????? 构造模糊相似矩阵: 采用最大最小法来构造模糊相似矩阵55()ij R r ?=, 1 0.540.620.630.240.5410.550.700.530.62 0.5510.560.370.630.700.5610.380.240.530.370.381R ?? ??? ???=?? ?????? 利用平方自合成方法求传递闭包t (R ) 依次计算248,,R R R , 由于84R R =,所以4()t R R =

2 10.630.620.630.530.6310.560.700.530.62 0.5610.620.530.630.700.6210.530.530.530.530.531R ?? ??????=?? ??????, 4 10.630.620.630.530.6310.620.700.530.62 0.6210.620.530.630.700.6210.530.53 0.530.530.531R ????????=?? ?????? =8R 选取适当的置信水平值[0,1]λ∈, 按λ截矩阵进行动态聚类。把()t R 中的元素从大到小的顺序编排如下: 1>0.70>0.63>062>053. 依次取λ=1, 0.70, 0.63, 062, 053,得 11 000001000()0 010******* 0001t R ????? ? ??=?? ??????,此时X 被分为5类:{1x },{2x },{3x },{4x },{5x } 0.7 1000001010()001000101000001t R ?????? ??=?? ??????,此时X 被分为4类:{1x },{2x ,4x },{3x },{5x } 0.63 1101011010()001001101000001t R ?????? ??=?? ??????,此时X 被分为3类:{1x ,2x ,4x },{3x },{5x } 0.62 1111011110()11110111100 0001t R ?????? ??=?? ?????? ,此时X 被分为2类:{1x ,2x ,4x ,3x },{5x }

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法: 1.层次聚类hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征对象之间差异的距离,例如最简单的平面上点的聚类中,最经常使用的就是欧几里得距离。 这在MATLAB中可以通过Y=pdist(X)实现,例如 >> X=randn(6,2) X = -0.4326 1.1892 -1.6656 -0.0376 0.1253 0.3273 0.2877 0.1746 -1.1465 -0.1867 1.1909 0.7258 >> plot(X(:,1),X(:,2),'bo') %给个图,将来对照聚类结果把 >> Y=pdist(X) Y = Columns 1 through 14 1.7394 1.0267 1.2442 1.5501 1.6883 1.8277 1.9648 0.5401 2.9568 0.2228 1.3717 1.1377 1.4790 1.0581 Column 15

2.5092 例子中X数据集可以看作包含6个平面数据点,pdist之后的Y是一个行向量,15个元素分别代表X 的第1点与2-6点、第2点与3-6点,......这样的距离。那么对于M个点的数据集X,pdist之后的Y 将是具有M*(M-1)/2个元素的行向量。Y这样的显示虽然节省了内存空间,但对用户来说不是很易懂,如果需要对这些距离进行特定操作的话,也不太好索引。MATLAB中可以用squareform把Y转换成方阵形式,方阵中位置的数值就是X中第i和第j点之间的距离,显然这个方阵应该是 个对角元素为0的对称阵。 >> squareform(Y) ans = 0 1.7394 1.0267 1.2442 1.5501 1.6883 1.7394 0 1.8277 1.9648 0.5401 2.9568 1.0267 1.8277 0 0.2228 1.3717 1.1377 1.2442 1.9648 0.2228 0 1.4790 1.0581 1.5501 0.5401 1.3717 1.4790 0 2.5092 1.6883 2.9568 1.1377 1.0581 2.5092 0 这里需要注意的是,pdist可以使用多种参数,指定不同的距离算法。help pdist把。 另外,当数据规模很大时,可以想象pdist产生的Y占用内存将是很吓人的,比如X有10k个数据点,那么X占10k*8*2Bytes=160K,这看起来不算啥,但是pdist后的Y会有10k*10k/2*8Bytes=400M 。怕了把,所以,废话说在前面,用MATLAB的层次聚类来处理大规模数据,大概是很不合适的。 (2) 确定好了对象间的差异度(距离)后,就可以用Z=linkage(Y)来产生层次聚类树了。 >> Z=linkage(Y) Z = 3.0000 4.0000 0.2228 2.0000 5.0000 0.5401 1.0000 7.0000 1.0267

matlab模糊聚类程序

3.数据标准化 (1) 数据矩阵 设论域12345678910,1112U={,,,,,,,,,,}x x x x x x x x x x x x 为被分类的对象,每个 对象又由指标123456789Y={,,,,,,,,}y y y y y y y y y 表示其性状即12345678910,1112x ={,,,,,,,,,,}i i i i i i i i i i i i i x x x x x x x x x x x x (i=1,2,…,12)于是得到原是数据矩阵 7 5 2 5 0 1 3 4 2 12 17 8 21 9 2 38 4 37 83 29 59 65 37 20 54 13 26 53 13 31 36 21 A= 23 12 18 14 178 69 112 78 104 36 94 31 47 23 25 36 11 12 11 24 6 16 101 32 53 52 86 52 41 38 94 28 6 7 8 8 2 0 3 29 169 51 58 72 49 30 48 37 146 327 91 126 92 89 69 79 29 49 93 27 54 64 24 17 23 11 49 18 7 9 5 1 2 18 3 8 ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? (2) 数据标准化 将模糊矩阵的每一个数据压缩到[0,1]上,采用平移.极差变换进行数据标准化 1i n 1i n 1i n A(i,k)-{A(i,k)}B(i,k)={A(i,k)}-{A(i,k)} min max min ≤≤≤≤≤≤ (k=1,2,…,m) 运用matlab 编程由函数F_jisjbzh.m 【见附录3.4】的标准化矩阵是 附录3.4 function [X]=F_JISjBzh(cs,X) %模糊聚类分析数据标准化变换 %X 原始数据矩阵;cs=0,不变换;cs=1,标准差变换 %cs=2,极差变换 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);

模糊数学在聚类分析中的作用(matlab代码)

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};

聚类分析matlab程序设计代码

function varargout = lljuleifenxi(varargin) % LLJULEIFENXI MATLAB code for lljuleifenxi.fig % LLJULEIFENXI, by itself, creates a new LLJULEIFENXI or raises the existing % singleton*. % % H = LLJULEIFENXI returns the handle to a new LLJULEIFENXI or the handle to % the existing singleton*. % % LLJULEIFENXI('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in LLJULEIFENXI.M with the given input arguments. % % LLJULEIFENXI('Property','Value',...) creates a new LLJULEIFENXI or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before lljuleifenxi_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to lljuleifenxi_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help lljuleifenxi % Last Modified by GUIDE v2.5 07-Jan-2015 18:18:25 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @lljuleifenxi_OpeningFcn, ... 'gui_OutputFcn', @lljuleifenxi_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before lljuleifenxi is made visible. function lljuleifenxi_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB

matlab实现Kmeans聚类算法

matlab实现Kmeans聚类算法 1.简介: Kmeans和应用于混合高斯模型的受限EM算法是一致的。高斯混合模型广泛用于数据挖掘、模式识别、机器学习、统计分析。Kmeans 的迭代步骤可以看成E步和M步,E:固定参数类别中心向量重新标记样本,M:固定均值只考虑(估计)了均值,而没有估计类别的方差,所以聚类的结构比较适合于特征协方差相等的类别。 Kmeans在某种程度也可以看成Meanshitf的特殊版本,Meanshift 是所以Meanshift可以用于寻找数据的多个模态(类别),利用的是梯度上升法。在06年的一篇CVPR文章上,证明了Meanshift方法是牛顿拉夫逊算法的变种。Kmeans和EM算法相似是指混合密度的形式已知(参数形式已知)情况下,利用迭代方法,在参数空间中搜索解。而Kmeans和Meanshift相似是指都是一种概率密度梯度估计的方法,不过是Kmean选用的是特殊的核函数(uniform kernel),而与混合概率密度形式是否已知无关,是一种梯度求解方式。 k-means是一种聚类算法,这种算法是依赖于点的邻域来决定哪些点应该分在点,也可以对高维的空间(3维,4维,等等)的点进行聚类,任意高维的空间都可以。 上图中的彩色部分是一些二维空间点。上图中已经把这些点分组了,并使用了不同的颜色对各组进行了标记。这就是聚类算法要做的事情。 这个算法的输入是: 1:点的数据(这里并不一定指的是坐标,其实可以说是向量)

2:K,聚类中心的个数(即要把这一堆数据分成几组) 所以,在处理之前,你先要决定将要把这一堆数据分成几组,即聚成几类。但并不是在所有情况下,你都事先就能知道需要把数据聚成几类的。意味着使用k-means就不能处理这种情况,下文中会有讲解。 把相应的输入数据,传入k-means算法后,当k-means算法运行完后,该算法的输出是: 1:标签(每一个点都有一个标签,因为最终任何一个点,总会被分到某个类,类的id号就是标签) 2:每个类的中心点。 标签,是表示某个点是被分到哪个类了。例如,在上图中,实际上有4中“标签”,每个“标签”使用不同的颜色来表示。所有黄色点我们可以用标签以看出,有3个类离的比较远,有两个类离得比较近,几乎要混合在一起了。 当然,数据集不一定是坐标,假如你要对彩色图像进行聚类,那么你的向量就可以是(b,g,r),如果使用的是hsv颜色空间,那还可以使用(h,s,v),当然肯定可以有不同的组合例如(b*b,g*r,r*b) ,(h*b,s*g,v*v)等等。 在本文中,初始的类的中心点是随机产生的。如上图的红色点所示,是本文随机产生的初始点。注意观察那两个离得比较近的类,它们几乎要混合在一起,看看算法是如何将它们分开的。 类的初始中心点是随机产生的。算法会不断迭代来矫正这些中心点,并最终得到比较靠5个中心点的距离,选出一个距离最小的(例如该点与第2个中心点的距离是5个距离中最小的),那么该点就归属于该类.上图是点的归类结果示意图. 经过步骤3后,每一个中心center(i)点都有它的”管辖范围”,由于这个中心点不一定是这个管辖范围的真正中心点,所以要重新计算中心点,计算的方法有很多种,最简单的一种是,直接计算该管辖范围内所有点的均值,做为心的中心点new_center(i). 如果重新计算的中心点new_center(i)与原来的中心点center(i)的距离大于一定的阈值(该阈值可以设定),那么认为算法尚未收敛,使用new_center(i)代替center(i)(如图,中心点从红色点

Matlab笔记-模糊聚类分析原理及实现

23. 模糊聚类分析原理及实现 聚类分析,就是用数学方法研究和处理所给定对象,按照事物间的相似性进行区分和分类的过程。 传统的聚类分析是一种硬划分,它把每个待识别的对象严格地划分到某个类中,具有非此即彼的性质,这种分类的类别界限是分明的。 随着模糊理论的建立,人们开始用模糊的方法来处理聚类问题,称为模糊聚类分析。由于模糊聚类得到了样本数与各个类别的不确定性程度,表达了样本类属的中介性,即建立起了样本对于类别的不确定性的描述,能更客观地反映现实世界。 本篇先介绍传统的两种(适合数据量较小情形,及理解模糊聚类原理):基于择近原则、模糊等价关系的模糊聚类方法。 (一)预备知识 一、模糊等价矩阵 定义1设R=(r ij )n ×n 为模糊矩阵,I 为n 阶单位矩阵,若R 满足 i) 自反性:I ≤R (等价于r ii =1); ii) 对称性:R T =R; 则称R 为模糊相似矩阵,若再满足 iii) 传递性:R 2 ≤R (等价于1 ()n ik kj ij k r r r =∨∧≤) 则称R 为模糊等价矩阵。

定理1设R 为n 阶模糊相似矩阵,则存在一个最小的自然数k (k

利用Matlab软件实现聚类分析范文

§8.利用Matlab和SPSS软件实现聚类分析 1. 用Matlab编程实现 运用Matlab中的一些基本矩阵计算方法,通过自己编程实现聚类算法,在此只讨论根据最短距离规则聚类的方法。 调用函数: min1.m——求矩阵最小值,返回最小值所在行和列以及值的大小 min2.m——比较两数大小,返回较小值 std1.m——用极差标准化法标准化矩阵 ds1.m——用绝对值距离法求距离矩阵 cluster.m——应用最短距离聚类法进行聚类分析 print1.m——调用各子函数,显示聚类结果 聚类分析算法 假设距离矩阵为vector, a阶,矩阵中最大值为max,令矩阵上三角元素等于max 聚类次数=a-1,以下步骤作a-1次循环: 求改变后矩阵的阶数,计作c

求矩阵最小值,返回最小值所在行e和列f以及值的大小g for l=1:c,为vector(c+1,l)赋值,产生新类 令第c+1列元素,第e行和第f行所有元素为,第e列和第f列所有元素为max 源程序如下: %std1.m,用极差标准化法标准化矩阵 function std=std1(vector) max=max(vector); %对列求最大值 min=min(vector); [a,b]=size(vector); %矩阵大小,a为行数,b为列数 for i=1:a for j=1:b std(i,j)= (vector(i,j)-min(j))/(max(j)-min(j)); end end %ds1.m,用绝对值法求距离 function d=ds1(vector); [a,b]=size(vector); d=zeros(a); for i=1:a for j=1:a for k=1:b d(i,j)=d(i,j)+abs(vector(i,k)-vector(j,k)); end end end fprintf('绝对值距离矩阵如下:\n'); disp(d) %min1.m,求矩阵中最小值,并返回行列数及其值 function [v1,v2,v3]=min1(vector);%v1为行数,v2为列数,v3为其值 [v,v2]=min(min(vector')); [v,v1]=min(min(vector)); v3=min(min(vector));

FCMClust(模糊c均值聚类算法MATLAB实现)

function [center, U, obj_fcn] = FCMClust(data, cluster_n, options) % FCMClust.m 采用模糊C均值对数据集data聚为cluster_n类 % 用法: % 1. [center,U,obj_fcn] = FCMClust(Data,N_cluster,options); % 2. [center,U,obj_fcn] = FCMClust(Data,N_cluster); % 输入: % data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值 % N_cluster ---- 标量,表示聚合中心数目,即类别数 % options ---- 4x1矩阵,其中 % options(1): 隶属度矩阵U的指数,>1 (缺省值: 2.0) % options(2): 最大迭代次数(缺省值: 100) % options(3): 隶属度最小变化量,迭代终止条件(缺省值: 1e-5) % options(4): 每次迭代是否输出信息标志(缺省值: 1) % 输出: % center ---- 聚类中心 % U ---- 隶属度矩阵 % obj_fcn ---- 目标函数值 % Example: % data = rand(100,2); % [center,U,obj_fcn] = FCMClust(data,2); % plot(data(:,1), data(:,2),'o'); % hold on; % maxU = max(U); % index1 = find(U(1,:) == maxU); % index2 = find(U(2,:) == maxU); % line(data(index1,1),data(index1,2),'marker','*','color','g'); % line(data(index2,1),data(index2,2),'marker','*','color','r'); % plot([center([1 2],1)],[center([1 2],2)],'*','color','k') % hold off; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% if nargin ~= 2 & nargin ~= 3, %判断输入参数个数只能是2个或3个 error('Too many or too few input arguments!'); end data_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数 in_n = size(data, 2); % 求出data的第二维(columns)数,即特征值长度 % 默认操作参数 default_options = [2; % 隶属度矩阵U的指数 100; % 最大迭代次数 1e-5; % 隶属度最小变化量,迭代终止条件

MATLAB 层次聚类

MATLAB 层次聚类应用简述 MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法: 1.层次聚类hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。 层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征对象之间差异的距离,例如最简单的平面上点的聚类中,最经常使用的就是欧几里得距离。 这在MATLAB中可以通过Y=pdist(X)实现,例如 >> X=randn(6,2) X = -0.4326 1.1892 -1.6656 -0.0376 0.1253 0.3273 0.2877 0.1746 -1.1465 -0.1867 1.1909 0.7258 >> plot(X(:,1),X(:,2),'bo') %给个图,将来对照聚类结果把 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> Y=pdist(X) Y =

Columns 1 through 14 1.7394 1.0267 1.2442 1.5501 1.6883 1.8277 1.9648 0.5401 2.9568 0.2228 1.3717 1.1377 1.4790 1.0581 Column 15 2.5092 例子中X数据集可以看作包含6个平面数据点,pdist之后的Y是一个行向量,15个元素分别代表X 的第1点与2-6点、第2点与3-6点,......这样的距离。那么对于M个点的数据集X,pdist之后的Y 将是具有M*(M-1)/2个元素的行向量。Y这样的显示虽然节省了内存空间,但对用户来说不是很易 懂,如果需要对这些距离进行特定操作的话,也不太好索引。MATLAB中可以用squareform把Y转 换成方阵形式,方阵中位置的数值就是X中第i和第j点之间的距离,显然这个方阵应该是 个对角元素为0的对称阵。 >> squareform(Y) ans = 0 1.7394 1.0267 1.2442 1.5501 1.6883 1.7394 0 1.8277 1.9648 0.5401 2.9568 1.0267 1.8277 0 0.2228 1.3717 1.1377 1.2442 1.9648 0.2228 0 1.4790 1.0581 1.5501 0.5401 1.3717 1.4790 0 2.5092 1.6883 2.9568 1.1377 1.0581 2.5092 0 这里需要注意的是,pdist可以使用多种参数,指定不同的距离算法。help pdist把。 另外,当数据规模很大时,可以想象pdist产生的Y占用内存将是很吓人的,比如X有10k个数据点 ,那么X占10k*8*2Bytes=160K,这看起来不算啥,但是pdist后的Y会有10k*10k/2*8Bytes=400M 。怕了把,所以,废话说在前面,用MATLAB的层次聚类来处理大规模数据,大概是很不合适的。 (2) 确定好了对象间的差异度(距离)后,就可以用Z=linkage(Y)来产生层次聚类树了。 >> Z=linkage(Y) %Z=linkage(Y,’method’)说明:用‘method’参数指定的算法计算系统聚类树。 Z = 3.0000 4.0000 0.2228 2.0000 5.0000 0.5401 1.0000 7.0000 1.0267 6.0000 9.0000 1.0581 8.0000 10.0000 1.3717 对于M个元素的X,前面说了Y是1行M*(M-1)/2的行向量,Z则是(M-1)*3的矩阵。 Z数组的前两列是索引下标列,最后一列是距离列。例如上例中表示在产生聚类树的计算过程中

相关文档
相关文档 最新文档