熵權法
熵值法的主要目的是對指標體系進行賦權
熵越大說明系統越混亂,攜帶的信息越少,權重越小;熵越小說明系統越有序,攜帶的信息越多,權重越大。
熵值法是一種客觀賦權方法,,借鑒了信息熵思想,它通過計算指標的信息熵,根據指標的相對變化程度對系統整體的影響來決定指標的權重,即根據各個指標標志值的差異程度來進行賦權,從而得出各個指標相應的權重,相對變化程度大的指標具有較大的權重。
收集與整理
假設有m個待評價樣本,n項評價指標,形成原始指標數據矩陣:
其中Xij表示第 i 個樣本第 j 項評價指標的數值。
對於某項指標Xj,樣本的離散程度越大,則該指標在綜合評價中所起的作用就越大。如果該指標的標志值全部相等,則表示該指標在綜合評價中不起作用。
數據標准化處理
為消除因量綱不同對評價結果的影響,需要對各指標進行標准化處理。
若所用指標的值越大越好(正向指標:)
若所用指標的值越小越好(負向指標:)
其中xj為第j項指標值, xmax為第j項指標的最大值, xmin為第j項指標的最小值。或者:
權重計算
計算第 j 個指標中,第 i 個樣本標志值的權重:
因此,可以建立數據的比重矩陣
計算第j個指標的熵值
其中,常數
保證0<=ej<=1,即最大為1
所以,第j個指標的熵值為
定義第j個指標的差異程度
熵值法根據各個指標標志值的差異程度來進行賦權,從而得出各個指標相應的權重
定義權重
綜合評價
原理講解引自:https://blog.csdn.net/qq_42374697/article/details/105901229
題目
評價下表中20條河流的水質情況。(熵權法和優劣解距離法對比)
注:含氧量越高越好;PH值越接近7越好;細菌總數越少越好;植物性營養物量介於10‐20之間最佳,超過20或低於10均不好。
河流 |
含氧量(ppm) |
PH值 |
細菌總數(個/mL) |
植物性營養物量(ppm) |
A |
4.69 |
6.59 |
51 |
11.94 |
B |
2.03 |
7.86 |
19 |
6.46 |
C |
9.11 |
6.31 |
46 |
8.91 |
D |
8.61 |
7.05 |
46 |
26.43 |
E |
7.13 |
6.5 |
50 |
23.57 |
F |
2.39 |
6.77 |
38 |
24.62 |
G |
7.69 |
6.79 |
38 |
6.01 |
H |
9.3 |
6.81 |
27 |
31.57 |
I |
5.45 |
7.62 |
5 |
18.46 |
J |
6.19 |
7.27 |
17 |
7.51 |
K |
7.93 |
7.53 |
9 |
6.52 |
L |
4.4 |
7.28 |
17 |
25.3 |
M |
7.46 |
8.24 |
23 |
14.42 |
N |
2.01 |
5.55 |
47 |
26.31 |
O |
2.04 |
6.4 |
23 |
17.91 |
P |
7.73 |
6.14 |
52 |
15.72 |
Q |
6.35 |
7.58 |
25 |
29.46 |
R |
8.29 |
8.41 |
39 |
12.02 |
S |
3.54 |
7.27 |
54 |
3.16 |
T |
7.44 |
6.26 |
8 |
28.41 |
熵權法
.mat數據:在MATLAB里面隨便創建一個變量,將表格中的數據粘貼進變量中,再另存為.mat數據就行。
main.m
%% 數據讀取 clear,clc load rivers_data.mat %% 正向化處理 [n,m] = size(datas_matrix); % 正向化處理的數據所在列 Pos = [2,3,4]; % 指標類型:1:極小型,2:中間型,3:區間型 ch = [2,1,3]; % 循環處理每一列 for i = 1 : size(Pos,2) datas_matrix(:,Pos(i)) = Forward_processing(datas_matrix(:,Pos(i)),ch(i),Pos(i)); end %% 矩陣標准化 datas_S_matrix = datas_matrix ./ repmat(sum(datas_matrix.*datas_matrix) .^ 0.5, n, 1); %% model = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"]; %% 熵權法 p = datas_S_matrix./sum(datas_S_matrix); k = 1/log(n); r = zeros(n,m); for i = 1:n for j = 1:m if p(i,j) == 0 r(i,j) = 0; else r(i,j) = log(p(i,j)); end end end e = -k*sum(p.*r,1); d = ones(1,m)-e; weight = d./sum(d); score = sum(weight.*datas_S_matrix,2); results1 = 0 + (100-0)/(max(score)-min(score)).*(score - min(score)); [sorted_score,index] = sort(results1 ,'descend'); rivers1 = []; for i = 1:n rivers1 = [rivers1;model(index(i))]; end s = [rivers1,sorted_score]; %% 繪圖 bar(sorted_score); title('熵權法') set(gca,'XTick',1:20) set(gca, 'xticklabel',{rivers1{1:20}}); %% 保存到文件 xlswrite('output.xls',s,'Sheet1');
Forward_processing.m
function [posit_x] = Forward_processing(x,type,~) if type == 1 %極小型 %正向化 posit_x = max(x) - x; elseif type == 2 %中間型 best = 7; M = max(abs(x-best)); posit_x = 1 - abs(x-best) / M; elseif type == 3 %區間型 a = 10; b = 20; r_x = size(x,1); M = max([a-min(x),max(x)-b]); posit_x = zeros(r_x,1); for i = 1: r_x if x(i) < a posit_x(i) = 1-(a-x(i))/M; elseif x(i) > b posit_x(i) = 1-(x(i)-b)/M; else posit_x(i) = 1; end end end end