【评价算法】01. 熵权法确定权重

【评价算法】01. 熵权法确定权重

一、基本原理

在信息论中,熵是对不确定性的一种度量。不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。

根据熵的特性,可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响(权重)越大。比如样本数据在某指标下取值都相等,则该指标对总体评价的影响为0,权值为0.

熵权法是一种客观赋权法,因为它仅依赖于数据本身的离散性。


二、熵值法步骤

1. 对 n 个样本, m 个指标,则 x_{ij} 为第 i 个样本的第 j 个指标的数值( i=1,\,\cdots,\,n; \; j=1, \, \cdots, \, m );


2. 指标的归一化处理:异质指标同质化

由于各项指标的计量单位并不统一,因此在用它们计算综合指标前,先要进行标准化处理,即把指标的绝对值转化为相对值,从而解决各项不同质指标值的同质化问题。

另外,正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好),因此,对于正向负向指标需要采用不同的算法进行数据标准化处理:



为了方便起见,归一化后的数据 x'_{ij} 仍记为 x_{ij} ;

3. 计算第 j 项指标下第 i 个样本值占该指标的比重:

p_{ij}=\frac{x_{ij}}{\sum\limits_{i=1}^n x_{ij}}, \quad i=1,\, \cdots,\,n,\;j=1,\,\cdots,\,m

4. 计算第 j 项指标的熵值:

e_j=-k\sum_{i=1}^n p_{ij} \ln(p_{ij}), \quad j=1,\,\cdots,\,m

其中, k=1/\ln(n) > 0. 满足 e_j \geq 0 ;

5. 计算信息熵冗余度(差异):

d_j=1-e_j, \quad j=1,\,\cdots,\,m

6. 计算各项指标的权重:

w_j=\frac{d_j}{\sum\limits_{j=1}^m d_j},\quad j=1,\,\cdots,\,m

7. 计算各样本的综合得分:

s_i=\sum_{j=1}^m w_j x_{ij}, \quad i=1,\,\cdots,\,n

其中, x_{ij} 为标准化后的数据。


三、Matlab实现

按上述算法步骤,编写Matlab函数:shang.m


function [s,w]=shang(x,ind)
%实现用熵值法求各指标(列)的权重及各数据行的得分
%x为原始数据矩阵, 一行代表一个样本, 每列对应一个指标
%ind指示向量,指示各列正向指标还是负向指标,1表示正向指标,2表示负向指标
%s返回各行(样本)得分,w返回各列权重
[n,m]=size(x); % n个样本, m个指标
%%数据的归一化处理
for i=1:m
    if 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:n
    for j=1:m
        p(i,j)=X(i,j)/sum(X(:,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*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 type
    case 1
        for j=1:m
            y(:,j)=(ymax-ymin)*(x(:,j)-xmin(j))/(xmax(j)-xmin(j))+ymin;
        end
    case 2
        for j=1:m
            y(:,j)=(ymax-ymin)*(xmax(j)-x(:,j))/(xmax(j)-xmin(j))+ymin;
        end
end


程序测试,现有数据shang_datas.mat, 为2014年31个省份的就业与劳动保障数据, 包含5个指标:社会养老保险参保率、医疗保险参保率、失业保险参保率、工伤保险参保率、工伤事故发生率, 其中第5个指标为负向指标。

执行代码:


load shang_datas

Ind=[1 1 1 1 2]; %指定各指标的正向or负向

[S,W]=shang(X,Ind)


运行结果:

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


著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

编辑于 2019-01-23

文章被以下专栏收录

    本专栏将以Matlab、R语言、Lingo为工具实现数学建模各种算法,分【软件基础】、【数学实验】、【数据预处理】、【建模算法】四个版块逐步完成《数学建模与数学实验》这部大书!敬请期待!!