MATLAB熵權法計算權重


一、基本原理

在信息論中,熵是對不確定性的一種度量。不確定性越大,熵就越大,包含的信息量越大;不確定性越小,熵就越小,包含的信息量就越小。

根據熵的特性,可以通過計算熵值來判斷一個事件的隨機性及無序程度,也可以用熵值來判斷某個指標的離散程度,指標的離散程度越大,該指標對綜合評價的影響(權重)越大。比如樣本數據在某指標下取值都相等,則該指標對總體評價的影響為0,權值為0.

熵權法是一種客觀賦權法,因為它僅依賴於數據本身的離散性。

熵權法的思想是:變量數值變化越大,變異程度越大,則其權重應該更大;反之權重則越小。這是較為合理的。

二、MATLAB實現

(1)方法一

前提:輸入的矩陣已經歸一化到0.001-0.999之間(這里不是0-1是因為0-1會出問題)

%B矩陣中的每一列均已經歸一化至0-1
B(B==0)=0.0001;
B(B==1)=0.9999;

[n,m]=size(B); % n個樣本, m個指標
%%計算第j個指標下,第i個樣本占該指標的比重p(i,j)
for i=1:n
    for j=1:m
        p(i,j)=B(i,j)/sum(B(:,j));
    end
end
%%計算第j個指標的熵值e(j)
k=1/log(n);
for j=1:m
    e(j)=-k*sum(p(:,j).*log(p(:,j)));
end
d=ones(1,m)-e; %計算信息熵冗余度
w=d./sum(d); %求權值w 主要需要的結果是這個
s=100*w*B'; %求綜合得分

 

(2)方法二——推薦(不需要提前進行歸一化 且直接得到每個樣本的得分值)

輸入的矩陣R的行數為樣本數,列代表屬性或者指標

[rows,cols]=size(R);   % 輸入矩陣的大小,rows為對象個數,cols為指標個數
k=1/log(rows);         % 求k
Rmin = min(R);
Rmax = max(R);
A = max(R) - min(R);
y = R - repmat(Rmin,rows,1);
%y(i,j) = (R - repmat(Rmin,51,1))/(repmat(A,51,1));
for j = 1 : size(y,2)
     y(:,j) = y(:,j)/A(j);
end
%2 求Y(i,j)
S = sum(y,1);
Y = zeros(rows,cols); 
for i = 1 : size(Y,2)
    Y(:,i) = y(:,i)/S(i)
end
%3
lnYij=zeros(rows,cols);  % 初始化lnYij
% 計算lnYij
for i=1:rows
    for j=1:cols
        if Y(i,j)==0
            lnYij(i,j)=0;
        else
            lnYij(i,j)=log(Y(i,j));
        end
    end
end
ej=-k*(sum(Y.*lnYij,1)); % 計算熵值Hj
%4
weights=(1-ej)/(cols-sum(ej));
%5
F = zeros(rows,cols);
for k = 1 : size(R,2)
     F(:,k) = weights(k)*y(:,k);
end
format long
F = sum(F,2);  %F即為對6個變量進行熵權法客觀賦權后,計算獲得的51年來的綜合評分

  

 

參考:

https://zhuanlan.zhihu.com/p/28067337 方法一

https://www.cnblogs.com/qq874455953/p/10792579.html 考慮正向和負向指標

https://blog.csdn.net/wbj3106/article/details/82290445 方法二

https://zhuanlan.zhihu.com/p/115411437 R語言版

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM