R语言中实现层次聚类模型

Python015

R语言中实现层次聚类模型,第1张

R语言中实现层次聚类模型

大家好!在这篇文章中,我将向你展示如何在R中进行层次聚类。

什么是分层聚类?

分层聚类是一种可供选择的方法,它可以自下而上地构建层次结构,并且不需要我们事先指定聚类的数量。

该算法的工作原理如下:

将每个数据点放入其自己的群集中。

确定最近的两个群集并将它们组合成一个群集。

重复上述步骤,直到所有数据点位于一个群集中。

一旦完成,它通常由树状结构表示。

让我们看看分层聚类算法可以做得多好。我们可以使用hclust这个。hclust要求我们以距离矩阵的形式提供数据。我们可以通过使用dist。默认情况下,使用完整的链接方法。

这会生成以下树形图:

从图中我们可以看出,群集总数的最佳选择是3或4:

要做到这一点,我们可以使用所需数量的群集来切断树cutree。

现在,让我们将它与原始物种进行比较。

它看起来像算法成功地将物种setosa的所有花分为簇1,并将virginica分为簇2,但是与花斑杂交有困难。如果你看看显示不同物种的原始图,你可以理解为什么:

让我们看看我们是否可以通过使用不同的连接方法更好。这一次,我们将使用平均连接方法:

这给了我们以下树状图:

我们可以看到,群集数量的两个最佳选择是3或5.让我们用cutree它来将它降到3个群集。

我们可以看到,这一次,该算法在聚类数据方面做得更好,只有6个数据点出错。

我们可以如下绘制它与原始数据进行比较:

这给了我们下面的图表:

内部颜色与外部颜色不匹配的所有点都是不正确聚类的点。

(1)定义每一个观测值为一类;

(2)计算每一类和其它各类的距离;

(3)把“距离”最短的两类合并成一类,这样类的个数就减少一个;

(4)重复步骤1和步骤2,直到包含所有观测值的类合并成单个类为止。

基于5种营养标准含量(变量)的27种食物(观测)进行层次聚类分析,探索不同食物的相同点与不同点,并分成有意义的类。此处层次聚类算法以平均联动(average)为例。

(1)数据预处理--归一化

(2)计算欧几里得距离

(3)平均联动层次聚类分析

(1)确定聚类个数

NbClust包提供了众多的指数来确定在一个聚类分析里类的最佳数目。

(2)获取最终的聚类方案

由上图,尝试解释每类变量的含义:

K均值聚类为最常见的划分方法。

(1)选择K个中心点(随机选择K个观测),K数值就是我们预期的聚类数。

(2)把每个数据点分配给离它最近的中心点;第一次中心点是随机选择的,但也可以设置参数,选择最优的初始值。

(3)重新计算每类中的点到该类中心点距离的平均值;此时的中心点应该为每一类的均值中心点,对异常值敏感(之后都是如此)

(4)分配每个数据到它最近的中心点;

(5)重复步骤3、4,直到所有的观测值不在被分配或是达到最大的迭代次数(默认10次)

(1)数据预处理:去除第一列干扰数据,并归一化数据。

(2)确定待提取的聚类个数,同样可用NbClust包判断(顺序与层次聚类分析不同,如前所述,层次聚类分析在最后才确定聚类个数)

(3)K均值聚类分析

(4)最后将聚类结果与原始数据标准结果(第一列数据)进行比对,看看分析质量如何。

兰德指数接近0.9,看来K均值聚类算法还不错~

K均值法对均值异常敏感,相比来说,PAM为更稳健的方法。

(1)随机选择K个观测(每个都称为中心点);

(2)计算观测值到各个中心的距离;

(3)把每个观测值分配到最近的中心点;

(4)计算每个中心点到每个观测值的距离的总和(总成本);

(5)选择一个该类中不是中心的点,并和中心点互换;

(6)重新把每个点分配到距它最近的中心点;

(7)再次计算总成本;

(8)若新的总成本比步骤4计算的总成本少,就把新的点作为中心点;

(9)重复步骤5-8,直到中心点不变。

R语言将层次聚类中的树分成簇

说明

在聚类树图中可以观测到聚类的层次,但是仍然得不到组的信息,不过我们可以定义一个聚类树图会拥有多少个簇,并控制树的高度以便将树分成不同的组。

操作

接上节的数据hc

将数据分成四组

fit = cutree(hc,4)

检查数据的簇标签

fit

[1] 1 1 2 1 2 1 2 2 1 1 1 2 2 1 1 1 2 1 2 3 4 3 4 3 3 4 4 3 4 4 4 3 3 3 4 4 3 4 4 4 4 4 4 4 3 3 4 4 4 3 4 3 3 4 4 4 3 4 4 3

统计每一个簇中的对象数

table(fit)

fit

1 2 3 4

11 8 16 25

使用红色矩形框可视化矩形的簇

plot(hc,hang = -0.01,cex =0.7)

rect.hclust(hc,k=4,border = "red")

除了使用红色矩形来框来界定簇,还可以使用它对单独某个簇进行标记:

plot(hc,hang = -0.01,cex =0.7)

rect.hclust(hc,k = 4,which = 2,border = "red")

标记特定簇

还可以调用dendextend包,使用不同的颜色来绘制红色矩形框的各个不同聚簇。

根据分支所在的不同簇,对其涂色

library(dendextend)#delete

dend %>% color_branches(k=4) %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")

不同簇不同色

在这些簇周围添加红色矩形框

dend %>% color_branches(k=4) %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")

dend %>% rect.dendrogram(k=4,horiz = TRUE)

最后,在图中添加一条切割线来展示对树的操作结:

dend %>% color_branches(k=4) %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")

dend %>% rect.dendrogram(k=4,horiz = TRUE)

abline(v = heights_per_k.dendrogram(dend)["4"] + .1,lwd = 2,lty = 2,col = "blue")

水平聚类树中绘制分割线