Python sklearn 聚类之层次聚类的连接矩阵
在本文中,我们将介绍Python中的层次聚类算法以及使用sklearn库实现的链接矩阵方法。
阅读更多:Python 教程
什么是层次聚类?
层次聚类是一种用于发现和组织数据集中模式的无监督机器学习算法。与其他聚类方法相比,层次聚类的独特之处在于它直接构建一个数据点之间的层次性关系。这种关系可以通过树形结构(树状图)来表示,可以帮助我们理解数据点之间的相似性和距离。
引言
链接矩阵是层次聚类中的一个重要概念。它是一个方形矩阵,记录了数据点之间的距离或相似性。层次聚类算法使用链接矩阵来不断合并相似的数据点,直到最终形成一个完整的聚类结果。
链接矩阵的大小取决于数据集中的数据点数量,对于n个数据点,链接矩阵的大小将是一个n x n的矩阵。对角线上的元素通常为0,表示每个数据点与自身的距离为0。对于非对角线元素,可以使用多种距离衡量方式,例如欧氏距离或曼哈顿距离。
使用sklearn进行层次聚类
在Python中,我们可以使用scikit-learn(sklearn)库来进行层次聚类。sklearn提供了一个名为AgglomerativeClustering的类,用于实现层次聚类算法。
首先,我们需要导入所需的库和数据集。在这个例子中,我们将使用一个虚拟的学生数据集:
import numpy as np
from sklearn.cluster import AgglomerativeClustering
# 创建一个虚拟的学生数据集
data = np.array([[70, 170],
[65, 160],
[80, 180],
[73, 175],
[68, 165],
[93, 190],
[55, 150],
[75, 170],
[83, 175],
[80, 180]])
然后,我们可以使用AgglomerativeClustering类来执行层次聚类。在创建类的实例时,我们可以指定所需的参数,例如聚类数量和链接方式。这里我们将指定聚类数量为2,并使用默认的链接方式(ward链接):
# 创建AgglomerativeClustering类的实例
clustering = AgglomerativeClustering(n_clusters=2)
# 执行层次聚类
clustering.fit(data)
# 获取聚类结果
labels = clustering.labels_
执行层次聚类后,我们可以通过clustering.labels_
属性获得每个数据点所属的聚类标签。在这个例子中,我们得到的标签数组如下所示:[1 1 1 1 1 0 1 1 1 1]。其中,标签0表示第6个数据点属于一个独立的聚类,而标签1表示其余9个数据点属于另一个聚类。
构建链接矩阵
在层次聚类中,我们可以使用linkage函数来构建链接矩阵。这个函数的用法如下:
from scipy.cluster.hierarchy import linkage
# 构建链接矩阵
linkage_matrix = linkage(data, method='ward')
linkage
函数接受两个参数:数据集和链接方式。在这个例子中,我们使用了ward链接方式,它是一种基于方差的度量方法,常用于层次聚类。
构建好链接矩阵后,我们可以将其可视化为树状图,以便更好地理解聚类结果和数据点之间的关系。
from scipy.cluster.hierarchy import dendrogram
import matplotlib.pyplot as plt
# 绘制树状图
dendrogram(linkage_matrix)
# 设置x轴和y轴标签
plt.xlabel('Samples')
plt.ylabel('Distance')
# 显示树状图
plt.show()
上述代码将绘制一个树状图,其中x轴表示数据点,y轴表示聚类间的距离。
总结
在本文中,我们介绍了层次聚类算法以及使用sklearn库实现的链接矩阵方法。层次聚类是一种无监督机器学习算法,能够将数据点分层次地组织起来,并通过链接矩阵不断合并相似的数据点。通过sklearn库,我们可以方便地进行层次聚类,并使用linkage函数构建链接矩阵。最后,我们还可以通过绘制树状图来查看聚类结果和数据点之间的关系。
层次聚类算法和链接矩阵方法在许多领域都有广泛的应用,例如生物学、社会网络分析和市场细分等。希望本文能为初学者提供一些指导,帮助他们更好地理解和应用层次聚类算法。