Python实战:用熵权法自动计算指标权重(附完整代码) Python实战用熵权法自动计算指标权重附完整代码当我们需要对多个指标进行综合评价时如何确定每个指标的权重往往是个令人头疼的问题。传统的专家打分法主观性强而层次分析法又需要构建复杂的判断矩阵。今天我要分享的是一个基于数据本身特性的客观赋权方法——熵权法以及如何用Python实现它。1. 熵权法原理与优势熵权法的核心思想来源于信息论中的熵概念。简单来说熵是衡量系统混乱程度的指标。在评价体系中如果一个指标的数据差异越大说明它包含的信息量越多对评价结果的影响也就越大因此应该赋予更高的权重。熵权法的三大优势客观性完全基于数据本身特性计算权重避免人为干扰自动化计算过程可程序化实现适合批量处理适应性适用于大多数多指标评价场景注意熵权法特别适合那些缺乏先验知识或专家经验的评价场景但当某个指标在所有样本中取值几乎相同时该指标的权重会趋近于零。2. 数据准备与预处理在开始编码前我们需要准备合适的数据。假设我们正在评估5家供应商的绩效考虑以下4个指标交货准时率(%)产品质量合格率(%)价格竞争力(分数)售后服务评分(1-5分)import numpy as np # 示例数据5家供应商在4个指标上的表现 data np.array([ [95, 98, 85, 4.5], # 供应商A [90, 95, 90, 4.0], # 供应商B [85, 90, 92, 3.8], # 供应商C [88, 92, 88, 4.2], # 供应商D [92, 96, 86, 4.3] # 供应商E ])2.1 数据标准化处理由于各指标量纲不同我们需要先进行标准化。这里采用极差标准化方法def normalize_data(data): # 对于正向指标越大越好 max_vals np.max(data, axis0) min_vals np.min(data, axis0) normalized (data - min_vals) / (max_vals - min_vals) # 处理可能存在的NaN当某指标所有值相同时 normalized np.nan_to_num(normalized, nan0.5) return normalized normalized_data normalize_data(data) print(标准化后的数据:\n, normalized_data)3. 熵权法核心实现现在我们来编写熵权法的主要计算函数。整个过程分为四个步骤计算指标比重计算信息熵计算差异系数确定权重def entropy_weight(data): # 计算指标比重 proportion data / np.sum(data, axis0) # 计算信息熵加上微小值避免log(0) entropy -np.sum(proportion * np.log(proportion 1e-10), axis0) / np.log(len(data)) # 计算差异系数 diversity 1 - entropy # 计算权重 weights diversity / np.sum(diversity) return weights weights entropy_weight(normalized_data) print(各指标权重:, weights)3.1 代码优化与调试技巧在实际应用中你可能会遇到以下问题及解决方案问题1某些指标在所有样本中取值完全相同解决方案在标准化步骤中增加NaN处理如代码中的nan0.5问题2计算结果不稳定解决方案增加微小值(1e-10)避免数值计算问题问题3需要处理负向指标越小越好解决方案在标准化步骤前对数据进行转换def handle_negative_indicators(data, negative_colsNone): if negative_cols is None: return data # 对负向指标取倒数 data[:, negative_cols] 1 / (data[:, negative_cols] 1e-10) return data4. 结果分析与应用计算完成后我们可以得到各指标的权重。以供应商评估为例指标权重交货准时率0.28产品质量0.25价格竞争力0.32售后服务0.15这个权重分布表明在我们的供应商样本中价格竞争力差异最大因此权重最高售后服务评分在各供应商间差异较小权重最低4.1 综合评分计算有了权重后我们可以计算每家供应商的综合得分def calculate_scores(data, weights): normalized normalize_data(data) scores np.dot(normalized, weights) return scores supplier_scores calculate_scores(data, weights) print(供应商综合得分:, supplier_scores)4.2 结果可视化为了更直观地展示结果我们可以使用matplotlib绘制雷达图import matplotlib.pyplot as plt def plot_radar_chart(categories, values, title): N len(categories) angles np.linspace(0, 2 * np.pi, N, endpointFalse).tolist() values values[:1] angles angles[:1] fig, ax plt.subplots(figsize(6, 6), subplot_kwdict(polarTrue)) ax.fill(angles, values, colorred, alpha0.25) ax.plot(angles, values, colorred, markero) ax.set_xticks(angles[:-1]) ax.set_xticklabels(categories) ax.set_title(title, y1.1) plt.show() # 绘制权重分布雷达图 categories [Delivery, Quality, Price, Service] plot_radar_chart(categories, weights, Indicator Weights Distribution)5. 高级应用与扩展5.1 结合主观权重虽然熵权法是客观赋权方法但我们可以将其与主观赋权法结合得到更全面的评价结果。常见的方法是使用乘法合成def combined_weights(objective_weights, subjective_weights, alpha0.5): alpha: 主观权重占比 return alpha * subjective_weights (1 - alpha) * objective_weights # 示例主观权重 subjective_weights np.array([0.3, 0.3, 0.2, 0.2]) final_weights combined_weights(weights, subjective_weights, alpha0.3)5.2 处理缺失数据实际数据中常有缺失值我们需要适当处理def handle_missing_data(data, strategymean): if strategy mean: col_means np.nanmean(data, axis0) return np.where(np.isnan(data), col_means, data) elif strategy median: col_medians np.nanmedian(data, axis0) return np.where(np.isnan(data), col_medians, data) else: raise ValueError(Unknown strategy)5.3 批量处理多个数据集当需要处理多个相似数据集时我们可以将整个流程封装成类class EntropyWeightCalculator: def __init__(self, negative_colsNone): self.negative_cols negative_cols self.weights None def fit(self, data): processed_data handle_negative_indicators(data, self.negative_cols) normalized_data normalize_data(processed_data) self.weights entropy_weight(normalized_data) return self def transform(self, data): processed_data handle_negative_indicators(data, self.negative_cols) normalized_data normalize_data(processed_data) return calculate_scores(normalized_data, self.weights) def fit_transform(self, data): return self.fit(data).transform(data) # 使用示例 ewc EntropyWeightCalculator() scores ewc.fit_transform(data)在实际项目中我发现封装成类的方式特别适合需要反复应用相同权重计算逻辑的场景比如每月一次的供应商评估。通过保存训练好的权重可以确保评价标准的一致性。