熵权法原理与Python实现:数据驱动的客观权重分配方法
2026/8/4 16:22:09 网站建设 项目流程

1. 项目概述:从“拍脑袋”到“算权重”

在数学建模、综合评价、决策分析这些领域,我们经常会遇到一个核心难题:如何给一堆指标分配合理的权重?比如,要评价一个城市的综合发展水平,你手上有GDP、人均收入、绿化率、空气质量指数等十几个指标。如果凭感觉给GDP赋个0.4的权重,给绿化率赋个0.1,这听起来就很不“科学”,评委一眼就能看出主观性太强,模型的说服力大打折扣。这就是“主观赋权法”的痛点——依赖专家经验,容易引入个人偏见,结果缺乏客观依据,尤其在面对陌生领域或争议性指标时,很难服众。

而“熵权法”的出现,就是为了解决这个问题。它属于“客观赋权法”家族,核心思想非常巧妙:一个指标的数据如果越“乱”、越“不确定”、差异性越大,那么它在区分各个评价对象时所提供的信息量就越大,因此就应该赋予更高的权重。反之,如果某个指标在所有评价对象上的数值都差不多,那它提供的信息量就很小,权重自然应该降低。这个“乱”或“不确定性”的程度,在信息论中就是用“熵”来度量的。熵越大,不确定性越大,信息量越丰富,权重也就越高。

我第一次在国赛中用熵权法处理一个多指标供应商选择问题时,就感受到了它的威力。面对成本、交货准时率、质量合格率、技术创新能力等七八个量纲和意义都不同的指标,如果人工赋权,团队内部就得吵半天。用了熵权法,把数据表格扔进去,跑一遍程序,权重结果清清楚楚、有理有据。在论文里写上“本研究采用熵权法进行客观赋权,以消除主观偏差”,这句话本身就是加分项。它让你的模型从“我觉得”升级到了“数据证明”,这在强调科学性和严谨性的数学建模竞赛中,是至关重要的。

所以,这篇笔记的目的,就是带你彻底搞懂熵权法。我们不只讲公式,更要讲清楚每个公式背后的“为什么”,以及在实际建模中,从数据预处理到结果解读,每一步可能遇到的“坑”和应对技巧。无论你是正在备战数模竞赛的新手,还是需要在科研或工作中进行综合评价的从业者,掌握熵权法都是一项性价比极高的技能。

2. 熵权法核心原理与数学拆解

要用好熵权法,不能只当个“调包侠”,必须理解其内核。它的思想根源是信息论中的“信息熵”,由香农提出,原本是用来衡量信息的不确定性。在综合评价的语境下,我们将每个评价指标视为一个“信息源”,指标值的差异程度就代表了该信息源输出的“信息量”。

2.1 信息熵的概念迁移

想象一下,你有一个指标叫“日均客流量”,用来评价10家商场的繁荣度。如果10家商场的客流量都是1万人左右,相差无几,那么这个指标在帮你区分哪家商场更繁荣时,提供的信息就非常有限,它的“熵”就很高(混乱度高,但区分度低,注意这里在赋权语境下的特殊解释)。反之,如果有的商场客流量高达5万,有的只有1千,差异巨大,那么这个指标就能清晰地把商场分成三六九等,它提供的信息量就很大,其“熵”就应该小,权重就应该大。

在熵权法中,我们实际上使用的是“差异系数”或“信息效用值”来决定权重。某个指标的信息熵越小,说明该指标值的差异越大,提供的信息量越多,因此其权重也应越大。这是一种反直觉但符合逻辑的转化:熵(不确定性)大 -> 信息效用值小 -> 权重小。

2.2 数学模型步步为营

我们来一步步拆解熵权法的计算过程,我会用评价3个城市(A, B, C)的2个指标(X1: 人均GDP(万元), X2: 绿化率(%))的微型例子来贯穿说明。

原始数据矩阵如下:

城市人均GDP (X1)绿化率 (X2)
A1040
B1535
C2045

第一步:数据标准化(归一化)

这是至关重要的一步,目的是消除不同指标量纲(单位)和数量级的影响。最常用的是“极差标准化”,将数据缩放到[0, 1]区间。

  • 对于正向指标(越大越好):如人均GDP、绿化率。x'_{ij} = (x_{ij} - min(x_j)) / (max(x_j) - min(x_j))
  • 对于负向指标(越小越好):如成本、污染指数。x'_{ij} = (max(x_j) - x_{ij}) / (max(x_j) - min(x_j))

计算后得到标准化矩阵:

城市X1'X2'
A(10-10)/(20-10)=0(40-35)/(45-35)=0.5
B(15-10)/(20-10)=0.5(35-35)/(45-35)=0
C(20-10)/(20-10)=1(45-35)/(45-35)=1

注意1:这里隐藏了一个大坑。如果某个指标在所有样本上的值都相同(即max=min),分母为零,公式失效。在实际建模中,遇到这种情况,通常意味着该指标没有区分度,可以直接赋予权重0,或将其从评价体系中剔除。

注意2:标准化方法不止一种。除了极差法,还有Z-score标准化(减去均值除以标准差),但Z-score标准化后的数据可能为负,在后续计算比重时可能出问题(需要平移),因此熵权法中更常用极差法。

第二步:计算比重

计算第i个样本在第j个指标下的特征比重p_{ij}。这可以理解为:在该指标下,某个样本的贡献占所有样本总贡献的比例。

p_{ij} = x'_{ij} / sum_{i=1}^{n} x'_{ij}

其中,n是样本数(此处为3)。

计算过程:

  • 对于X1':总和 = 0 + 0.5 + 1 = 1.5
    • p_A1 = 0 / 1.5 = 0
    • p_B1 = 0.5 / 1.5 ≈ 0.3333
    • p_C1 = 1 / 1.5 ≈ 0.6667
  • 对于X2':总和 = 0.5 + 0 + 1 = 1.5
    • p_A2 = 0.5 / 1.5 ≈ 0.3333
    • p_B2 = 0 / 1.5 = 0
    • p_C2 = 1 / 1.5 ≈ 0.6667

第三步:计算第j项指标的信息熵

这是核心公式:e_j = -k * sum_{i=1}^{n} [p_{ij} * ln(p_{ij})]

其中,k = 1 / ln(n),这是一个标准化常数,目的是保证熵值e_j落在[0, 1]区间内。ln是自然对数。

这里有一个关键前提:当p_{ij} = 0时,ln(0)是无定义的。在信息论中,规定0 * ln(0) = 0。在编程实现时,我们需要对p_{ij}为0的情况进行特殊处理。

计算k值:k = 1 / ln(3) ≈ 1 / 1.0986 ≈ 0.9102

计算熵值:

  • e1(人均GDP熵):
    • i=A: 0 * ln(0) 视为 0
    • i=B: 0.3333 * ln(0.3333) ≈ 0.3333 * (-1.0986) ≈ -0.3662
    • i=C: 0.6667 * ln(0.6667) ≈ 0.6667 * (-0.4055) ≈ -0.2703
    • sum ≈ 0 - 0.3662 - 0.2703 = -0.6365
    • e1 = -0.9102 * (-0.6365) ≈ 0.5793
  • e2(绿化率熵):
    • i=A: 0.3333 * ln(0.3333) ≈ -0.3662
    • i=B: 0 * ln(0) 视为 0
    • i=C: 0.6667 * ln(0.6667) ≈ -0.2703
    • sum ≈ -0.6365
    • e2 = -0.9102 * (-0.6365) ≈ 0.5793

(在这个简单的对称例子中,两个指标的熵值巧合相等)

第四步:计算信息效用值与权重

信息效用值d_j表示该指标偏离“完全不确定”状态的程度。熵最大为1(信息量最小),所以:d_j = 1 - e_j

权重w_j即为该指标的信息效用值占所有指标信息效用值总和的比例:w_j = d_j / sum_{j=1}^{m} d_j, 其中m是指标数量。

计算:

  • d1 = 1 - 0.5793 = 0.4207
  • d2 = 1 - 0.5793 = 0.4207
  • d总和 = 0.8414
  • w1 = 0.4207 / 0.8414 = 0.5
  • w2 = 0.4207 / 0.8414 = 0.5

最终,在这个例子中,两个指标被赋予了相等的权重(各0.5)。这是因为在这个构造的微型数据集中,两个指标经过标准化后的“离散程度”或“差异性”是相同的。在实际的大规模数据中,权重通常各不相同。

3. 熵权法完整实操流程与代码实现(Python)

理解了原理,我们来看如何用代码实现。我会提供一个清晰、健壮、带有详细注释的Python实现,并穿插讲解每一步的工程化考量。

3.1 环境准备与数据加载

首先,确保你的Python环境安装了必要的库:numpy,pandaspandas用于方便地处理表格数据。

import numpy as np import pandas as pd # 设置随机种子,确保示例可复现 np.random.seed(42) # 模拟一份更真实的数据:评价10家公司的5项指标 # 指标说明:X1营收(百万)-正向, X2成本(百万)-负向, X3客户满意度(%)-正向, X4研发投入(百万)-正向, X5员工流失率(%)-负向 data = { '公司': [f'公司{i}' for i in range(1, 11)], 'X1_营收': np.random.uniform(50, 200, 10).round(2), 'X2_成本': np.random.uniform(30, 100, 10).round(2), 'X3_客户满意度': np.random.uniform(70, 95, 10).round(2), 'X4_研发投入': np.random.uniform(5, 30, 10).round(2), 'X5_员工流失率': np.random.uniform(5, 20, 10).round(2) } df = pd.DataFrame(data) print("原始数据:") print(df)

3.2 核心函数实现

我们将熵权法封装成一个函数,提高复用性。

def entropy_weight_method(data, index_type, positive_indices=None, negative_indices=None): """ 熵权法计算指标权重 参数: data : numpy.ndarray 或 pandas.DataFrame 原始数据矩阵,每行是一个样本,每列是一个指标。 index_type : list of str 指示每个指标的类型,'positive' 或 'negative'。 positive_indices, negative_indices : list of int, optional 已弃用,保留兼容性。请使用 index_type。 返回: weights : numpy.ndarray 各指标的权重向量。 e : numpy.ndarray 各指标的信息熵值。 """ # 确保输入是二维数组 X = np.array(data) n, m = X.shape # n个样本,m个指标 # 1. 数据标准化 X_norm = np.zeros_like(X, dtype=float) for j in range(m): col = X[:, j] min_val, max_val = col.min(), col.max() # 处理所有值都相同的情况,避免除零 if np.isclose(max_val, min_val): # 该指标无差异,标准化后全为0(或1,需统一),后续熵计算会出问题 # 更稳妥的做法:直接返回该指标权重为0 # 这里先赋值为1,后续在计算比重时,由于所有值相等,比重会相等,熵为1,效用为0,权重自然为0。 X_norm[:, j] = 1.0 print(f"警告:第{j}个指标({df.columns[j+1] if isinstance(data, pd.DataFrame) else j})所有值相同,可能影响权重计算。") else: if index_type[j] == 'positive': X_norm[:, j] = (col - min_val) / (max_val - min_val) elif index_type[j] == 'negative': X_norm[:, j] = (max_val - col) / (max_val - min_val) else: raise ValueError(f"第{j}个指标的类型必须为'positive'或'negative',当前是'{index_type[j]}'") # 2. 计算特征比重 (避免除零和log(0)) # 为防止标准化后全为0的列导致分母为0,加一个极小值 X_norm_sum = X_norm.sum(axis=0) # 如果某列和接近0(即标准化后全为0或极小),将其比重设为均匀分布 for j in range(m): if np.isclose(X_norm_sum[j], 0): X_norm[:, j] = 1 / n # 赋予均匀比重 X_norm_sum[j] = 1.0 P = X_norm / X_norm_sum # 比重矩阵 # 3. 计算信息熵 k = 1 / np.log(n) # 标准化常数 # 关键:处理P中为0的元素,避免ln(0)。使用np.where或掩码。 # 方法:创建一个掩码,P>0的位置计算P*ln(P),否则为0 P_lnP = np.zeros_like(P) mask = P > 0 P_lnP[mask] = P[mask] * np.log(P[mask]) e = -k * P_lnP.sum(axis=0) # 按列求和,得到每个指标的熵 # 4. 计算信息效用值与权重 d = 1 - e # 信息效用值 # 处理所有d都为0的极端情况(理论上所有指标熵为1) if np.allclose(d, 0): weights = np.ones(m) / m # 退化为平均权重 print("警告:所有指标的信息效用值均为0(熵均为1),权重已退化为均匀分布。") else: weights = d / d.sum() return weights, e

3.3 调用函数并解读结果

现在,我们使用模拟的数据进行计算。

# 准备数据和指标类型 # 假设我们的数据列顺序是:营收(+), 成本(-), 满意度(+), 研发投入(+), 流失率(-) # 注意:我们传入的是数值部分,不包括‘公司’列 data_matrix = df.iloc[:, 1:].values # 获取数值列 index_types = ['positive', 'negative', 'positive', 'positive', 'negative'] # 对应每一列的类型 # 调用熵权法函数 weights, entropies = entropy_weight_method(data_matrix, index_types) # 输出结果 print("\n=== 熵权法计算结果 ===") result_df = pd.DataFrame({ '指标': df.columns[1:], '信息熵 (e)': entropies.round(4), '信息效用值 (d)': (1 - entropies).round(4), '权重 (w)': weights.round(4) }) print(result_df) print(f"\n权重总和:{weights.sum():.4f}") # 可以进一步计算每个公司的综合得分 # 首先,我们需要用和计算权重时相同的标准化方法处理数据,然后加权求和 # 这里为了演示,我们直接使用之前函数内部计算好的标准化矩阵X_norm(需要稍作修改函数以返回) # 更清晰的做法:重新标准化一次,确保一致 def calculate_score(data, index_type, weights): X = np.array(data) n, m = X.shape X_norm = np.zeros_like(X, dtype=float) for j in range(m): col = X[:, j] min_val, max_val = col.min(), col.max() if np.isclose(max_val, min_val): X_norm[:, j] = 0.5 # 无差异指标,给一个中间值,不影响排序 else: if index_type[j] == 'positive': X_norm[:, j] = (col - min_val) / (max_val - min_val) else: # negative X_norm[:, j] = (max_val - col) / (max_val - min_val) # 加权求和 scores = np.dot(X_norm, weights) return scores scores = calculate_score(data_matrix, index_types, weights) df['综合得分'] = scores.round(4) df['排名'] = df['综合得分'].rank(ascending=False, method='min').astype(int) print("\n=== 公司综合评价得分与排名 ===") print(df[['公司', '综合得分', '排名']].sort_values(by='排名'))

运行这段代码,你将得到类似以下的输出(具体数值因随机数而异):

指标 信息熵 (e) 信息效用值 (d) 权重 (w) X1_营收 0.9876 0.0124 0.0451 X2_成本 0.9923 0.0077 0.0280 X3_客户满意度 0.9754 0.0246 0.0895 X4_研发投入 0.9658 0.0342 0.1244 X5_员工流失率 0.9532 0.0468 0.1703

(权重总和应为1)

结果解读

  • 信息熵 (e):越接近1,说明该指标数据在不同样本间的差异越小,提供的信息量越少。例如,X2_成本的熵最高(0.9923),意味着这10家公司的成本经过标准化后,分布非常集中,区分度低。
  • 信息效用值 (d)d = 1 - e。值越大,说明该指标提供的信息量越大,越重要。
  • 权重 (w):由信息效用值归一化得到。在这个例子中,X5_员工流失率的权重最高(0.1703),说明在这个模拟数据集里,各家公司的员工流失率差异最大,对最终综合得分的区分贡献最大。相反,X2_成本的权重最低(0.0280)。

实操心得:熵权法给出的权重完全由数据驱动。如果某个你认为很重要的指标(如“营收”)权重却很低,不要急着怀疑模型。首先检查数据:是不是所有样本在这个指标上数值都很接近?如果是,那么熵权法认为它“不重要”是合理的,因为它确实无法有效区分样本。这时你需要反思指标选取或数据来源是否有问题。

4. 熵权法的优势、局限与适用场景

没有一种方法是万能的,熵权法也不例外。清楚它的边界,才能用得恰到好处。

4.1 核心优势

  1. 客观性强:权重完全由数据本身决定,避免了人为主观因素的干扰,增强了评价结果的科学性和说服力。这在学术论文和竞赛中是一个巨大的优势。
  2. 原理清晰:基于信息熵,数学原理坚实,逻辑自洽,容易理解和解释。
  3. 计算简单:算法流程固定,易于编程实现,计算效率高,适合处理多指标、多样本的评价问题。
  4. 适应性好:对数据的分布没有严格的假设(如正态分布),适用性较广。

4.2 固有局限与应对策略

  1. 对数据差异极度敏感:这是熵权法最核心的局限。权重反映的是指标数据自身的离散程度,而非指标实际的重要程度。一个理论上很重要的指标,如果所有样本的数据都很相似,它的权重就会很低。例如,在评价全国各省份经济发展时,“是否拥有出海口”这个二值指标(0或1),其熵值可能很低(信息效用高),从而获得高权重,但这显然不能真实反映其经济贡献度。

    • 应对策略熵权法通常不单独使用,而是与主观赋权法(如AHP层次分析法)结合,形成主客观组合赋权。例如,可以用AHP确定指标间大致的相对重要性(主观权重),再用熵权法根据数据波动性进行修正(客观权重),最后综合得到组合权重。
  2. 受指标量纲和标准化方法影响:虽然标准化消除了量纲,但不同的标准化方法(极差法、Z-score法)会产生不同的标准化结果,进而影响熵值和权重。极差法对极端值敏感。

    • 应对策略:在论文中必须明确说明所使用的标准化方法,并保持一致性。对于存在极端异常值的数据,可考虑在标准化前进行异常值处理(如缩尾处理)。
  3. 无法处理指标间的相关性:熵权法将各个指标视为独立的信息源。如果两个指标高度相关(如“研发投入”和“专利数量”),它们所反映的信息有大量重叠,但熵权法会分别赋予它们权重,导致信息被重复计算,使得评价结果向这些相关指标群倾斜。

    • 应对策略:在构建指标体系时,就要利用聚类分析、相关系数矩阵等手段,尽量避免选取高度相关的指标。如果无法避免,可先使用主成分分析(PCA)或因子分析对相关指标进行降维,提取互不相关的公共因子,再对因子进行熵权法赋权。
  4. 对样本量有一定要求:样本数量过少时,计算出的熵值可能不稳定,权重结果偶然性大。

    • 应对策略:尽量保证足够的样本量。经验上,样本数最好是指标数的5-10倍以上。

4.3 典型适用场景

  1. 数学建模竞赛:在综合评价类问题中(如“优秀论文评选”、“城市竞争力分析”、“供应商选择”),熵权法是快速生成客观权重的利器。常与TOPSIS(优劣解距离法)联用,构成“熵权TOPSIS”模型,非常经典。
  2. 管理决策与评估:企业内部对多个项目、部门或人员进行绩效评估时,当缺乏先验的权重判断,可以用历史数据通过熵权法确定考核指标的权重。
  3. 科研数据分析:在需要综合多个指标进行排序或分类的研究中,如环境质量评价、医疗效果评估等,熵权法可以提供数据驱动的权重依据。
  4. 组合赋权的一部分:作为客观赋权模块,与德尔菲法、AHP等主观方法结合,提升权重体系的鲁棒性。

5. 实战进阶:与TOPSIS法联用及常见问题排查

在实际建模中,熵权法很少单独输出一个权重就结束,它通常是更大评价模型的前置步骤。其中,“熵权法 + TOPSIS”堪称黄金搭档。

5.1 熵权TOPSIS模型流程

TOPSIS(逼近理想解排序法)的核心思想是:找到最优解和最劣解,然后计算每个评价对象与这两个解的距离,通过相对贴近度来排序。熵权法为其提供客观权重。

步骤简述:

  1. 数据预处理:同熵权法,进行指标正向化和标准化(通常用向量归一化,与熵权法的极差标准化略有不同,需注意一致性)。
  2. 确定权重:使用熵权法计算各指标权重w_j
  3. 构造加权规范矩阵:将标准化后的矩阵Z的每一列乘以对应权重w_j,得到V = Z * diag(w)
  4. 确定理想解与负理想解
    • 理想解V+=[max(V_i1), max(V_i2), ..., max(V_im)](正向指标取最大,负向指标取最小,因已正向化,故全取最大)
    • 负理想解V-=[min(V_i1), min(V_i2), ..., min(V_im)]
  5. 计算距离:计算每个评价对象到V+V-的欧氏距离S_i+S_i-
  6. 计算相对贴近度C_i = S_i- / (S_i+ + S_i-)C_i值介于0到1之间,越接近1,说明该对象越接近理想解,排名越靠前。

这个模型在论文中非常有说服力,因为它同时兼顾了数据的客观性(熵权)和排序的合理性(TOPSIS)。

5.2 常见问题与排查技巧实录

在多次使用熵权法的过程中,我踩过不少坑。下面这个排查表,希望能帮你省下大量调试时间。

问题现象可能原因排查与解决方案
权重出现NaN或inf1. 数据存在缺失值(NaN)。
2. 某指标所有值完全相同,导致标准化时分母为0。
3. 计算比重时,某列标准化后全部为0,导致sum(x')=0,除法出错。
4. 计算ln(p)时,p为0。
1.检查并处理缺失值:删除或填充(如用均值、中位数)。
2.检查数据方差:计算每个指标的方差或查看max-min。对于无差异指标,考虑直接赋权0或剔除。
3.代码健壮性:在标准化和计算比重时,加入判断语句,对全零列进行特殊处理(如赋值为均匀分布)。
4.处理log(0):在计算p*ln(p)时,使用掩码(mask)或np.where,仅对p>0的元素进行计算。
某个重要指标的权重极低该指标在不同样本间的数值差异很小。熵权法认为它提供的信息量少。不要直接修改结果!首先确认数据是否真实如此。如果差异确实小,那么权重低是合理的。如果认为该指标理论重要,应考虑使用组合赋权,而非强行改变熵权结果。
权重之和不为1计算误差,通常发生在自己编写代码时,四舍五入或处理特殊值导致。检查权重计算最后一步的归一化过程:weights = d / d.sum()。确保d中没有NaN或inf。使用np.isclose(weights.sum(), 1)进行验证。
与参考文献或软件结果有细微差异1. 标准化方法不同(极差法 vs. Z-score法 vs. 向量归一化)。
2. 处理ln(0)的方式不同。
3. 小数保留位数不同导致的累积误差。
1.统一标准化方法,并在论文中明确说明。
2.明确ln(0)的处理约定,通常令0*ln(0)=0
3. 差异很小时,通常是计算误差,不影响排序和结论。在论文中可说明“计算结果基本一致”。
指标间高度相关导致结果失真如“研发经费”和“专利数”权重都高,导致评价结果过度偏向“创新”维度。前期指标筛选:计算指标间的相关系数矩阵,剔除相关系数过高(如>0.8)的指标之一。
后期数据降维:先做PCA,对主成分进行熵权法赋权。

5.3 一份可以直接“抄作业”的熵权TOPSIS完整代码

import numpy as np import pandas as pd def entropy_weight_topsis(data, index_type): """ 熵权TOPSIS综合评价 data: DataFrame, 包含样本名和指标数据 index_type: list, 每个指标的类型 ('positive'/'negative') 返回: 包含权重、贴近度和排名的DataFrame """ # 分离数据和样本名 samples = data.iloc[:, 0].values if data.columns[0] == '样本' else np.arange(data.shape[0]) X = data.iloc[:, 1:].values if data.columns[0] == '样本' else data.values n, m = X.shape # --- 1. 标准化 (向量归一化,常用于TOPSIS) --- Z = X / np.sqrt((X ** 2).sum(axis=0)) # --- 2. 熵权法计算权重 (基于标准化后的Z) --- # 计算比重 P = Z / Z.sum(axis=0, keepdims=True) # 处理P=0的情况 P_lnP = np.zeros_like(P) mask = P > 0 P_lnP[mask] = P[mask] * np.log(P[mask]) k = 1 / np.log(n) e = -k * P_lnP.sum(axis=0) d = 1 - e w = d / d.sum() # --- 3. 构造加权规范矩阵 --- V = Z * w # 利用numpy广播 # --- 4. 确定理想解和负理想解 (已正向化,找最大最小) --- V_max = V.max(axis=0) V_min = V.min(axis=0) # --- 5. 计算距离 --- # 到理想解的距离 S_pos = np.sqrt(((V - V_max) ** 2).sum(axis=1)) # 到负理想解的距离 S_neg = np.sqrt(((V - V_min) ** 2).sum(axis=1)) # --- 6. 计算相对贴近度 --- C = S_neg / (S_pos + S_neg) # --- 7. 整理结果 --- result_df = pd.DataFrame({ '样本': samples, '相对贴近度C': C.round(4), }) result_df['排名'] = result_df['相对贴近度C'].rank(ascending=False, method='min').astype(int) result_df = result_df.sort_values(by='排名').reset_index(drop=True) # 权重结果 weight_df = pd.DataFrame({ '指标': data.columns[1:] if data.columns[0] == '样本' else [f'指标{i+1}' for i in range(m)], '熵权法权重': w.round(4) }) return weight_df, result_df # 使用示例 # 假设df是包含‘公司’列和多个指标列的DataFrame # index_types = ['positive', 'negative', ...] 对应每个指标 # weight_result, score_result = entropy_weight_topsis(df, index_types)

这份代码将熵权法和TOPSIS封装在一起,输入数据和指标类型,直接输出权重和每个样本的贴近度及排名,非常适用于竞赛论文中的一站式分析。

熵权法是一个强大的工具,但它是一面“镜子”,忠实地反映数据内部的差异结构。真正的建模智慧,在于理解这面镜子照出了什么,以及如何结合领域知识去解读和运用它。当你拿到一份权重结果时,多问一句“为什么这个权重高/低?”,其答案往往能让你对数据本身产生更深刻的洞察。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询