返回
用 Scikit-learn 和 Scipy 为定制的距离度量执行层次聚类
人工智能
2023-12-03 16:44:11
引言
层次聚类是一种无监督机器学习算法,用于将数据点分组到层次结构中。它从每个数据点作为单独簇开始,然后逐步合并最相似的簇,直到形成一个包含所有数据点的单个簇。
Scikit-learn 是一个用于 Python 的机器学习库,提供了一系列用于执行层次聚类的算法。Scipy 是一个用于科学和技术计算的库,提供了用于自定义距离度量的实用程序。
使用 Scikit-learn 执行层次聚类
Scikit-learn 提供了 AgglomerativeClustering
类用于执行层次聚类。该类需要两个参数:
n_clusters
:指定要创建的簇的数量。affinity
:指定要使用的距离度量。
默认情况下,affinity
设置为“欧式”,这意味着它使用欧几里得距离来计算数据点之间的距离。但是,我们可以通过提供自定义距离度量函数来覆盖此默认值。
使用 Scipy 定义自定义距离度量
Scipy 提供了 spatial.distance.pdist
函数,可用于计算一组数据点之间的成对距离。我们可以使用此函数来定义自定义距离度量,例如余弦相似度或杰卡德相似系数。
以下是使用余弦相似度定义自定义距离度量的示例:
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
def cosine_distance(X):
# 计算成对余弦相似度
cosine_similarities = 1 - pdist(X, metric='cosine')
# 转换为距离矩阵
cosine_distances = squareform(cosine_similarities)
return cosine_distances
将自定义距离度量与 Scikit-learn 一起使用
一旦我们定义了自定义距离度量,我们就可以将其与 Scikit-learn 的 AgglomerativeClustering
类一起使用。以下是使用我们上面定义的余弦距离度量执行层次聚类的示例:
from sklearn.cluster import AgglomerativeClustering
# 创建聚类器
clusterer = AgglomerativeClustering(n_clusters=3, affinity=cosine_distance)
# 聚类数据
clusterer.fit(X)
# 获取聚类标签
labels = clusterer.labels_
结论
在本文中,我们展示了如何使用 Scikit-learn 和 Scipy 在 Python 中执行层次聚类,同时使用自定义距离度量。通过定义自己的距离度量,我们可以根据特定应用程序的需求来定制聚类过程,从而获得更准确和有意义的结果。