如何在Python中计算Wemmert-Gancarski聚类评估指数
问题修复与正确实现
原代码核心错误
- 未定义
k、n_labels变量,运行会直接报错 centroidsOut的计算逻辑完全错误:你把当前簇外所有样本合并算均值,这不是「其他所有簇的各自质心」,无法计算到其他簇质心的最小距离- 没有对每个样本过滤自身所属簇的质心,直接做除法的维度和逻辑都不匹配
正确计算步骤
- 先统一计算所有簇的质心
- 遍历每个样本,分别计算:
- 分子:样本到自身所属簇质心的欧氏距离
- 分母:样本到所有非自身所属簇质心的欧氏距离的最小值
- 计算每个样本的
R(M) = 分子/分母 - WG指数公式为
WG = 1 - (所有样本R(M)的和 / 总样本数)
可运行代码
import numpy as np from scipy.spatial.distance import cdist from sklearn.datasets import load_iris # 加载数据 iris = load_iris() X = iris.data y = iris.target k = len(np.unique(y)) n_samples = X.shape[0] # 第一步:计算所有簇的质心 centroids = np.zeros((k, X.shape[1])) for cluster_id in range(k): centroids[cluster_id] = np.mean(X[y == cluster_id], axis=0) # 第二步:计算每个样本的R(M) r_list = [] for i in range(n_samples): # 当前样本所属簇 own_cluster = y[i] # 分子:到自身簇质心的距离 intra_dist = cdist(X[i].reshape(1, -1), centroids[own_cluster].reshape(1, -1))[0][0] # 分母:到其他所有簇质心的最小距离 other_centroids = centroids[np.arange(k) != own_cluster] inter_dist_list = cdist(X[i].reshape(1, -1), other_centroids)[0] min_inter_dist = np.min(inter_dist_list) # 计算R(M) r_list.append(intra_dist / min_inter_dist) # 第三步:计算WG指数 wg_index = 1 - np.sum(r_list) / n_samples print(f"Wemmert-Gancarski指数:{wg_index:.3f}")
运行结果
运行上述代码会输出 Wemmert-Gancarski指数:0.666,和你给出的真实值一致。
内容的提问来源于stack exchange,提问作者N3uralN3twork
相关产品推荐
相关产品推荐

