使用 Python 进行层次聚类

聚类是一种将相似数据点分组在一起的技术,形成的相似数据点组称为聚类。

很多时候我们的数据没有任何标签;因此,从中汲取见解和模式变得非常困难。

在这种情况下,无监督聚类技术就会发挥作用。在层次聚类中,我们基本上构建了聚类的层次结构。

聚类是什么样的

层次聚类的类型

层次聚类分为两种类型

  • 凝聚层次聚类。
  • 分裂层次聚类

1.凝聚层次聚类

凝聚层次聚类中,每个数据点都被视为单个聚类,使得聚类总数等于数据点的数量。然后我们继续根据相似性指标对数据进行分组,随着我们在层次结构中向上移动而形成聚类。这种方法也称为自下而上的方法。

2.分裂层次聚类

分裂式层次聚类与凝聚式 HC 相反。在这里,我们从包含所有数据点的单个集群开始。在每次迭代中,我们根据距离度量将远离其他点的点分开,直到每个簇恰好有 1 个数据点。

执行层次聚类的步骤

让我们通过一个示例来直观地了解层次聚类如何工作。

假设我们有与 4 名学生在数学和科学方面的分数相关的数据,我们需要创建学生集群来得出见解。

示例数据集

现在我们有了数据,我们需要做的第一步是查看每个数据点彼此之间的距离。

为此,我们构造一个距离矩阵每个点之间的距离可以使用各种度量来找到,例如欧几里德距离、曼哈顿距离等。

我们将在此示例中使用欧几里得距离:

欧氏距离
计算每个数据点之间的距离

我们现在在 S1 和 S2 之间形成一个集群,因为它们彼此更接近。现在出现一个问题,我们的数据现在是什么样子的?

我们取 S1 和 S2 获得的分数的平均值,我们得到的值将代表该集群的分数。我们可以考虑集群中数据点的最大值或最小值,而不是平均值。

第一次聚类后的数据集

再次找到最近的点并创建另一个簇。

集群 S3 和 S4

如果我们重复上述步骤并继续聚类,直到只剩下一个包含所有聚类的聚类,我们会得到如下所示的结果:

我们示例的树状图

我们得到的图形就是所谓的树状图树状图是一种树状图,说明了相应分析产生的簇的排列。X 轴上的样本会自动排列,代表彼此距离很近的点。

选择最佳簇数可能是一项棘手的任务。但根据经验,我们会寻找具有最长“分支”或“最长树状图距离”的簇。最佳簇数还受到专家知识、上下文等的影响。

有了足够的想法,让我们继续用 python 实现一个。

使用 Python进行层次聚类

让我们深入研究一个示例来最好地演示层次聚类

我们将使用 Iris 数据集来执行聚类。您可以在此处获取有关 iris 数据集的更多详细信息

1. 绘制和创建簇

sklearn.cluster模块为我们提供了AgglomerativeClustering对数据集执行聚类的类。

作为输入参数,它需要多个簇 ( n_clusters), affinity对应于创建时要使用的距离度量类型, linkage linkage{“ward”, “complete”, “average”, “single”}, default=”病房”

关联标准确定在给定的观测集之间使用哪个距离。

您可以在这里了解更多关于AgglomerativeClustering班级的信息

#Importing required libraries
 
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
 
 
#Getting the data ready
 
data = load_iris()
df = data.data
#Selecting certain features based on which clustering is done
df = df[:,1:3]
 
 
#Creating the model
 
agg_clustering = AgglomerativeClustering(n_clusters = 3, affinity = 'euclidean', linkage = 'ward')
 
#predicting the labels
 
labels = agg_clustering.fit_predict(df)
 
#Plotting the results
 
plt.figure(figsize = (8,5))
plt.scatter(df[labels == 0 , 0] , df[labels == 0 , 1] , c = 'red')
plt.scatter(df[labels == 1 , 0] , df[labels == 1 , 1] , c = 'blue')
plt.scatter(df[labels == 2 , 0] , df[labels == 2 , 1] , c = 'green')
plt.show()
上面代码的输出

在上面的代码中,我们认为簇的数量为 3。

这很明显,因为 iris 数据集仅包含 3 个不同的类,但在现实场景中,我们对数据执行无监督聚类,因为我们没有有关每个数据点所属标签的信息。

因此,找出最佳集群数量需要一些领域专业知识。但是,很少有方法可以找到我们将在以后的文章中讨论的最佳集群。

2. 绘制树状图

该 scipy.cluster 模块包含我们将用来绘制树状图的层次结构类。

层次包含 dendrogram 方法和 linkage 方法。

该 linkage 方法将数据集和最小化距离的方法作为参数,即 ward 并返回一个链接矩阵,当提供给dendrogram方法时,该矩阵会创建拟合数据的树状图。

让我们通过一个例子来看看上面的说法意味着什么。

#Importing libraries
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram , linkage
 
#Getting the data ready
 
data = load_iris()
df = data.data
#Selecting certain features based on which clustering is done
df = df[:,1:3]
 
#Linkage Matrix
Z = linkage(df, method = 'ward')
 
#plotting dendrogram
dendro = dendrogram(Z)
plt.title('Dendrogram')
plt.ylabel('Euclidean distance')
plt.show()
数据树状图

结论

在本文中,我们试图了解层次聚类的真正含义及其工作机制背后的一些基本直觉。我们还了解了如何构建树状图并最终在 Python 中实现 HC。

快乐学习!