视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
利用Matlab软件实现聚类分析
2025-10-03 14:41:51 责编:小OO
文档
§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));

%min2.m,比较两数大小,返回较小的值

function v1=min(v2,v3);

if v2>v3

    v1=v3;

else

   v1=v2;

end

%cluster.m,最短距离聚类法

function result=cluster(vector);

[a,b]=size(vector);

max=max(max(vector));

 for i=1:a

         for j=i:b

          vector(i,j)=max;

         end

 end;

for k=1:(b-1)

    [c,d]=size(vector);

    fprintf('第%g次聚类:\\n',k);

    [e,f,g]=min1(vector);

    fprintf('最小值=%g,将第%g区和第%g区并为一类,记作G%g\\n\\n',g,e,f,c+1);

    for l=1:c

if l<=min2(e,f)

         vector(c+1,l)=min2(vector(e,l),vector(f,l));

        else

         vector(c+1,l)=min2(vector(l,e),vector(l,f));   

        end

    end;

     vector(1:c+1,c+1)=max;

     vector(1:c+1,e)=max;

     vector(1:c+1,f)=max;

     vector(e,1:c+1)=max;

     vector(f,1:c+1)=max;   

end

%print1,调用各子函数

function print=print1(filename,a,b); %a为地区个数,b为指标数

fid=fopen(filename,'r')

vector=fscanf(fid,'%g',[a b]);

fprintf('标准化结果如下:\\n')

v1=std1(vector)

v2=ds1(v1);

cluster(v2);

%输出结果

print1('fname',9,7)

2.直接调用Matlab函数实现

2.1调用函数

层次聚类法(Hierarchical Clustering)的计算步骤:

①计算n个样本两两间的距离{dij},记D

②构造n个类,每个类只包含一个样本;

③合并距离最近的两类为一新类;

④计算新类与当前各类的距离;若类的个数等于1,转到5);否则回3);

⑤画聚类图;

⑥决定类的个数和类;

Matlab软件对系统聚类法的实现(调用函数说明):

cluster                  从连接输出(linkage)中创建聚类

clusterdata              从数据集合(x)中创建聚类

dendrogram             画系统树状图

linkage                 连接数据集中的目标为二元群的层次树

pdist                   计算数据集合中两两元素间的距离(向量)

squareform             将距离的输出向量形式定格为矩阵形式

zscore                  对数据矩阵 X 进行标准化处理               

各种命令解释

⑴ T = clusterdata(X, cutoff)

其中X为数据矩阵,cutoff是创建聚类的临界值。即表示欲分成几类。

以上语句等价与以下几句命令:

   Y=pdist(X,’euclid’)

   Z=linkage(Y,’single’)

   T=cluster(Z,cutoff)

以上三组命令调用灵活,可以自由选择组合方法!

⑵ T = cluster(Z, cutoff)

从逐级聚类树中构造聚类,其中Z是由语句likage产生的(n-1)×3阶矩阵,cutoff是创建聚类的临界值。

⑶ Z = linkage(Y)           Z = linkage(Y, 'method') 

      

创建逐级聚类树,其中Y是由语句pdist产生的n(n-1)/2 阶向量,’method’表示用何方法,默认值是欧氏距离(single)。有’complete’——最长距离法;‘average’——类平均距离;‘centroid’——重心法 ;‘ward‘——递增平方和等。  

⑷ Y = pdist(X)         Y = pdist(X, 'metric')

     

计算数据集X中两两元素间的距离, ‘metric’表示使用特定的方法,有欧氏距离‘euclid’ 、标准欧氏距离‘SEuclid’ 、马氏距离‘mahal’、明可夫斯基距离‘Minkowski‘ 等。

⑸ H = dendrogram(Z)    H = dendrogram(Z, p)

由likage产生的数据矩阵z画聚类树状图。P是结点数,默认值是30。

2.2举例说明

设某地区有八个观测点的数据,样本距离矩阵如表1所示,根据最短距离法聚类分析。

%最短距离法系统聚类分析

X=[7.90 39.77 8.49 12.94 19.27 11.05 2.04 13.29;

    7.68 50.37 11.35 13.3 19.25 14.59 2.75 14.87;

    9.42 27.93 8.20 8.14 16.17 9.42 1.55 9.76;

    9.16 27.98 9.01 9.32 15.99 9.10 1.82 11.35;

    10.06 28. 10.52 10.05 16.18 8.39 1.96 10.81];

BX=zscore(X);  % 标准化数据矩阵

Y=pdist(X)    % 用欧氏距离计算两两之间的距离

D=squareform(Y)   % 欧氏距离矩阵

Z = linkage(Y)    % 最短距离法

T = cluster(Z,3)  等价于   { T=clusterdata(X,3) }

find(T==3)   % 第3类集合中的元素

[H,T]=dendrogram(Z)     % 画聚类图

聚类谱系图如图1所示:

图1 聚类谱系图下载本文

显示全文
专题