# 依赖: numpy import numpy as np def entropy_weight(X, benefit=None): X = np.asarray(X, dtype=float) if X.ndim != 2 or X.shape[0] < 2 or X.shape[1] < 1 or not np.isfinite(X).all(): raise ValueError('需要至少两个方案和一个指标,且数据必须有限') benefit = np.ones(X.shape[1], dtype=bool) if benefit is None else np.asarray(benefit, bool) if benefit.shape != (X.shape[1],): raise ValueError('指标方向数量与列数不一致') span = np.ptp(X, axis=0) active = span > 1e-12 if not active.any(): raise ValueError('所有指标均为常量,无法从差异中确定熵权') Xn = (X - X.min(axis=0)) / np.where(active, span, 1) Xn[:, ~benefit] = 1 - Xn[:, ~benefit] P = (Xn + 1e-12) / (Xn + 1e-12).sum(axis=0, keepdims=True) divergence = np.maximum(0, 1 + (P*np.log(P)).sum(axis=0) / np.log(len(X))) divergence[~active] = 0 # 无区分度的常量指标不获得权重 if divergence.sum() <= 1e-12: raise ValueError('差异不足以稳定确定熵权') return divergence / divergence.sum() print('权重 =', entropy_weight([[1, 10], [2, 20], [3, 12]], benefit=[True, False]).round(4))