You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中计算Wemmert-Gancarski聚类评估指数

问题修复与正确实现

原代码核心错误

  • 未定义k、n_labels变量,运行会直接报错
  • centroidsOut的计算逻辑完全错误:你把当前簇外所有样本合并算均值,这不是「其他所有簇的各自质心」,无法计算到其他簇质心的最小距离
  • 没有对每个样本过滤自身所属簇的质心,直接做除法的维度和逻辑都不匹配

正确计算步骤

  1. 先统一计算所有簇的质心
  2. 遍历每个样本,分别计算:
    • 分子:样本到自身所属簇质心的欧氏距离
    • 分母:样本到所有非自身所属簇质心的欧氏距离的最小值
  3. 计算每个样本的R(M) = 分子/分母
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:42:00