主要内容

聚类分析

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

k -均值和层次聚类

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

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

分层群集是一种通过创建群集树在数据中调查数据分组的方式,通过创建群集树。树不是单一的群集,如在k均值中,而是一个多级层次结构,其中一个级别的群集在下一个更高级别的群集。这允许您决定应用程序中最适合群集的级别或级别。

此示例中使用的一些功能调用MATLAB®内置随机数生成函数。要复制此示例中显示的确切结果,则应执行以下命令,将随机数生成器设置为已知状态。如果未设置状态,则您的结果可能以微不足道的方式不同,例如,您可能会看到以不同的顺序编号的群集。还有可能产生次优集群解决方案的可能性(该示例包括讨论次优解决方案,包括避免它们的方法)。金宝搏官方网站

rng (6,'twister'

费雪的虹膜数据

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

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

使用K-means集群聚类Fisher的虹膜数据

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

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

加载fisheriris[cidx2, cmeans2] = kmeans(量2“距离”“sqeuclidean”);[silh2,h] =剪影(meas,cidx2,“sqeuclidean”);

从剪影图中,您可以看到两个集群中的大多数点具有大的轮廓值,大于0.8,表明这些点与相邻群集分离得很好。但是,每个群集还包含几个具有低轮廓值的点,表示它们附近到来自其他集群的点。

结果是,这些数据中的第四个测量值,花瓣的宽度,与第三个测量值,花瓣的长度,高度相关,所以前三个测量值的三维图可以很好地反映数据,而不需要用到四维。如果绘制数据,则为创建的每个集群使用不同的符号kmeans,您可以识别具有小剪影值的点作为接近来自其他集群点的点。

ptsymb = {'BS'“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-means聚类只考虑距离,而不考虑密度,所以会出现这种结果。

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

[cidx3,cmeans3] = kmeans(meas,3,“显示”'iter');
ITER相Num Sum11 150 146.424 2 11 5 144.333 3 1 4 143.924 4 1 3 143.61 5 11 1 143.542 6 1 2 143.414 7 11 2 143.023 8 11 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(量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] =轮廓(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(量3“距离”'cos');

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

[silhcos,h] =剪影(Meas,Cidxcos,'cos');[意味着(silh2)是(silh3)是(silhCos)]
ans = 0.8504 0.7357 0.7491

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

通过绘制原始数据,可以看到使用两种不同距离创建的集群形状的差异。这两个解是相似的金宝搏官方网站,但是当使用余弦距离时,上面的两个簇在原点的方向被拉长了。

为了i = 1:3 clust =查找(cidxcos == i);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});抓住结尾抓住包含('萼片长度');ylabel(萼片宽的);zlabel (“瓣长度”);查看(-137,10);网格

该曲线不包括集群质心,因为关于余弦距离的质心对应于原始数据空间中的原点的半线。但是,您可以制作标准化数据点的并行坐标曲线,以可视化集群质心之间的差异。

lnsymb = {“b -”'r-'“m -”};名称= {“SL”'SW''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(i,:)',“k -”“线宽”2);抓住;标题(sprintf ('簇%d',一世));XLIM([。9,4.1]);ylim([ymin,ymax]);甘氨胆酸h_gca =;h_gca.xtick = 1:4;h_gca.xticklabel =名称;结尾

从这张图中可以清楚地看出,这三个花丛中的每一个都有明显不同的平均花瓣和萼片的相对大小。第一簇的花瓣严格小于萼片。后两簇的花瓣和萼片在大小上重叠,然而,第三簇的花瓣和萼片重叠的程度大于第二簇。你还可以看到第二组和第三组包括一些彼此非常相似的样本。

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

子图(1,1,1);为了i = 1:3 clust =查找(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群集产生了一个单一的虹膜数据分区,但您可能还希望调查数据中的不同分组的尺度。分层群集允许您通过创建分层群集的群集。

首先,使用虹膜数据中的观察之间的距离创建群集树。首先使用欧几里德距离。

eucd = pdist(meas,“欧几里得”);clusttreeuc =链接(EUCD,“平均”);

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

CopheNet(Clusttreeuc,EUCD)
ans = 0.8770

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

[h,节点] =树木图(Clusttreeuc,0);甘氨胆酸h_gca =;h_gca.tickdir =.“出”;h_gca.ticklength = [.002 0];h_gca.xticklabel = [];

该树中的根节点远高于剩余节点,确认您从K-means集群中看到的内容:有两个大,不同的观察组。在每个两组中的每一组中,您可以看到较低级别的距离距离较小和更小的尺度时出现。有许多不同的群体,不同的尺寸,以及不同程度的明显。

基于K-Means聚类的结果,余弦也可能是距离度量的一个很好的选择。由此产生的层次树是非常不同的,这表明在虹膜数据中观察群体结构的方法是非常不同的。

cosd = pdist(meas,'余弦');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(节点,[11 12 9 10]))(ISMEMBER(节点,[6 7 8]))......SUM(ISMEMBER(节点,[1 2 4 3]))总和(nodes == 5)]
ans = 54 46 49 1

对于许多目的,树木图可能是足够的结果。但是,您可以进一步逐步,并使用作为k-means的函数切割树并明确地分隔观察,与k均值相同。使用从余弦距离的层次结构创建群集,指定将切割三个最高节点下方树的链接高度,并创建四个集群,然后绘制群集的原始数据。

hidx = cluster(clusttreecos,“标准”'距离'“截止”, .006);为了i = 1:5 clust =查找(hidx == i);plot3(量(clust 1)量(clust 2)量(clust 3) ptsymb{我});抓住结尾抓住包含('萼片长度');ylabel(萼片宽的);zlabel (“瓣长度”);查看(-137,10);网格

这张图表明,使用余弦距离的层次聚类结果与使用三个聚类的K-Means结果在性质上相似。然而,创建一个层次集群树可以让您一下子可视化,在K- means集群中需要使用不同的K值进行大量的试验。

分层聚类还允许您尝试不同的联系。例如,用单个连杆培养虹膜数据,这倾向于将对象与平均距离更大的距离相连,给出了数据中的结构的非常不同的解释。

clustTreeSng =连杆(eucD,“单一”);[h,节点]=系统树图(clustTreeSng 0);甘氨胆酸h_gca =;h_gca.tickdir =.“出”;h_gca.ticklength = [.002 0];h_gca.xticklabel = [];