主要内容

聚类分析

这个例子展示了如何使用统计学和机器学习工具箱™中的聚类分析检查观察或对象的相似性和差异性。数据通常自然地分成观察的组(或簇),同一簇中的对象特征相似,而不同簇中的对象特征不同。

K-means和分层群集

统计和机器学习工具箱包括执行k -均值聚类和层次聚类的函数。

K-means聚类是一种分割方法,它将数据中的观察视为具有彼此位置和距离的对象。它将对象划分为K个互斥的集群,使得每个集群中的对象尽可能接近彼此,而与其他集群中的对象尽可能远离。每个簇都有其质心或中心点的特征。当然,聚类中使用的距离通常并不代表空间距离。

分层集群是一种通过创建集群树来研究数据分组的方法,可以同时在不同距离范围内进行分组。树不是像K-Means中那样的单个集群集,而是一个多级层次结构,其中一个级别的集群作为下一个更高级别的集群加入。这允许您决定在您的应用程序中最合适的集群规模或级别。

本例中使用的一些函数调用MATLAB®内置随机数生成函数。要复制本示例中显示的结果,您应该执行下面的命令,将随机数生成器设置为已知状态。如果不设置状态,结果可能会有细微的不同,例如,您可能会看到以不同顺序编号的集群。还可能产生次优集群解决方案(本示例讨论了次优解决方案,包括避免它们的方法)。万博 尤文图斯

rng (6,“旋风”

费舍尔的虹膜数据

在20世纪20年代,植物学家收集了150个鸢尾标本的萼片长度、萼片宽度、花瓣长度和花瓣宽度的测量数据,三个物种各50个。这些测量结果被称为费舍尔的虹膜数据集。

这个数据集中的每一个观察都来自一个已知的物种,所以已经有一个明显的方法来对数据进行分组。目前,我们将忽略物种信息,只使用原始测量值对数据进行聚类。当我们完成后,我们可以将得到的簇与实际的物种进行比较,看看这三种类型的虹膜是否具有不同的特征。

利用K-Means聚类对Fisher虹膜数据进行聚类

这个函数威彻斯使用迭代算法执行k-means群集,该迭代算法将对象分配给群集,使得从每个对象到其群集质心的距离之和最小值是最小的。用于Fisher的虹膜数据,它将根据萼片和花瓣测量找到虹膜标本中的自然分组。使用k-means群集,您必须指定要创建的群集数。

首先,加载数据并调用威彻斯将所需的簇数设置为2,并使用欧几里得距离的平方。为了了解最终的星团分离得有多好,可以制作一个剪影图。轮廓图显示了一个簇中的每个点与相邻簇中的点的距离。

负载渔民[cidx2, cmeans2] = kmeans(量2'dist'“sqeuclidean”);[silh2 h] =轮廓(cidx2量,“sqeuclidean”);

从剪影图中可以看出,两个簇中的大多数点的剪影值都很大,大于0.8,说明这些点与相邻簇很好地分离了。然而,每个星团也包含一些低轮廓值的点,表明它们与其他星团的点很近。

事实证明,这些数据中的第四测量,花瓣宽度与第三测量,花瓣长度高度相关,因此前三次测量的3-D图具有良好的数据表示,而无需诉诸四个维度。如果您为数据绘制数据,请为每个群集使用不同的符号威彻斯,你可以识别出带有小轮廓值的点,因为这些点与其他簇中的点很接近。

ptsymb = {“废话”“r ^”“医学博士”“去”'c +'};i = 1:2 clust =查找(cidx2 == i);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});持有结束plot3 (cmeans2 (: 1) cmeans2 (:, 2), cmeans2 (:, 3),“柯”);plot3 (cmeans2 (: 1) cmeans2 (:, 2), cmeans2 (:, 3),“kx”);持有离开包含(“花萼长度”);ylabel ('萼片宽度');Zlabel(“花瓣长度”);视图(-137年,10);网格

每个星团的质心都是用圆圈X绘制的。下聚类中的三个点(用三角形表示)与上聚类中的三个点(用正方形表示)非常接近。由于上面的星团是如此分散,这三个点更接近下面星团的质心,而不是上面星团的质心,即使这些点与它们自己星团中的大部分点之间有一个间隙。因为K-means聚类只考虑距离,而不考虑密度,所以会出现这种结果。

您可以增加群集的数量,以查看是否威彻斯可以在数据中找到进一步的分组结构。这一次,使用可选选项“显示”参数的名称-值对输出关于聚类算法中每个迭代的信息。

[cidx3, cmeans3] = kmeans(量3“显示”“通路”);
iter阶段num 144.333和1 1 150 146.424 - 2 5 3 1 4 4 1 3 5 1 143.542 143.61 143.924 143.414 6 1 2 7 1 2 143.023 8 1 2 142.823 9 1 1 142.786 10 1 1 142.754 = 142.754的距离最好的总额

在每次迭代中威彻斯算法(见算法)重新分配聚类之间的点以减少点到质心的距离之和,然后重新计算新的聚类分配的聚类质心。注意,每次迭代的总距离和重新分配的次数都在减少,直到算法达到最小值。应用于威彻斯由两个阶段组成。在这里的示例中,算法的第二阶段没有进行任何重新分配,这表明第一个阶段只经过几次迭代就达到了最小值。

默认情况下,威彻斯使用随机选择的一组初始质心位置开始聚类过程。的威彻斯算法可以收敛到一个局部最小解;也就是说,威彻斯可以对数据进行分区,从而将任何单个点移动到不同的集群中,增加距离的总和。然而,与许多其他类型的数值最小化方法一样,该方法的解威彻斯达到有时取决于起点。因此,数据可以存在具有较低总距离总万博 尤文图斯和的解决方案(局部最小值)。您可以使用可选的“复制”名称-值对参数用于测试不同的解决方案。万博 尤文图斯当指定多个复制时,威彻斯每个重复从不同的随机选择的中心开始重复聚类过程。威彻斯然后返回所有复制中最小距离总和的解决方案。

[CIDX3,CMEANS3,SUMD3] = kmeans(meas,3,“复制”5,“显示”'最终的');
重复1,9次迭代,总距离之和= 78.8557。重复2次,10次迭代,总距离之和= 78.8557。重复3,8次迭代,总距离之和= 78.8557。重复4,8次迭代,总距离之和= 78.8557。重复5,1次迭代,总距离之和= 78.8514。距离的最佳总和= 78.8514

结果表明,即使对于这个相对简单的问题,也存在非全局极小值。这五个复制中的每一个都是从一组不同的初始质心开始的。取决于它从哪里开始威彻斯达成两种不同的解决方案之一万博 尤文图斯然而,最终的解决方案威彻斯返回所有距离总和的返回是所有重复。第三个输出参数包含每个最佳解决方案的每个群集中的距离之和。

总和(SUMD3)
ans = 78.8514

这款三簇解决方案的剪影图表明存在一个群集是完全分开的,但另一个两个群集不是很明。

[silh3 h] =轮廓(cidx3量,“sqeuclidean”);

再次,您可以绘制原始数据来查看如何威彻斯已将点数分配给集群。

i = 1:3 clust =查找(cidx3 == i);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});持有结束plot3 (cmeans3 (: 1) cmeans3 (:, 2), cmeans3 (:, 3),“柯”);plot3 (cmeans3 (: 1) cmeans3 (:, 2), cmeans3 (:, 3),“kx”);持有离开包含(“花萼长度”);ylabel ('萼片宽度');Zlabel(“花瓣长度”);视图(-137年,10);网格

大家可以看到威彻斯已经将上面的集群从双集群解决方案中分离出来,这两个集群彼此非常接近。这个三集群的解决方案可能比前一个两集群的解决方案更有用,也可能更没用,具体取决于您在集群后打算如何处理这些数据。的第一个输出参数轮廓包含每个点的轮廓值,您可以使用它来定量地比较两个解决方案。万博 尤文图斯对于两簇的解决方案,平均轮廓值更大,这表明从创建不同簇的角度来看,它是一个更好的答案。

(平均(silh2)平均(silh3))
Ans = 0.8504 0.7357

您还可以使用不同的距离聚集这些数据。对于这些数据,余弦距离可能是有意义的,因为它将忽略测量值的绝对大小,而只考虑它们的相对大小。因此,两朵大小不同,但花瓣和萼片形状相似的花,相对于平方欧几里得距离可能不接近,但相对于余弦距离可能很接近。

[CIDXCOS,CMEANSCOS] = kmeans(meas,3,'dist'“因为”);

从剪影图上看,这些星系团似乎只比使用平方欧几里得距离发现的星系团更好一点。

[silhCos h] =轮廓(cidxCos量,“因为”);[均值(silh2)平均值(silh3)平均值(silhcos)]
Ans = 0.8504 0.7357 0.7491

注意,集群的顺序与前面的轮廓图不同。这是因为威彻斯随机选择初始群集分配。

通过绘制原始数据,您可以看到使用两个不同距离创建的群集形状的差异。两种解决方案类似万博 尤文图斯,但使用余弦距离时,两个上簇在原点的方向上伸长。

i = 1:3 clust = find(cidxCos==i);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});持有结束持有离开包含(“花萼长度”);ylabel ('萼片宽度');Zlabel(“花瓣长度”);视图(-137年,10);网格

这个图不包括簇的质心,因为相对于余弦距离的质心对应于原始数据空间中的原点的半线。但是,您可以绘制标准化数据点的平行坐标图,以可视化集群中心之间的差异。

lnsymb = {“b -”的r -'m-'};名称= {'sl'“西南”“PL”'pw'};meas0 = meas ./ repmat(sqrt(sum(meas。^ 2,2)),1,4);ymin = min(min(meas0));ymax = max(max(meas0));I = 1:3 subplot(1,3, I);情节(meas0 (cidxCos = =我,:),lnsymb{我});持有;情节(cmeansCos(我,:),“k -”'行宽'2);持有离开;标题(Sprintf(“集群% d ',我));xlim([。9日,4.1]);ylim ([ymin ymax]);甘氨胆酸h_gca =;h_gca。XTick = 1:4;h_gca。XTickLabel =名称;结束

从这个剧情中可以清楚地看出,来自三个集群中的每一个的标本平均具有明显不同的花瓣和萼片的不同程度。第一簇的花瓣严格小于他们的萼片。然而,第二两个簇的花瓣和萼片大小重叠,然而,来自第三簇的那些重叠超过第二个簇。您还可以看出第二和第三簇包括一些类似于彼此非常相似的样本。

因为我们知道每个观测数据中的物种,你可以比较发现的星系团威彻斯对于实际物种,看看三种物种是否具有明显不同的物理特征。事实上,由于以下绘图显示,使用余弦距离产生的簇不同于只有五个花朵的物种组。用恒星绘制的那些五点均靠近上两集群的边界。

次要情节(1 1 1);i = 1:3 clust = find(cidxCos==i);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});持有结束包含(“花萼长度”);ylabel ('萼片宽度');Zlabel(“花瓣长度”);视图(-137年,10);网格sidx = grp2idx(物种);miss = find(cidxcos〜= sidx);Plot3(Meas(Miss,1),Meas(Miss,2),Meas(Miss,3),'k *');传奇({“setosa”“多色的”“virginica”});持有离开

基于层次聚类的Fisher虹膜数据聚类

K-Means聚类生成了虹膜数据的单个分区,但您可能还想研究数据分组的不同规模。通过创建集群的层次树,分层集群就可以做到这一点。

首先,利用虹膜数据中观测值之间的距离创建聚类树。从欧几里得距离开始。

eucD = pdist(量,'euclidean');clustTreeEuc =连杆(eucD,'平均数');

相干性是验证聚类树与原始距离是否一致的一种方法。大的值表明树很好地拟合距离,在某种意义上,观察之间的成对联系与它们的实际成对距离相关。这棵树似乎与距离相当吻合。

cophenet (clustTreeEuc eucD)
ANS = 0.8770.

要可视化集群的层次结构,可以绘制一个树形图。

[h,节点]=系统树图(clustTreeEuc 0);甘氨胆酸h_gca =;h_gca.tickdir ='出去';h_gca。TickLength =[。002 0];h_gca。XTickLabel = [];

这棵树的根节点比其余节点高得多,这证实了您从K-Means聚类中所看到的:有两组大的、不同的观察结果。在这两个群体中,你可以看到较低水平的群体出现,因为你考虑的距离范围越来越小。有许多不同级别的群体,规模不同,差异程度不同。

基于K-Means聚类的结果,余弦也可能是距离测量的良好选择。生成的分层树是完全不同的,建议在虹膜数据中查看组结构的非常不同的方式。

cosD = pdist(量,的余弦);clustTreeCos =连杆(cosD,'平均数');cophenet (clustTreeCos cosD)
ans = 0.9360
[h,节点]=系统树图(clustTreeCos 0);甘氨胆酸h_gca =;h_gca.tickdir ='出去';h_gca。TickLength =[。002 0];h_gca。XTickLabel = [];

这棵树的最高高度将鸢尾标本分为两个非常不同的组。树形图显示,相对于余弦距离,组内差异相对于组间差异要比欧氏距离小得多。这正是您所期望的这些数据,因为余弦距离计算的对象从原点相同的“方向”成对距离为零。

有了150个观察结果,这个图是杂乱的,但是你可以做一个不显示树的最低层的简化的树形图。

[h,节点]=系统树图(clustTreeCos 12);

这棵树中最高的三个节点分离出三个大小相等的组,加上一个不靠近任何其他节点的单个样本(标记为叶节点5)。

[sum(ismember(nodes,[11 12 9 10])))和(ismember(nodes,[6 7 8])...Sum (ismember(nodes,[1 2 4 3])) Sum (nodes==5))
答案:1

在许多情况下,树状图可能是一个充分的结果。但是,您可以更进一步,使用集群函数来切割树并显式地将观察数据划分为特定的簇,就像K-Means一样。使用来自余弦距离的层次结构来创建集群,指定一个链接高度,该高度将在三个最高节点以下切割树,并创建四个集群,然后绘制集群原始数据。

hidx =集群(clustTreeCos,'标准'“距离”'隔断',.006);I = 1:5 clust = find(hidx== I);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});持有结束持有离开包含(“花萼长度”);ylabel ('萼片宽度');Zlabel(“花瓣长度”);视图(-137年,10);网格

该图表明,使用三个集群,具有余弦距离的分层聚类的结果与k-means的结果类似于来自k-means的结果。但是,创建分层群集树允许您立即可视化,需要在K-means聚类中具有相当大的实验对k的不同值。

分层集群还允许您试验不同的链接。例如,用单键聚类虹膜数据,往往比平均距离更大的物体连接在一起,给出了一个非常不同的数据结构解释。

clustTreeSng =连杆(eucD,'单身的');[H,节点] =树木图(CLUSTTRESNG,0);甘氨胆酸h_gca =;h_gca.tickdir ='出去';h_gca。TickLength =[。002 0];h_gca。XTickLabel = [];