聚类分析是数据挖掘和机器学习领域中的一种重要技术,它通过将相似的数据点分组在一起,帮助我们更好地理解数据的内在结构。评估聚类效果的好坏是聚类分析中的一个关键步骤。以下将详细介绍五种常用的评分指标,帮助你精准评估聚类效果。

1. 调整兰德指数(Adjusted Rand Index, ARI)

调整兰德指数是一种衡量聚类结果一致性的指标,它考虑了聚类结果中元素对的一致性。ARI的值范围从-1到1,值越高表示聚类结果与真实标签的一致性越好。

计算方法

def adjusted_rand_index(true, pred):
    n = len(true)
    contingency_table = [[0 for _ in range(max(pred) + 1)] for _ in range(max(true) + 1)]
    for i in range(n):
        contingency_table[true[i]][pred[i]] += 1

    sum_diag = sum(contingency_table[i][i] for i in range(len(contingency_table)))
    sum_row = sum(contingency_table[i]) for i in range(len(contingency_table))
    sum_col = sum(contingency_table[:, j] for j in range(len(contingency_table[0])))
    sum_all = sum(sum_col)
    ARI = (sum_diag - (sum_row * sum_col) / (2 * sum_all)) / ((n * (n - 1)) / 2)
    return ARI

2. 调整轮廓系数(Adjusted Silhouette Coefficient, ASC)

调整轮廓系数是衡量聚类结果紧密程度和分离程度的指标。其值范围从-1到1,值越高表示聚类效果越好。

计算方法

def adjusted_silhouette_coefficient(X, labels):
    n = len(labels)
    mean_d = np.zeros(n)
    for i in range(n):
        mean_d[i] = np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[j] != labels[i]])
    mean_c = np.zeros(n)
    for i in range(n):
        mean_c[i] = np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[i] == labels[j]])
    ASC = (mean_c - mean_d) / max(mean_c, mean_d)
    return ASC

3.Davies-Bouldin指数(Davies-Bouldin Index, DBI)

Davies-Bouldin指数是衡量聚类结果紧密程度和分离程度的指标。其值越低表示聚类效果越好。

计算方法

def davies_bouldin_index(X, labels):
    n_clusters = len(set(labels))
    if n_clusters == 1:
        return 0
    n = len(X)
    mean_d = np.zeros(n)
    for i in range(n):
        mean_d[i] = np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[j] != labels[i]])
    mean_c = np.zeros(n)
    for i in range(n):
        mean_c[i] = np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[i] == labels[j]])
    DBI = np.sum((mean_d - mean_c) / (mean_d + mean_c)) / (n_clusters - 1)
    return DBI

4. Calinski-Harabasz指数(Calinski-Harabasz Index, CHI)

Calinski-Harabasz指数是衡量聚类结果内部方差和外部方差之比的指标。其值越高表示聚类效果越好。

计算方法

def calinski_harabasz_index(X, labels):
    n_clusters = len(set(labels))
    n = len(X)
    mean_c = np.zeros(n)
    for i in range(n):
        mean_c[i] = np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[i] == labels[j]])
    mean_d = np.zeros(n)
    for i in range(n):
        mean_d[i] = np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[j] != labels[i]])
    CHI = (n - 1) * (sum(mean_c ** 2) / n_clusters) / (sum(mean_d ** 2) / (n_clusters - 1))
    return CHI

5. 聚类轮廓图(Silhouette Plot)

聚类轮廓图是一种可视化工具,用于直观地展示聚类效果。通过计算每个样本的轮廓系数,将其绘制在二维平面上,可以直观地观察到聚类效果。

计算方法

def silhouette_plot(X, labels):
    from sklearn.metrics import silhouette_score
    silhouette_avg = silhouette_score(X, labels)
    print("For n_clusters =", len(set(labels)), "The average silhouette_score is :", silhouette_avg)

以上五种评分指标可以帮助你从不同角度评估聚类效果。在实际应用中,可以根据具体问题和数据特点选择合适的指标进行评估。