多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

改进熵权法详解:从信息熵原理到Excel综合评价实操

改进熵权法详解:从信息熵原理到Excel综合评价实操 做综合评价绕不开三件事指标体系怎么建、权重怎么定、综合得分怎么算。指标体系大家都会画个树状图综合得分一个加权求和就能出来真正让人头疼的是中间那个“权重”。你要是拍脑袋定评审一句“依据是什么”就能让你哑火你要是每个指标都找专家打分流程繁琐不说专家意见还经常互相打架。我自己这几年做论文和项目里的多指标评价用得最顺手的方案就是客观赋权中的改进熵权法——不需要专家打分权重完全由指标数据自身的信息量决定Excel就能跑整个过程透明、可复现、还能经得住追问。这篇文章就把这件事彻底讲透为什么选熵权法、哪些地方需要“改进”、以及如何只靠一个Excel模板跑完整套综合评价流程。无论你是为了写毕业论文还是给公司做KPI考核、供应商评价这篇都可以直接拿来参考。1. 先想清楚综合评价到底在解决什么问题1.1 从一次供应商评标说起想象一个场景要给某条生产线选备选供应商技术部报上来5家厂商你需要从“产品质量”“供货准时率”“价格竞争力”“售后响应速度”“创新能力”五个维度打分。每个维度都有自己的量纲质量是合格率百分比价格是报价金额售后是响应小时数。你不可能把它们直接相加于是第一步必须做“标准化”把不同量纲压到同一把尺子上第二步必须定“权重”说明为什么产品质量比价格更重要、重要多少。这就是综合评价的标准流程指标处理、权重计算、加权求和。看起来简单但实操过的人都懂指标怎么处理决定了数据质量权重怎么计算决定了结果能不能站住脚。我之前见过很多初稿指标选得很好数据也齐结果在权重环节用了“专家打分法”——请了三位同事打了个平均分评审会上被追问“专家是哪些人判断依据是什么”当场答不上来。这就是主观赋权天然的软肋可重复性差说服力弱。1.2 指标体系方向比算法重要做综合评价很多人一上来就急着找算法这是本末倒置。算法只能处理你已经整理好的数据如果你指标选得有问题后面算得多花哨都是白搭。指标体系至少要过三关。第一是相关性关两个指标如果本质在测同一件事比如“客户满意度”和“用户复购率”放一起会产生信息冗余熵权法会给出“折扣权重”但因为冗余而压低的权重并不代表业务意义。第二是方向关每个指标必须明确是正向还是负向比如“缺陷率”是越低越好如果不做反向处理这个指标会把排名往错误方向拉。第三是数据质量关指标数据本身不能有大量缺失或明显的异常值否则所有客观赋权算法都会失真。所以我会先搭指标表按“一级维度—二级指标—指标方向—数据来源”四列列清楚。这一步看着笨实际上是最省时间的。多少个对象、多少个指标都无所谓这里只求清单齐全、方向正确。方向这一关尤其要谨慎很多人在Excel里漏了负向指标的取反最后权重和得分全部错位排查起来相当痛苦。1.3 客观赋权和主观赋权怎么选赋权方法大致分两类。主观赋权有层次分析法AHP、专家评分法、德尔菲法优势是能体现业务经验和战略倾向劣势是主观性强、流程重。客观赋权有熵权法、CRITIC法、变异系数法、主成分法优势是数据驱动、可复现、适合做实证支撑劣势是完全脱离业务经验偶尔会给出“数据看着重要、业务觉得离谱”的权重。我的建议不是“二选一”而是按用途选。如果是写论文做实证分析评审更看重客观性和可复现性客观赋权尤其是熵权法操作简单、公式成熟、解释起来方便。如果是企业内部管理咨询建议主观和客观结合用熵权法跑一组客观权重再和业务方的主观判断对比找出差异最大的指标重点讨论。本文的改进熵权法属于“客观为主、可扩展结合”的路线算是性价比最高的一种选择。2. 熵权法的原理信息熵如何“挤出”权重2.1 熵是混乱程度不是热力学信息熵这个概念来自信息论描述的是系统的不确定性。熵值越大说明系统越混乱、越没有规律熵值越小说明系统越有序、信息量越大。这个思想用在权重计算里有一个非常直观的对应某个指标如果每个评价对象的值都差不多那这个指标对“区分谁好谁差”几乎没有贡献它的信息量小权重就该低反过来如果某个指标在各对象之间差异极大高高低低一眼就能拉开差距那它对排序的贡献大权重就该高。我举个生活化的例子。全班考试语文成绩人人都在85到90分之间数学成绩从40分到100分都有。你作为班主任想给总分排名定权重语文再怎么考也拉不开差距对排名的区分作用很小数学却能把学生迅速分成几个梯队。熵权法的逻辑就是这样用数据的离散程度衡量“区分能力”区分能力越强权重越高。2.2 离散程度越大权重越高的直觉验证你可能会问为什么不用方差或标准差直接定权重非要绕一圈熵值因为方差只考虑了绝对离散没有考虑离散的“分布形态”。熵会惩罚极端化的分布而对均匀扩散的分布更宽容。比如两个指标方差相近但一个数据集中在两端、一个数据均匀铺开它们的区分能力实际上不同熵能更细腻地刻画这种差异。这也是熵权法区别于变异系数法的地方。变异系数就是标准差除以均值算起来更快但对数据和分布形态的敏感度不如熵。综合评价场景往往指标量纲各异、分布形态不一熵值处理这种“混合状态”更合适尤其是经过标准化后熵值有相对稳定的计算范围解释也方便。2.3 基础熵权法的三步公式假设有 m 个评价对象、n 个评价指标原始数据为矩阵 X基础熵权法分三步第一步标准化。最常用的是极差标准化正向指标用 (x - min)/(max - min)负向指标用 (max - x)/(max - min)得到 0 到 1 之间的数值。第二步算比重和熵值。先算每个对象在该指标下的比重 p_ij x_ij / Σ x_ij也就是把标准化后的同一指标列做归一化使每列和为 1。然后按信息熵公式 e_j -1 / ln(m) × Σ p_ij × ln(p_ij) 这个熵值 e_j 的范围在 0 到 1 之间越小说明指标携带的区分信息越多。第三步算差异系数和权重。差异系数 d_j 1 - e_jd_j 越大代表该指标信息量越大最终权重 w_j d_j / Σ d_j。最后得到每个对象的综合得分S_i Σ w_j × x_ij。整个流程就是六个Excel列的事后面我会拆开细讲。3. 经典熵权法的三个硬伤与改进思路3.1 硬伤一极差标准化被异常值带偏基础熵权法最常用极差标准化公式简单但极差标准化极度依赖数据中的最大值和最小值。只要数据里混进一个异常离群点max 和 min 就会被这个点拉得很远其他对象的标准化值全部被压缩到很窄的区间里。比如某指标正常范围是20到40一个误录入的200会让其他对象的标准化值全部掉到0到0.1之间这些对象之间的细微差异几乎被“抹平”熵值也会跟着失真。正因如此我在改进方案里加了一步标准化之前先做异常值预处理。实操中用箱线图或者缩尾法把超出合理范围的值截断到5%分位和95%分位再把截断后的结果拿去做极差标准化。这样做的好处是让权重更多反映“正常样本”的区分信息而不是被一两个极端样本绑架。3.2 硬伤二0和1的边界让ln“报错”基础公式里 p_ij × ln(p_ij) 有一个天然问题当标准化后的值正好等于0或者某一列经过归一化后某个对象占比为0ln(0) 是无定义的。很多初学者在Excel里直接拖公式得到 #NUM! 错误然后就开始怀疑人生。更隐蔽的麻烦是边界值的影响。即使用“加一个小常数平移”的办法绕开ln(0)比如给标准化值加0.0001算出的熵值会因为这个小常数的存在出现系统性偏差加的值越随意偏差越不可控。我见过有人在论文里写上“为避免ln无定义所有数据加0.01处理”这个做法不是不行但0.01这个选择本身缺乏依据对结果的影响也没讨论。改进思路是用功效系数法替代单纯平移。具体做法是先做极差标准化得到 0~1 的数值 x_ij再做一个线性变换x*_ij 0.1 0.8 × x_ij。这把全部数据映射到 0.1~0.9 的开区间一头避开0和1的边界另一头保留原始差异比例。相比盲目平移这个变换有明确的理论形式边界问题也根治了。3.3 硬伤三多级指标下的一级权重失衡在实际项目里指标体系很少是扁平结构通常是一级维度下面挂若干二级指标。如果直接用所有二级指标跑熵权法会出现一个很尴尬的后果二级指标数量较多的大类会在最后加总时天然获得更大权重。比如“质量水平”下面挂了5个二级指标“服务水平”下面只挂了2个二级指标哪怕两者业务重要性相同最终质量类的权重也大概率接近服务类权重的两倍。这个问题的本质是全局熵权法只看到了“二级指标谁信息量大”并没有区分“一级维度谁更重要”。我的改进方案是采用分组熵权法先按一级维度分组组内各自跑一遍熵权得到每个二级指标的组内权重然后以“每个一级维度下所有二级指标的组内权重之和”作为该一级维度的权重最后再做归一化。这样一级维度的权重只取决于组内指标的相对信息量不会因为二级指标数量差异而被稀释或放大。3.4 我说的“改进熵权法”改了什么把上面三点串起来就是我在实践里常用的改进版流程一、先做异常值检测用箱线图或缩尾法处理极端值 二、按指标方向做极差标准化 三、用功效系数法把标准化值映射到0.1到0.9区间 四、多级指标体系下按一级维度分组计算熵权再汇总归一 五、用最终权重计算综合得分。对比基础熵权法这套流程的优势是边界稳定、对异常值不敏感、多级结构下权重更均衡。如果你做的是扁平指标体系且数据比较干净直接用“极差标准化功效系数熵权”这三步也够了。4. 极简化软件操作Excel模板一次做对4.1 为什么把Excel作为极简化首选有人问我为什么不用更“高级”的工具。在线分析工具如SPSSAU确实点几下就出结果但它对算法细节是个黑箱论文附录要写公式和中间过程的时候你拿不出手。Python灵活但对很多非技术背景的读者来说环境配置就是一堵墙。Excel胜在三点过程透明、公式可审查、结果可截图。任何一个审稿人或老板追问“权重怎么来的”你当场把Excel里每一列公式指给他看这就是最好的解释。我在这里用的“极简化”不是指做一个自动宏、一键出结果而是把整套计算拆成一行一行的Excel公式让你能看懂每个中间量是怎么来的。毕竟熵权法的数学本质不复杂如果你连过程都看不明白结果也大概率不敢用。下面这个模板是基于4个对象、5个指标设计的实际使用只需要改数据范围和对象数量。4.2 模板分区设计一个工作表从左到右跑完我习惯把整套计算放在同一个工作表里从左到右分五个区块少用跨工作表引用能减少不少低级错误。设定如下区域所在列内容原始数据区B~F5个指标的原始值第1行为表头方向标记行第2行每个指标填1正向或-1负向极差标准化区G~K使用方向行控制公式改进标准化区L~P在极差标准化结果上做功效系数变换比重与贡献区Q~U各对象比重以及p×ln(p)辅助列熵值权重区V~Z计算熵值、差异系数、权重综合得分区最后一列每个对象的最终得分这个布局最大的好处是每一行都对应一个评价对象横向看数据、纵向看指标任何一个数字出错都能顺着行号列号定位。4.3 关键单元格公式与操作要点方向标记是关键。先在第一行以下第2行填入每个指标的方向例如正向填1、负向填-1。随后极差标准化区G3填入IF(B$21,(B3-MIN(B$3:B$6))/(MAX(B$3:B$6)-MIN(B$3:B$6)),(MAX(B$3:B$6)-B3)/(MAX(B$3:B$6)-MIN(B$3:B$6)))这个公式的含义是如果方向行是1按正向公式计算如果是-1自动取相反方向。注意B$2里行号锁定是因为方向一定在第一行而B3里的行号不锁拖拽填充时会随对象变化。改进标准化区L3填入0.10.8*G3这样就把极差标准化后的结果从0~1映射到0.1~0.9。然后比重区Q3填入L3/SUM(L$3:L$6)这是把该指标下所有对象的改进标准化值加起来做分母使该列和为1。贡献区V3填入IF(Q30,0,Q3*LN(Q3))这一步解决ln(0)无定义的问题。接下来在权重区计算熵值-1/LN(COUNT(B3:B6))*SUM(V3:V6)COUNT函数用于统计对象个数这样即使后面对象增加熵值分母也会自动修正。差异系数就是1-熵值权重再除以所有差异系数的总和即可。最后综合得分是SUMPRODUCT($V$11:$Z$11,L3:P3)这里$V$11:$Z$11是我示例中存放最终权重的位置实际使用时按你的工作表布局调整绝对引用。4.4 Excel操作中的三个“手动坑”第一个坑是MIN和MAX的绝对引用没写对。很多人第一次写标准化公式时只锁定区域没有锁定方向行下拉后每一行的最小值范围跟着跑标准化结果全是错的。我的建议是公式写完之后随机抽查两三行手动心算一下标准化的极值能对上就说明引用没问题。第二个坑是把对象数和指标数搞混。熵值公式分母里的 ln(m) 用的m是对象个数不是指标个数。4个对象就写ln(4)如果你误写成ln(5)权重结果会全部偏差一个系数。第三个坑是比重列的和不是1。这个很好排查选中比重区域看底部状态栏的求和任意一列的和如果不是1说明分母的范围锁定出了问题。每列比重和必须严格等于1这是整张表校验的第一道防线。5. 全流程实操一个四对象五指标案例跑通5.1 案例数据与指标方向我用一个虚拟案例来演示假设有A、B、C、D四个候选业务单元参与综合运营绩效评价五个指标分别是营收增长率、客户满意度、单位成本、缺陷率、研发投入强度。前两个和最后一个都是正向指标越高越好单位成本和缺陷率是负向指标越低越好。原始数据如下对象营收增长率%客户满意度分单位成本万元缺陷率%研发投入强度%A15852.11.58.0B22901.70.812.0C12782.62.26.5D18881.91.210.0直接看数据B单元几乎所有指标都表现突出C单元则全面落后。但我们要的是排名和高低的“量化差距”不能靠肉眼拍板。5.2 用基础熵权法算一遍看它哪里失真先按传统极差标准化处理再按基础熵权法计算得到的权重如下指标熵值差异系数权重营收增长率0.71660.28340.2247客户满意度0.77580.22420.1778单位成本0.77260.22740.1803缺陷率0.76490.23510.1865研发投入强度0.70900.29100.2307然后算综合得分A为0.4275B为1.0000C为0.0000D为0.7031。排名B、D、A、C方向是合理的但B得满分1、C得0分这个结果在实际评价里很难交代。C并不是什么都不做只是恰好每个指标都是四个对象里的最小值极差标准化把它的每个指标压到了0再加权求和自然就是0分。一个真实存在的业务单元被打成零分评审一定会质疑你算法的鲁棒性。B得满分1的另一个问题是它没有给“改进空间”留余地一旦其他单元未来追平排名还好说但得分体系本身失去了区分度。5.3 用改进熵权法重算并对比加入功效系数法改进后标准化值全部落在0.1到0.9之间重新计算权重指标熵值差异系数权重营收增长率0.84930.15070.2191客户满意度0.87360.12640.1838单位成本0.87380.12620.1836缺陷率0.87120.12880.1872研发投入强度0.84440.15560.2263注意权重排序没有大变化研发投入强度和营收增长率仍然排在前两位这符合数据离散程度的基本判断。但各项权重的差距被压缩了不再出现“某个指标独大”的极端情形。综合得分变成A为0.4442B为0.9000C为0.1000D为0.6641。排序依然是B、D、A、C但B不再是满分C也不再吃零蛋。这个结果放到业务上解释起来顺多了B领先但不是没有缺点C落后但并非一事无成。改进后的得分分布更符合我对“运营绩效”这种连续型评价的直觉也能给后续改进提供量化参考。5.4 用Python脚本交叉验证Excel结果如果你担心Excel公式拖拽出错或者想再加一道保险可以用Python验证一遍。脚本如下import numpy as np data np.array([ [15, 85, 2.1, 1.5, 8.0], [22, 90, 1.7, 0.8, 12.0], [12, 78, 2.6, 2.2, 6.5], [18, 88, 1.9, 1.2, 10.0] ]) direction np.array([1, 1, -1, -1, 1]) # 极差标准化 x np.zeros_like(data) for j in range(data.shape[1]): col data[:, j] if direction[j] 1: x[:, j] (col - col.min()) / (col.max() - col.min()) else: x[:, j] (col.max() - col) / (col.max() - col.min()) # 功效系数法改进映射到0.1~0.9 x2 0.1 0.8 * x # 比重矩阵 p x2 / x2.sum(axis0) # 熵值注意用where处理ln(0) n p.shape[0] with np.errstate(divideignore, invalidignore): contrib np.where(p 0, p * np.log(p), 0) e -1 / np.log(n) * contrib.sum(axis0) # 差异系数与权重 d 1 - e w d / d.sum() # 综合得分 score x2 w print(权重, w) print(得分, score)运行之后输出的结果和Excel改进方案应基本一致。注意代码里的p 0判断对应Excel中的IF(Q30,0,Q3*LN(Q3))两者逻辑一致才能交叉对上。跑完这个脚本我一般会把Excel里每一个单元格数据再快速扫一眼确认没有手误然后直接截图进报告。6. 实操中容易翻车的细节与避坑速查6.1 七个常见问题速查下面把这些年带学生和项目过程中最常遇到的问题整理成一个速查表按症状排查很快症状可能原因解决办法综合得分与业务直觉完全违背指标方向标反负向指标没反向回到方向行逐个核对1和-1某个指标权重为0该指标在所有对象上几乎无差异检查数据是否有录入错误或删除冗余指标B对象得分恒为1C对象得分恒为0极差标准化边界效应换成功效系数法或其他映射Excel计算ln(0)报错标准化结果出现0值用IF包裹贡献值或提前做平移/功效变换得分出现负数误用了z-score标准化后直接加权综合评价改用极差标准化或功效系数法所有对象排名和任何一个指标排序完全一样各指标高度相关信息冗余先做相关性筛查保留代表性指标增加一个对象后所有权重剧烈变化样本量太小或异常值影响极值增加样本量或先把离群值缩尾处理6.2 避坑的经验之谈这些年踩坑下来最大的体会是熵权法最怕的不是数学难而是数据“脏”。数据的质量出了问题公式越高级越容易把问题放大而不是隐藏。我现在的标准操作是拿到指标数据之后先画一遍箱线图把所有变量的分布形态看一遍标记出明显的离群点再决定是剔除还是缩尾。这个环节看起来和工作量不沾边其实节省的时间最多。数据里有几个量级差异特别大的指标比如一个指标最大1000、另一个指标最大0.5极差标准化已经够用但功效系数映射后仍然可能让数值大的指标主导权重这种情况我会考虑按正负向分别做对数变换后再进熵权。另外熵权法的权重对样本量比较敏感对象少于5个时信息熵估计很不稳定结果只能当作参考不建议作为最终决策的唯一依据。如果真的只有四五个对象可以把改进熵权法和TOPSIS法结合使用用熵权算权重、用TOPSIS算贴近度这样等于多了一道排序验证稳定性会好很多。6.3 多级指标分组熵权的落地操作如果你用的是多级指标体系不要直接在全局跑熵权。我建议按一级维度拆成若干子表每个子表独立跑一遍“极差标准化功效系数熵值计算”得到二级指标的组内权重再把同一一级维度下的组内权重相加得到该一级维度的权重最后把不同一级维度的权重相加并归一化。举个例子“质量水平”下面有5个二级指标“服务水平”下面有2个二级指标。全局熵权很可能让质量类权重逼近服务类的2.5倍但分组熵权后两个一级维度各自内部的权重之和都先归一到1再按业务层级合并最终质量类和服务类的占比就只取决于各自二级指标的差异度而不是数量。这一步看起来多花了几分钟但在写论文和研究报告时逻辑明显更站得住评审也不太会抓住“指标数量多所以权重高”这个把柄不放。我个人在实际操作中的体会是改进熵权法不是那种“一劳永逸的万能钥匙”但在大多数综合评价场景里它几乎是成本最低、最容易被接纳的客观赋权方案。权重算出来之后一定要请业务方或领域专家看一眼让数据和经验有一次“对答案”的机会。如果某个指标的权重明显高到不符合实际业务认知那说明要么指标选错了要么数据处理还有隐性问题这个时候算法本身不做任何价值判断需要你自己回到指标层去修正。后面如果你做到组合赋权那一层可以用AHP或最小二乘法融合主观权重和熵权再配合TOPSIS做最终排名那套组合拳比单用熵权法稳得多有机会我再单独写一篇。
返回列表