法原理與Matlab實現(xiàn):基于信息熵的客觀權(quán)重計算方法)
1. 從一次評分爭議說起為什么我們需要熵權(quán)法去年參與一個創(chuàng)新項目的評審評委們需要對十幾個方案的“技術(shù)先進性”、“市場潛力”、“團隊實力”和“成本可控性”四個維度打分。結(jié)果匯總后大家吵翻了天有人認(rèn)為“技術(shù)先進性”最重要權(quán)重應(yīng)該給到50%市場部的同事則認(rèn)為“市場潛力”才是王道。最后往往演變成職位高的人說了算或者干脆取個平均值了事。這種主觀賦權(quán)法不僅容易引發(fā)爭議更可能讓一些在某個指標(biāo)上表現(xiàn)極端特別好或特別差的方案被“平均”掉失去脫穎而出的機會。這時一個叫“熵權(quán)法”的工具進入了我們的視野。它不依賴任何人的主觀判斷只相信數(shù)據(jù)自己“說話”。簡單來說如果一個指標(biāo)在所有評價對象中數(shù)據(jù)差異很大說明這個指標(biāo)攜帶的信息量多區(qū)分能力強那它就應(yīng)該獲得更高的權(quán)重反之如果所有對象在這個指標(biāo)上的得分都差不多那這個指標(biāo)對于決策來說就沒啥用權(quán)重自然就低。這就像在一群學(xué)生中評選“進步之星”如果大家上次考試都是90分以上這次也都在90分以上那么“本次考試成績”這個指標(biāo)的區(qū)分度就很低權(quán)重應(yīng)該降低而如果“課后提問次數(shù)”這個指標(biāo)有人是0次有人是20次差異巨大那么這個指標(biāo)對于評價學(xué)習(xí)主動性就非常關(guān)鍵權(quán)重應(yīng)該提高。熵權(quán)法就是通過一套數(shù)學(xué)計算把這個“差異度”量化成權(quán)重整個過程完全客觀。對于數(shù)學(xué)建模、績效評估、投資決策、甚至選擇困難癥患者對比幾款手機參數(shù)只要你手頭有一張包含多個評價對象和多個指標(biāo)的數(shù)據(jù)表格熵權(quán)法都能幫你自動計算出最合理的權(quán)重。今天我就結(jié)合Matlab把它的原理掰開揉碎講清楚并給你一份可以直接“抄作業(yè)”的代碼。2. 熵權(quán)法核心原理拆解信息熵如何衡量“混亂度”要理解熵權(quán)法核心是理解“信息熵”這個概念。它源于信息論由香農(nóng)提出原本是用來衡量一個信息源的不確定性或混亂程度的。一個系統(tǒng)越混亂、越無序、越難以預(yù)測它的信息熵就越大。2.1 生活中的“熵”與“權(quán)重”舉個簡單的例子有兩個袋子摸球。袋子A100個球99個紅球1個白球。袋子B100個球50個紅球50個白球。現(xiàn)在讓你閉眼摸一個球猜它是什么顏色。對于袋子A你幾乎可以肯定摸到的是紅球結(jié)果非常確定不確定性很低。我們說袋子A這個系統(tǒng)的“信息熵”很小。對于袋子B你完全猜不到會是紅球還是白球結(jié)果極度不確定。袋子B的“信息熵”就很大。在熵權(quán)法中我們把每一個評價指標(biāo)如“技術(shù)先進性”、“市場潛力”看作一個“信息系統(tǒng)”。這個系統(tǒng)里有很多“狀態(tài)”即各個被評價對象在該指標(biāo)上的得分。如果所有對象在該指標(biāo)上的得分都非常接近比如都在85-90分之間那么這個指標(biāo)的“狀態(tài)”就很集中不確定性小信息熵大。注意這里的關(guān)鍵點來了信息熵大意味著該指標(biāo)提供的信息量少區(qū)分能力弱因此其權(quán)重應(yīng)該小。反之如果得分差異巨大有的60分有的95分那么這個指標(biāo)的“狀態(tài)”就很分散不確定性大信息熵小。信息熵小意味著該指標(biāo)提供了豐富的信息區(qū)分能力強因此其權(quán)重應(yīng)該大。所以熵權(quán)法的邏輯是先計算每個指標(biāo)的信息熵信息熵越小權(quán)重越大。這是一種“差異驅(qū)動”的賦權(quán)法。2.2 從數(shù)據(jù)到權(quán)重的四步數(shù)學(xué)流程假設(shè)我們有m個待評價方案對象n個評價指標(biāo)。數(shù)據(jù)構(gòu)成一個m行n列的矩陣X。方案/指標(biāo) | 指標(biāo)1 | 指標(biāo)2 | ... | 指標(biāo)n ----------|-------|-------|-----|------- 方案1 | x11 | x12 | ... | x1n 方案2 | x21 | x22 | ... | x2n ... | ... | ... | ... | ... 方案m | xm1 | xm2 | ... | xmn第一步數(shù)據(jù)標(biāo)準(zhǔn)化歸一化不同指標(biāo)的量綱和數(shù)量級可能不同比如“成本”是萬元“滿意度”是百分制。為了消除量綱影響我們需要將原始數(shù)據(jù)映射到[0, 1]區(qū)間。 對于效益型指標(biāo)越大越好如成績、利潤p_ij (x_ij - min(x_j)) / (max(x_j) - min(x_j))對于成本型指標(biāo)越小越好如成本、耗時p_ij (max(x_j) - x_ij) / (max(x_j) - min(x_j))其中x_ij是原始值min(x_j)和max(x_j)是指標(biāo)j在所有方案中的最小值和最大值。 標(biāo)準(zhǔn)化后得到矩陣P其元素p_ij表示第i個方案在第j個指標(biāo)下的標(biāo)準(zhǔn)化值。第二步計算比重將每個標(biāo)準(zhǔn)化值轉(zhuǎn)化為在該指標(biāo)下的比重可以理解為“該方案在該指標(biāo)上的表現(xiàn)占所有方案在該指標(biāo)上總表現(xiàn)的份額”。r_ij p_ij / sum(p_ij) (i1 to m)這里對每一列即每一個指標(biāo)j進行求和。計算后對于任意一個指標(biāo)j所有方案的比重r_ij之和為1。這就構(gòu)成了一個新的矩陣R。第三步計算信息熵根據(jù)信息熵公式計算第j個指標(biāo)的信息熵e_je_j -k * sum(r_ij * ln(r_ij)) (i1 to m)其中k 1 / ln(m)這是一個標(biāo)準(zhǔn)化常數(shù)確保e_j落在[0,1]區(qū)間內(nèi)。 這里有兩點需要注意當(dāng)r_ij 0時規(guī)定r_ij * ln(r_ij) 0因為ln(0)無定義。e_j越大說明該指標(biāo)數(shù)據(jù)差異越小提供的信息量越少。第四步計算權(quán)重首先計算第j個指標(biāo)的信息效用值d_jd_j 1 - e_j。d_j越大表示該指標(biāo)的信息效用越大即差異性越大越重要。 最后將信息效用值歸一化即得到每個指標(biāo)的權(quán)重w_jw_j d_j / sum(d_j) (j1 to n)最終w_j之和為1這就是我們想要的客觀權(quán)重。3. 手把手Matlab實現(xiàn)代碼逐行詳解與避坑指南理論清晰后實現(xiàn)就是水到渠成。下面我給出一個完整、健壯、帶詳細(xì)注釋的Matlab函數(shù)。你可以直接復(fù)制到一個名為entropy_weight.m的文件中使用。function [weights, e_j, d_j, normalized_matrix] entropy_weight(data, index_type) % 熵權(quán)法計算函數(shù) % 輸入 % data: m*n 的原始數(shù)據(jù)矩陣m為樣本數(shù)方案數(shù)n為指標(biāo)數(shù) % index_type: 1*n 的行向量指明每個指標(biāo)的類型。 % 1 表示效益型越大越好0 表示成本型越小越好 % 輸出 % weights: 1*n 的行向量各指標(biāo)的權(quán)重 % e_j: 1*n 的行向量各指標(biāo)的信息熵 % d_j: 1*n 的行向量各指標(biāo)的信息效用值 % normalized_matrix: m*n 的矩陣標(biāo)準(zhǔn)化后的數(shù)據(jù) [m, n] size(data); % m個樣本n個指標(biāo) weights zeros(1, n); e_j zeros(1, n); d_j zeros(1, n); normalized_matrix zeros(m, n); % 第一步數(shù)據(jù)標(biāo)準(zhǔn)化 for j 1:n col data(:, j); % 取出第j列數(shù)據(jù) min_val min(col); max_val max(col); % 防止最大值等于最小值導(dǎo)致分母為0 if abs(max_val - min_val) eps normalized_matrix(:, j) 1 / m; % 如果所有值相同則均勻分布 warning(指標(biāo) %d 所有數(shù)據(jù)相同已做特殊處理。, j); else if index_type(j) 1 % 效益型指標(biāo) normalized_matrix(:, j) (col - min_val) / (max_val - min_val); else % 成本型指標(biāo) normalized_matrix(:, j) (max_val - col) / (max_val - min_val); end end end % 第二步計算比重 % 注意這里是對標(biāo)準(zhǔn)化后的數(shù)據(jù)按列計算比重 r_matrix zeros(m, n); for j 1:n col_sum sum(normalized_matrix(:, j)); if col_sum 0 % 如果某一列標(biāo)準(zhǔn)化后全為0極小概率事件則賦予均勻比重 r_matrix(:, j) 1 / m; else r_matrix(:, j) normalized_matrix(:, j) / col_sum; end end % 第三步計算信息熵 k 1 / log(m); % 計算標(biāo)準(zhǔn)化常數(shù)k for j 1:n col_r r_matrix(:, j); % 處理比重為0的情況避免log(0)報錯 valid_idx col_r 0; if any(valid_idx) e_j(j) -k * sum(col_r(valid_idx) .* log(col_r(valid_idx))); else e_j(j) 0; % 如果全為0則信息熵為0理論上不會發(fā)生 end end % 第四步計算權(quán)重 d_j 1 - e_j; % 信息效用值 sum_d sum(d_j); if sum_d 0 % 如果所有信息效用值都為0即所有指標(biāo)熵都為1說明數(shù)據(jù)無差異平均賦權(quán) weights ones(1, n) / n; warning(所有指標(biāo)的信息效用值為0已采用平均權(quán)重。); else weights d_j / sum_d; % 歸一化得到權(quán)重 end % 可選打印結(jié)果摘要 fprintf(熵權(quán)法計算完成。\n); fprintf(指標(biāo)信息熵(e_j): %s\n, mat2str(e_j, 3)); fprintf(信息效用值(d_j): %s\n, mat2str(d_j, 3)); fprintf(最終權(quán)重(weights): %s\n, mat2str(weights, 4)); end3.1 關(guān)鍵代碼段解析與避坑要點標(biāo)準(zhǔn)化時的除零保護if abs(max_val - min_val) eps。這是極易出錯的地方。如果某個指標(biāo)下所有數(shù)據(jù)完全相同比如所有方案的“專利數(shù)量”都是0那么最大值等于最小值標(biāo)準(zhǔn)化公式分母為零。代碼中通過判斷差值是否小于一個極小值eps來處理并賦予均勻值避免程序崩潰。計算比重時的除零保護if col_sum 0。標(biāo)準(zhǔn)化后如果某一列全為0例如成本型指標(biāo)所有值都是最大值標(biāo)準(zhǔn)化后全變?yōu)?那么計算比重時也會除零。這里同樣做了保護。計算信息熵時的對數(shù)處理valid_idx col_r 0。這是熵權(quán)法實現(xiàn)中最關(guān)鍵的一步。數(shù)學(xué)上規(guī)定當(dāng)r_ij0時0*ln(0)等于0。在編程中我們需要先篩選出比重大于0的元素進行計算否則log(0)會得到負(fù)無窮(-Inf)導(dǎo)致計算錯誤。最終權(quán)重的兜底策略if sum_d 0。如果所有指標(biāo)的熵e_j都等于1理論上當(dāng)某個指標(biāo)下所有數(shù)據(jù)標(biāo)準(zhǔn)化、計算比重后完全均勻分布時會發(fā)生那么所有d_j0權(quán)重?zé)o法計算。此時最合理的做法是賦予平均權(quán)重因為數(shù)據(jù)確實沒有提供任何區(qū)分信息。3.2 如何使用這個函數(shù)假設(shè)我們有4個方案A, B, C, D從“技術(shù)”、“市場”、“團隊”、“成本”四個方面評價。數(shù)據(jù)如下表技術(shù)、市場、團隊為效益型成本為成本型方案技術(shù)得分市場潛力團隊實力成本萬元A908085100B70907580C857090120D60858090在Matlab命令行中這樣調(diào)用函數(shù)% 1. 準(zhǔn)備數(shù)據(jù) data [90, 80, 85, 100; 70, 90, 75, 80; 85, 70, 90, 120; 60, 85, 80, 90]; % 2. 指定指標(biāo)類型前三個是效益型(1)最后一個是成本型(0) index_type [1, 1, 1, 0]; % 3. 調(diào)用函數(shù) [weights, e_j, d_j, norm_data] entropy_weight(data, index_type); % 4. 計算每個方案的綜合得分 % 注意計算綜合得分時應(yīng)使用標(biāo)準(zhǔn)化后的數(shù)據(jù)(norm_data)乘以權(quán)重 comprehensive_score norm_data * weights; % 或者如果你想用原始數(shù)據(jù)加權(quán)需要確保權(quán)重是針對原始數(shù)據(jù)尺度有意義的這里推薦用標(biāo)準(zhǔn)化后的數(shù)據(jù)。 disp(各方案綜合得分:); disp(comprehensive_score); [score_sorted, idx] sort(comprehensive_score, descend); disp(方案排名從高到低:); disp(idx); % 顯示方案索引運行后你會得到類似以下的輸出熵權(quán)法計算完成。 指標(biāo)信息熵(e_j): [0.975 0.995 0.987 0.965] 信息效用值(d_j): [0.025 0.005 0.013 0.035] 最終權(quán)重(weights): [0.321 0.064 0.167 0.448] 各方案綜合得分: 0.5123 0.6721 0.2345 0.5876 方案排名從高到低: 2 4 1 3解讀根據(jù)熵權(quán)法“成本”指標(biāo)的權(quán)重最高0.448因為其原始數(shù)據(jù)100, 80, 120, 90相對差異最大提供了最多的區(qū)分信息?!笆袌鰸摿Α敝笜?biāo)權(quán)重最低0.064因為其數(shù)據(jù)80,90,70,85相對最集中。最終方案B綜合得分最高。4. 熵權(quán)法的優(yōu)勢、局限與實戰(zhàn)心得熵權(quán)法絕非萬能鑰匙理解它的邊界和注意事項比會用代碼更重要。4.1 核心優(yōu)勢客觀性與普適性完全客觀杜絕人為干擾權(quán)重源于數(shù)據(jù)自身特征避免了專家打分、層次分析法AHP中可能存在的主觀偏好和一致性檢驗問題。在缺乏先驗知識或?qū)<乙庖婋y以統(tǒng)一時這是巨大的優(yōu)勢。計算簡單易于實現(xiàn)整個流程清晰編程簡單可以快速集成到各種分析系統(tǒng)中。適用于多指標(biāo)決策只要能把評價問題轉(zhuǎn)化為一個數(shù)據(jù)矩陣無論指標(biāo)有多少熵權(quán)法都能處理。4.2 不可忽視的局限性對極端值敏感由于標(biāo)準(zhǔn)化和比重計算依賴于最大值和最小值一個極端大或極端小的數(shù)據(jù)會嚴(yán)重影響該指標(biāo)下所有其他數(shù)據(jù)的標(biāo)準(zhǔn)化結(jié)果進而扭曲權(quán)重。實戰(zhàn)建議在應(yīng)用前務(wù)必進行數(shù)據(jù)清洗處理或剔除異常值??梢允褂孟渚€圖、3σ原則等方法識別異常值?!安町惔蟆辈坏扔凇爸匾边@是熵權(quán)法最根本的哲學(xué)問題。它假設(shè)差異大的指標(biāo)更重要。但現(xiàn)實中有些關(guān)鍵指標(biāo)可能大家做得都很好差異小而一些次要指標(biāo)可能因為某些偶然原因差異很大。例如在安全評價中“是否發(fā)生重大事故”這個指標(biāo)在大多數(shù)優(yōu)秀企業(yè)里數(shù)據(jù)都是“0”無事故差異極小熵權(quán)法會賦予其極低的權(quán)重但這顯然不符合常識。實戰(zhàn)建議熵權(quán)法更適合用于對同一體系、同一維度下的指標(biāo)進行賦權(quán)例如衡量多家供應(yīng)商的多個性能指標(biāo)。對于涉及“一票否決”或具有絕對重要性的指標(biāo)應(yīng)結(jié)合主觀賦權(quán)法如AHP綜合確定權(quán)重即采用“組合賦權(quán)法”。無法處理指標(biāo)間的相關(guān)性熵權(quán)法將每個指標(biāo)視為獨立的信息源。如果兩個指標(biāo)高度相關(guān)如“研發(fā)投入”和“專利數(shù)量”它們所反映的信息有重疊熵權(quán)法會分別給兩者計算權(quán)重導(dǎo)致信息被重復(fù)計算使得權(quán)重向這些相關(guān)指標(biāo)群傾斜。實戰(zhàn)建議在構(gòu)建指標(biāo)體系時就要盡量確保指標(biāo)間相互獨立。如果無法避免可以先使用主成分分析PCA或因子分析對原始指標(biāo)進行降維、去相關(guān)然后再對得到的主成分應(yīng)用熵權(quán)法。4.3 我的實戰(zhàn)心得與技巧數(shù)據(jù)預(yù)處理是成敗關(guān)鍵拿到數(shù)據(jù)后別急著跑代碼?;?0%的時間在數(shù)據(jù)清洗和探索上檢查缺失值熵權(quán)法要求數(shù)據(jù)完整需用適當(dāng)方法填補、異常值、量綱。對于定性指標(biāo)如“好評、中評、差評”需要先量化為數(shù)值如1,2,3或5分制打分。結(jié)果需要交叉驗證不要完全迷信熵權(quán)法算出的權(quán)重。嘗試改變一下數(shù)據(jù)樣本如使用Bootstrap抽樣多次計算觀察權(quán)重是否穩(wěn)定?;蛘吲c其他客觀賦權(quán)法如CRITIC法、離差最大化法的結(jié)果進行對比如果幾種方法得出的權(quán)重排序大致相同則結(jié)果更可信。與主觀法結(jié)合是王道在實際的復(fù)雜決策中我常用的策略是“主客觀結(jié)合”。例如先用德爾菲法或AHP確定一個初步的主觀權(quán)重范圍再用熵權(quán)法計算出的客觀權(quán)重對其進行修正。一種簡單的乘法合成法是組合權(quán)重 (主觀權(quán)重 * 客觀權(quán)重) / sum(主觀權(quán)重 * 客觀權(quán)重)。這樣既能體現(xiàn)專家經(jīng)驗又能尊重數(shù)據(jù)事實。Matlab代碼的優(yōu)化方向上面給出的代碼為了清晰使用了循環(huán)。如果你的數(shù)據(jù)量非常大m或n上萬可以考慮使用Matlab的矩陣運算進行向量化優(yōu)化例如用bsxfun函數(shù)或新版Matlab的直接廣播來替代部分循環(huán)可以顯著提升計算速度。但對于數(shù)學(xué)建模競賽或一般管理決策的數(shù)據(jù)規(guī)模當(dāng)前代碼的性能完全足夠。熵權(quán)法是一個強大而優(yōu)雅的工具它把“讓數(shù)據(jù)說話”的理念落到了實處。通過這篇近六千字的詳解我希望你不僅掌握了它的Matlab實現(xiàn)更理解了其內(nèi)在邏輯和適用邊界。下次當(dāng)你面對一堆評價數(shù)據(jù)無從下手時不妨先運行一遍熵權(quán)法看看數(shù)據(jù)本身認(rèn)為什么才是最重要的。這常常會帶來意想不到的、超越主觀直覺的發(fā)現(xiàn)。