数模学习(7):聚类分析(老哥)

一、什么是聚类分析

聚类是一个将数据集划分为若干组(class)或类(cluster)的的过程,并使得同一个组内的数据对象具有较高的相识度;而不同组中的数据对象是不相似的。

1、相似或不相似是基于数据描述属性的取值来确定的,通常利用各数据对象间的距离来表示。
2、剧烈分析尤其是和用来探讨样本间的相互关联关系从而对一个样本结构做一个初步的评价。

聚类与分类的区别

1)聚类是一种无监督的学习方法。其不依赖于事先确定的数据类别,以及标有数据类别的学习训练样本集合。
2)聚类是观察式学习,不是示例式学习。

什么是好的聚类

聚类结果质量依靠所使 用度量的相似性和它的执行。
好的聚类方法产生以下的高聚类:
1)最大化类内的相似性
2)最小化类间的相似性

两种聚类分析

一种是对样品的分类————Q类
一种是对变量(指标)的分类——R型~常用的统计量是距离

二、样品间的相似度量——距离

常用距离定义

在这里插入图片描述

几种距离

在这里插入图片描述
在这里插入图片描述

✨实战例题

请添加图片描述

✍MATLAB代码

 a=[7.9 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.2 8.14 16.17 9.42 1.55 9.76
9.16 27.98 9.01 9.32 15.99 9.1 1.82 11.35
10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81];
d1=pdist(a);				% 此时计算出各行之间的欧氏距离,
D= squareform(d1)			% 注意此时d1必须是一个行向量,结果是实对称矩阵
S=tril(squareform (d1))		% 得到书中的三角阵

同理:
d2=pdist(a,'cityblock');	% 此时计算出各行之间的绝对距离,
S2=tril(squareform(d2))

d3=pdist(a,'minkowski',3);	% 此时计算出各行之间的明氏距离,
S3=tril(squareform(d3))

结果如下

d1 =

   11.6726   13.8054   13.1278   12.7983   24.6353   24.0591   23.5389    2.2033    3.5037    2.2159

D =

         0   11.6726   13.8054   13.1278   12.7983
   11.6726         0   24.6353   24.0591   23.5389
   13.8054   24.6353         0    2.2033    3.5037
   13.1278   24.0591    2.2033         0    2.2159
   12.7983   23.5389    3.5037    2.2159         0

S =

         0         0         0         0         0
   11.6726         0         0         0         0
   13.8054   24.6353         0         0         0
   13.1278   24.0591    2.2033         0         0
   12.7983   23.5389    3.5037    2.2159         0

d2 =

   19.8900   27.2000   24.5800   26.5200   47.0500   43.3900   42.3100    4.6600    8.0800    5.3800

S2 =

         0         0         0         0         0
   19.8900         0         0         0         0
   27.2000   47.0500         0         0         0
   24.5800   43.3900    4.6600         0         0
   26.5200   42.3100    8.0800    5.3800         0

d3 =

   10.8098   12.2808   12.0241   11.4086   22.7511   22.6032   21.9971    1.8440    2.8187    1.7515

S3 =

         0         0         0         0         0
   10.8098         0         0         0         0
   12.2808   22.7511         0         0         0
   12.0241   22.6032    1.8440         0         0
   11.4086   21.9971    2.8187    1.7515         0

三、变量间的相似度量——相似系数

请添加图片描述

①夹角余弦

在这里插入图片描述

②相关系数

在这里插入图片描述

✨实战例题

请添加图片描述

✍MATLAB代码

 R=corrcoef(a);		%指标之间的相关系数
 a1=normc(a);		%将a的各列转化为单位向量
 J=a1'*a1			%计算a中各列之间的夹角余弦

结果如下

R =

    1.0000   -0.8946   -0.1555   -0.8466   -0.9320   -0.8810   -0.7005   -0.8989
   -0.8946    1.0000    0.5475    0.9103    0.9246    0.9730    0.9210    0.9572
   -0.1555    0.5475    1.0000    0.4758    0.2748    0.5145    0.8134    0.5404
   -0.8466    0.9103    0.4758    1.0000    0.9500    0.7955    0.8526    0.9545
   -0.9320    0.9246    0.2748    0.9500    1.0000    0.8456    0.7534    0.9096
   -0.8810    0.9730    0.5145    0.7955    0.8456    1.0000    0.8826    0.9006
   -0.7005    0.9210    0.8134    0.8526    0.7534    0.8826    1.0000    0.9231
   -0.8989    0.9572    0.5404    0.9545    0.9096    0.9006    0.9231    1.0000

a1 =

    0.3974    0.4932    0.3959    0.5290    0.4941    0.4601    0.4422    0.4890
    0.3863    0.6247    0.5292    0.5437    0.4936    0.6074    0.5961    0.5471
    0.4738    0.3464    0.3823    0.3327    0.4146    0.3922    0.3360    0.3591
    0.4608    0.3470    0.4201    0.3810    0.4100    0.3789    0.3945    0.4176
    0.5060    0.3552    0.4905    0.4108    0.4149    0.3493    0.4249    0.3977

J =

    1.0000    0.9410    0.9847    0.9613    0.9824    0.9546    0.9620    0.9695
    0.9410    1.0000    0.9782    0.9939    0.9853    0.9977    0.9947    0.9935
    0.9847    0.9782    1.0000    0.9859    0.9911    0.9840    0.9931    0.9909
    0.9613    0.9939    0.9859    1.0000    0.9944    0.9919    0.9947    0.9981
    0.9824    0.9853    0.9911    0.9944    1.0000    0.9901    0.9901    0.9968
    0.9546    0.9977    0.9840    0.9919    0.9901    1.0000    0.9952    0.9953
    0.9620    0.9947    0.9931    0.9947    0.9901    0.9952    1.0000    0.9968
    0.9695    0.9935    0.9909    0.9981    0.9968    0.9953    0.9968    1.0000

四、类间距离

在这里插入图片描述
请添加图片描述
在这里插入图片描述
请添加图片描述

谱系聚类法

步骤👇

在这里插入图片描述

✍MATLAB实现

  1. 输入数据矩阵,注意行与列的实际意义
  2. 计算各样品间的距离
  3. 选择不同的类间距离进行聚类
    请添加图片描述
  4. 做出谱系聚类图 H=dendrogram( z , d ) %注意若样本少于30,可以省去d,否则必须填写
  5. 根据分类数目,输出聚类结果
    T=cluster( z , k ) %注意k是分类数目
    Find( T == k0 ) %找出属于第k0类的样品编号

✨实战例题

在这里插入图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述

✍MATLAB代码:

五种类间距离聚类
z1=linkage(d1);
z2=linkage(d1,'complete');
z3=linkage(d1,'average');
z4=linkage(d1,'centroid');
z4=linkage(d1,'ward');

结果如下👇

z1 =

    3.0000    4.0000    2.2033		%2.2033的水平,G3、G4合成一类为G6
    5.0000    6.0000    2.2159		%2.2159的水平,G5、G6合成一类为G6
    1.0000    2.0000   11.6726		%11.6726的水平,G1、G2合成一类为G6
    7.0000    8.0000   12.7983		%12.7983的水平,G7、G8合成一类为G6

z2 =

    3.0000    4.0000    2.2033
    5.0000    6.0000    3.5037
    1.0000    2.0000   11.6726
    7.0000    8.0000   24.6353

z3 =

    3.0000    4.0000    2.2033
    5.0000    6.0000    2.8598
    1.0000    2.0000   11.6726
    7.0000    8.0000   18.6608

z4 =

    3.0000    4.0000    2.2033
    5.0000    6.0000    3.1367
    1.0000    2.0000   11.6726
    7.0000    8.0000   28.6180

做谱系聚类图

H=dendrogram(z1)

得到下图👇
请添加图片描述
输出分类结果

T=cluster(z1,3)

也就是说,若分成3类:辽宁分为1类,浙江分为1类,河南甘肃青海分为1类。

K-平均聚类算法

K-means算法以K为参数,把n个对象分为k个簇,以使簇内对象具有较高的相似度,而簇间的相似度较低。
【相似度的计算根据一个簇中对象的平均值(被看做簇的重心)来进行。】

输入:聚类个数k,以及包含n个数据对象的数据库
输出:满足方差最小标准的k个聚类

处理流程请添加图片描述

特点

请添加图片描述

✍MATLAB代码演示

>> x=[0 1 0 1 2 1 2 3 6 7 8 6 7 8 9 7 8 9 8 9;0 0 1 1 1 2 2 2 6 6 6 7 7 7 7 8 8 8 9 9];
figure(1)
plot(x(1,:),x(2,:),'r*')    %横轴为第一行所有列,纵轴为第二行所有列,红色星号表示
%%第一步选取聚类中心,即令k=2
Z1=[x(1,1);x(2,1)];
Z2=[x(1,2);x(2,2)];      %聚类中心为z1(0,0),z2(0,1)
R1=[];
R2=[];            %分为两个聚类,用于存储成员
t=1;
K=1;%记录迭代的次数
dif1=inf;         %inf为正无穷
dif2=inf;
%%第二步计算各点与聚类中心的距离
%(inf表示最大值,eps表示最小值)只要两次聚类中心不等构成无限循环
while(dif1>eps&dif2>eps)
for i=1:20
dist1=sqrt((x(1,i)-Z1(1)).^2+(x(2,i)-Z1(2)).^2);
dist2=sqrt((x(1,i)-Z2(1)).^2+(x(2,i)-Z2(2)).^2);
temp=[x(1,i),x(2,i)]';
if dist1<dist2
R1=[R1,temp];
else
R2=[R2,temp];
end
end
Z11=mean(R1,2);     %mean(A,2)包含每一行的平均值的列向量(对行求平均值)
Z22=mean(R2,2);     %得到新的聚类中心
t1=Z1-Z11;          %测试两次是不是相等,可以有多种方法这里只简单列举一种
t2=Z2-Z22;
dif1=sqrt(dot(t1,t1));   %dot两个向量的点积
dif2=sqrt(dot(t2,t2));
Z1=Z11;
Z2=Z22;
K=K+1;
R1=[];
R2=[];
end
hold on
plot([Z1(1),Z2(1)],[Z1(2),Z2(2)],'g+')     %最终得到的聚类中心用绿色加号

结果如下👇
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChristianLuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值