聚类分析是数据挖掘和机器学习领域中的一种重要技术,它通过将相似的数据点分组在一起,帮助我们更好地理解数据的内在结构。评估聚类效果的好坏是聚类分析中的一个关键步骤。以下将详细介绍五种常用的评分指标,帮助你精准评估聚类效果。
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)
以上五种评分指标可以帮助你从不同角度评估聚类效果。在实际应用中,可以根据具体问题和数据特点选择合适的指标进行评估。
