scipy 如何在python中使用距离矩阵评估聚类的质量?

sbtkgmzw  于 2023-10-20  发布在  Python
关注(0)|答案(2)|浏览(128)

我正在尝试使用变量之间的相关距离来自定义一个分层聚类过程,并且我需要评估聚类质量。但是,我在python中找到的所有聚类质量评估方法都是面向观察的,并且不使用距离矩阵作为输入。
例如,sci-kit learn、SciPy或clusteval中可用的聚类评估分数不提供如何使用距离矩阵作为输入来计算以下基于距离的质量度量:
1.戴维斯-布尔丁指数
1.卡林斯基哈拉巴斯
1.剪影
你有任何解决方案来访问集群质量使用自定义的距离指标在层次聚类?

基于距离矩阵的层次聚类

DistanceMatrix = 1-abs(pipe6.Stats())
N = DistanceMatrix.shape[0]
score = []
for K in range(2, N-1):
    hclus = skclus.FeatureAgglomeration(n_clusters=K,
                                        linkage="complete",
                                        metric="precomputed")
    hclus.fit(DistanceMatrix)
    clusters = hclus.labels_
    Quality = metrics.davies_bouldin_score(X=DistanceMatrix,
                                           labels=clusters)
    score.append(Quality)
6tdlim6h

6tdlim6h1#

使用Silhouette,您可以使用metric=precomputed并传递距离矩阵。

7dl7o3gd

7dl7o3gd2#

一个可能的解决方案是使用sklearn.cluster模块中的FeatureAgglomeration类,它可以在预先计算的距离矩阵上执行层次聚类。然后,您可以使用sklearn.metrics模块中的davies_bouldin_score函数(该函数可以接受距离矩阵作为输入)来评估聚类质量。
下面是实现这种方法的代码示例:

import sklearn.cluster as skclus
import sklearn.metrics as metrics

DistanceMatrix = 1 - abs(pipe6.Stats()) # correlation distance
N = DistanceMatrix.shape[0]
score = []
for K in range(2, N - 1):
    hclus = skclus.FeatureAgglomeration(n_clusters=K, linkage="complete", metric="precomputed")
    hclus.fit(DistanceMatrix)
    clusters = hclus.labels_
    Quality = metrics.davies_bouldin_score(X=DistanceMatrix, labels=clusters)
    score.append(Quality)

另一种可能的解决方案是使用scipy.cluster.hierarchy模块中的linkage函数,该函数也可以对预先计算的距离矩阵执行分层聚类。但是,您需要将冗余的方阵转换为压缩向量形式,该形式仅包含矩阵的上三角元素。您可以使用scipy.spatial.distance模块中的squareform函数来执行此转换。然后,您可以使用任何接受观测向量数组作为输入的聚类质量度量,例如来自sklearn.metrics modulesilhouette_scorecalinski_harabasz_score
下面是实现这种方法的代码示例:

import scipy.spatial.distance as ssd
import scipy.cluster.hierarchy as sch
import sklearn.metrics as metrics

DistanceMatrix = 1 - abs(pipe6.Stats()) # correlation distance
distArray = ssd.squareform(DistanceMatrix) # condensed distance matrix
Z = sch.linkage(distArray, method="complete", metric="euclidean") # linkage matrix
max_d = 25 # distance threshold for cluster formation
clusters = sch.fcluster(Z, max_d, criterion="distance") # cluster labels
Quality1 = metrics.silhouette_score(X=distArray, labels=clusters) # silhouette score
Quality2 = metrics.calinski_harabasz_score(X=distArray, labels=clusters) # calinski-harabasz score

相关问题