← 返回模型库
MODEL / 评价

熵权法

指标数据完整,希望权重由数据自身的离散程度客观决定,常与 TOPSIS 组合使用。

核心公式

e_j=-\frac{1}{\ln n}\sum_{i=1}^{n}p_{ij}\ln p_{ij},\qquad w_j=\frac{1-e_j}{\sum_{k=1}^{m}\left(1-e_k\right)}

Python 最小示例

下载 .py 文件 ↓

依赖见代码开头;示例在自己的 Python 环境运行,页面不执行代码。用于理解方法,正式参赛请补齐数据检验与误差分析。

Python · 熵权法
# 依赖: 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))

用它研究过哪些问题?

浏览赛题库 →
国赛 · 2026E

SEM 广告投放策略

依据搜索广告的历史展现、点击与转化数据,在预算约束下确定关键词出价与预算分配,使投放效果最优。

优化统计营销
2 个关联模型拆解这道题 →
国赛 · 2025E

AI 辅助智能体测

用摄像头采集的骨骼关键点数据判断学生体测动作是否规范,建立评分模型并给出辅助判定流程。

图像处理数据处理评价
4 个关联模型拆解这道题 →