主要内容

聚类分析

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

k -均值和层次聚类

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

k均值聚类是一种划分方法,它将数据中的观察结果视为彼此之间具有位置和距离的对象。它将对象划分为K个相互排斥的簇,使得每个簇中的对象彼此尽可能地接近,并且与其他簇中的对象尽可能地远离。每个星团的特征是它的质心或中心点。当然,聚类中使用的距离通常不代表空间距离。

分层聚类是一种通过创建聚类树,在不同距离范围内同时研究数据分组的方法。该树不是像K-Means中那样的一组集群,而是一个多层次的层次结构,其中一个级别上的集群被连接为下一个更高级别上的集群。这使您可以决定在应用程序中使用何种规模或级别的集群最合适。

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

rng (6,“旋风”

费雪虹膜数据

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

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

利用k均值聚类Fisher的虹膜数据

这个函数kmeans执行k均值聚类,使用迭代算法将对象分配到聚类,以便在所有聚类中,从每个对象到其聚类质心的距离之和最小。使用Fisher的虹膜数据,它将根据虹膜标本的萼片和花瓣测量值,找到虹膜标本之间的自然分组。使用k -均值聚类,必须指定要创建的集群数量。

首先,加载数据并调用kmeans将所需簇数设置为2,并使用欧氏距离的平方。为了了解结果集群的分离程度,您可以制作一个剪影图。轮廓图显示了一个聚类中的每个点与相邻聚类中的点的接近程度。

负载fisheriris[cidx2,cmeans2] = kmeans(meas,2,“距离”“sqeuclidean”);[silh2,h] =廓形(meas,cidx2,“sqeuclidean”);

从剪影图中,您可以看到两个簇中的大多数点都具有较大的剪影值,大于0.8,这表明这些点与相邻簇分离良好。然而,每个聚类也包含一些轮廓值较低的点,表明它们靠近其他聚类的点。

事实证明,这些数据中的第四个测量值,即花瓣宽度,与第三个测量值,即花瓣长度高度相关,因此,前三个测量值的三维图可以很好地表示数据,而无需求助于四维。如果绘制数据,则为创建的每个群集使用不同的符号kmeans,可以将轮廓值较小的点识别为与其他聚类中的点接近的点。

Ptsymb = {“废话”“r ^”“医学博士”“去”“c +”};I = 1:2 clust = find(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均值聚类只考虑距离,而不考虑密度,所以会出现这种结果。

您可以增加集群的数量,以查看是否kmeans可以在数据中找到进一步的分组结构。这一次,使用可选选项“显示”参数来打印关于聚类算法中每个迭代的信息。

[cidx3,cmeans3] = kmeans(meas,3,“显示”“通路”);
iter phase num sum 1 1 150 146.424 2 15 144.333 3 14 143.924 41 3 143.61 5 1 1 143.542 61 2 143.414 7 1 2 143.023 8 1 2 142.823 9 1 1 142.786 10 1 1 142.754最佳总距离之和= 142.754

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

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

[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

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

总和(sumd3)
Ans = 78.8514

这个三集群解决方案的轮廓图表明,有一个集群是分离良好的,但其他两个集群不是很明显。

[silh3,h] =廓形(meas,cidx3,“sqeuclidean”);

同样,您可以将原始数据绘制出来,以了解如何操作kmeans已将点数分配到集群。

I = 1:3 clust = find(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);网格

你们可以看到kmeans将上层集群从双集群解决方案中分离出来,并且这两个集群彼此非常接近。这种三集群解决方案可能比以前的两集群解决方案更有用,也可能没有那么有用,这取决于您在对这些数据进行集群化之后打算对它们做什么。的第一个输出参数轮廓包含每个点的轮廓值,可用于定量比较两个解决方案。万博 尤文图斯双集群解决方案的平均轮廓值更大,这表明纯粹从创建不同集群的角度来看,这是一个更好的答案。

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

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

[cidxCos,cmeansCos] = kmeans(meas,3,“距离”“因为”);

从剪影图上看,这些星团似乎只比用平方欧几里得距离发现的星团稍微分开。

[silhCos,h] =廓形(meas,cidxCos,“因为”);[mean(silh2) mean(silh3) mean(silhCos)]
Ans = 0.8504 0.7357 0.7491

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

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

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 =量。/ repmat(√sum(量。^ 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 = gca;h_gca。XTick = 1:4;h_gca。XTickLabel = names;结束

从这幅图中可以清楚地看出,平均而言,来自三个簇的标本的花瓣和萼片的相对大小明显不同。第一簇的花瓣严格小于萼片。第二个簇的花瓣和萼片在大小上重叠,然而,来自第三个簇的花瓣和萼片重叠的比第二个多。你还可以看到第二和第三组包括一些彼此非常相似的样本。

因为我们知道数据中每个观测到的物种,你可以比较由kmeans到实际的物种,看看这三个物种是否有明显不同的物理特征。事实上,如下图所示,使用余弦距离创建的簇与物种组只有五种不同。这5个点,用恒星标出,都在上面两个星团的边界附近。

次要情节(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(量(小姐,1),量(小姐,2),(小姐,3),“k *’);传奇({“setosa”“多色的”“virginica”});持有

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

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

首先,使用虹膜数据中观测值之间的距离创建一个聚类树。首先使用欧几里得距离。

(meas;“欧几里得”);clustTreeEuc = linkage(eucD,“平均”);

综合相关是验证聚类树与原始距离一致的一种方法。较大的值表明该树很好地拟合了距离,在某种意义上,观测值之间的成对联系与它们的实际成对距离相关。这棵树似乎很适合这样的距离。

cophenet (clustTreeEuc eucD)
Ans = 0.8770

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

[h,nodes] =树状图(clustTreeEuc,0);H_gca = gca;h_gca。TickDir =“出”;h_gca。TickLength = [.]002 0];h_gca。XTickLabel = [];

这棵树的根节点比其他节点高得多,这证实了你从k均值聚类中看到的:有两组不同的大观察数据。在这两个群体中,你可以看到,当你考虑越来越小的距离尺度时,更低水平的群体出现了。群体有许多不同的层次,大小不同,区别程度也不同。

基于k均值聚类的结果,余弦也可能是一个很好的距离度量选择。由此产生的层次树是完全不同的,这表明用一种非常不同的方式来看待虹膜数据中的群体结构。

cosD = pdist(meas,的余弦);clustTreeCos = linkage(cosD,“平均”);cophenet (clustTreeCos cosD)
Ans = 0.9360
[h,nodes] = dendrogram(clustTreeCos,0);H_gca = gca;h_gca。TickDir =“出”;h_gca。TickLength = [.]002 0];h_gca。XTickLabel = [];

这棵树的最高层次将虹膜标本分为两个非常不同的组。树状图显示,相对于余弦距离,组内差异相对于组间差异要比欧几里得距离的情况小得多。这正是你对这些数据所期望的,因为余弦距离计算的是从原点“方向”相同的物体的成对距离为零。

有150个观测值,图很杂乱,但你可以做一个简化的树状图,不显示树的最低层次。

[h,nodes] = dendrogram(clustTreeCos,12);

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

[sum(ismember(nodes,[11 12 9 10]))) sum(ismember(nodes,[6 7 8]))...Sum (ismember(nodes,[1 2 4 3])) Sum (nodes==5)]
Ans = 54 46 49

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

hidx = cluster(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的不同值进行大量实验。

层次聚类还允许您尝试不同的链接。例如,用单一链接聚类虹膜数据,它倾向于将比平均距离更大的物体链接在一起,这对数据中的结构给出了非常不同的解释。

clustTreeSng = linkage(eucD,“单一”);[h,nodes] = dendrogram(clustTreeSng,0);H_gca = gca;h_gca。TickDir =“出”;h_gca。TickLength = [.]002 0];h_gca。XTickLabel = [];