熵权法确定权重
function [s,w]=shang(x,ind)
%實現用熵值法求各指標(列)的權重及各數據行的得分
%x為原始數據矩陣, 一行代表一個樣本, 每列對應一個指標
%ind指示向量,指示各列正向指標還是負向指標,1表示正向指標,2表示負向指標
%s返回各行(樣本)得分,w返回各列權重
[n,m]=size(x); % n個樣本, m個指標
%%數據的歸一化處理
for i=1:mif ind(i)==1 %正向指標歸一化X(:,i)=guiyi(x(:,i),1,0.002,0.996); %若歸一化到[0,1], 0會出問題else %負向指標歸一化X(:,i)=guiyi(x(:,i),2,0.002,0.996);end
end
%%計算第j個指標下,第i個樣本占該指標的比重p(i,j)
for i=1:nfor j=1:mp(i,j)=X(i,j)/sum(X(:,j));end
end
%%計算第j個指標的熵值e(j)
k=1/log(n);
for j=1:me(j)=-k*sum(p(:,j).*log(p(:,j)));
end
d=ones(1,m)-e; %計算信息熵冗余度
w=d./sum(d); %求權值w
s=100*w*X'; %求綜合得分
用到的歸一化函數:
function y=guiyi(x,type,ymin,ymax) %實現正向或負向指標歸一化,返回歸一化后的數據矩陣 %x為原始數據矩陣, 一行代表一個樣本, 每列對應一個指標 %type設定正向指標1,負向指標2 %ymin,ymax為歸一化的區間端點 [n,m]=size(x); y=zeros(n,m); xmin=min(x); xmax=max(x); switch typecase 1for j=1:my(:,j)=(ymax-ymin)*(x(:,j)-xmin(j))/(xmax(j)-xmin(j))+ymin;endcase 2for j=1:my(:,j)=(ymax-ymin)*(xmax(j)-x(:,j))/(xmax(j)-xmin(j))+ymin;end end程序測試,現有數據shang_datas.mat, 為2014年31個省份的就業與勞動保障數據, 包含5個指標:社會養老保險參保率、醫療保險參保率、失業保險參保率、工傷保險參保率、工傷事故發生率, 其中第5個指標為負向指標。
執行代碼:
運行結果:
S =
Columns 1 through 9
3.2624 11.7822 5.2952 1.3521 2.5262 2.0425 4.4215 2.6953 2.5208
Columns 10 through 18
7.8834 4.7410 7.4679 1.4645 3.2541 1.6292 3.3035 1.6282 1.9043
Columns 19 through 27
2.0526 7.8582 0.7256 3.8943 3.7992 1.7187 0.7766 0.6445 2.0167
Columns 28 through 31
0.7801 1.3353 2.2775 2.9462
W = 0.0896 0.2195 0.3330 0.3073 0.0506
總結