返回

用 Scikit-learn 和 Scipy 为定制的距离度量执行层次聚类

人工智能

引言

层次聚类是一种无监督机器学习算法,用于将数据点分组到层次结构中。它从每个数据点作为单独簇开始,然后逐步合并最相似的簇,直到形成一个包含所有数据点的单个簇。

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 中执行层次聚类,同时使用自定义距离度量。通过定义自己的距离度量,我们可以根据特定应用程序的需求来定制聚类过程,从而获得更准确和有意义的结果。