数学建模——熵权法(附上实战的详细代码、具体注释以及运行结果)

1.引入

由于层次分析法的主观性太强,判断矩阵的确定依赖于专家(事实上比赛时都是靠自己的感觉来),自己的主观判断对结果的影响是很大的,故引入熵权法,更加客观的计算权重。

2.理解

基于一组数据,方差越小,说明该数据的相似度越大,我们可以判断其优劣的贡献度越小。

极端的来看,某项指标,每个对象的得分相同,数据的相似度达到最大,则判断哪个对象较好是没有必要的,即说明这个指标的权重为0.

3.原理

熵是对不确定性的一种度量,从某种角度来看:

不确定性越大,熵就越大,包含的信息量越大,对应的权重越高;

不确定性越小,熵就越小,包含的信息量越小,对应的权重越低。

4.具体步骤

4.1 指标的正向化(化成共性指标,即越大越好,以便后续的统一操作)
指标名称指标特点例子
极大型指标越大越好成绩、利润、GDP增速
极小型指标越小越好花费、污染程度、失业率
中间型指标越接近某个值越好水质量评估时的PH值
区间型指标落在某个区间最好体温、水中某物质含量

将所有的指标转化为极大型指标,称为指标的正向化

  • 极小型–>极大型:
    x i = m a x { x 1 , x 2 , . . . , x i } − x i x_i=max\{x_1,x_2,...,x_i\}-x_i xi=max{x1,x2,...,xi}xi
    若所有元素均为正数,可以直接取倒数
    x i = 1 x i x_i=\frac{1}{x_i} xi=xi1

  • 中间型–>极大型:
    { x i } 是一组中间型指标序列,且最佳的数值为 x b e s t , x n e w 为正向化之后的极大型指标,正向化公式如下: M = m a x { ∣ x i − x b e s t ∣ } x n e w = 1 − ∣ x i − x b e s t ∣ M \{x_i\}是一组中间型指标序列,且最佳的数值为x_{best},x_{new}为正向化之后的极大型指标,正向化公式如下:\\ M=max\{|x_i-x_{best}|\}\\ x_{new} = 1-\frac{|x_i-x_{best}|}{M} {xi}是一组中间型指标序列,且最佳的数值为xbestxnew为正向化之后的极大型指标,正向化公式如下:M=max{xixbest}xnew=1Mxixbest

  • 区间型–>极大型:
    { x i } 是一组区间型指标序列,且最佳的数值为 x b e s t , x n e w 为正向化之后的极大型指标,正向化公式如下: M = m a x { a − m i n { x i } ,   m a x { x i } − b } x n e w = { 1 − a − x M , x < a 1 , a ≤ x ≤ b 1 − x − b M , x > b \{x_i\}是一组区间型指标序列,且最佳的数值为x_{best},x_{new}为正向化之后的极大型指标,正向化公式如下:\\ M=max\{a-min\{x_i\},\ max\{x_i\}-b\}\\ x_{new}=\begin{cases}1-\frac{a-x}{M}&,x<a\\ 1 &,a≤x≤b\\ 1-\frac{x-b}{M}&,x>b \end{cases} {xi}是一组区间型指标序列,且最佳的数值为xbestxnew为正向化之后的极大型指标,正向化公式如下:M=max{amin{xi}, max{xi}b}xnew= 1Max11Mxb,x<a,axb,x>b

4.2 标准化处理(平衡因为指标之间的差异或是量纲带来的误差)

n个评价对象,m个评价指标(已正向化)

① 不存在负数的标准化

在这里插入图片描述

② 存在负数的标准化(事实上不存在负数时也常常使用如下公式)

z i j = x i j − m i n { x 1 j , x 2 j . . . , x i j } m a x { x 1 j , x 2 j . . . , x i j } − m i n { x 1 j , x 2 j . . . , x i j } z_{ij}=\frac{x_{ij}-min\{x_{1j},x_{2j}...,x_{ij}\}}{max\{x_{1j},x_{2j}...,x_{ij}\}-min\{x_{1j},x_{2j}...,x_{ij}\}} zij=max{x1j,x2j...,xij}min{x1j,x2j...,xij}xijmin{x1j,x2j...,xij}

4.3 每个元素所占比重(比重之和为1,即对标准化后的矩阵归一化)

计算概率矩阵p:
p i j = z i j ∑ i = 1 n z i j p_{ij}=\frac{z_{ij}}{\sum_{i=1}^{n}z_{ij}} pij=i=1nzijzij

4.4 计算每个指标的信息熵e(不确定度)

e j = − 1 l n n ∑ i = 1 n p i j l n ( p i j ) ,    ( j = 1 , 2 , . . . , m ) e_j=-\frac{1}{lnn}\sum_{i=1}^{n}p_{ij}ln(p_{ij}),\ \ (j=1,2,...,m) ej=lnn1i=1npijln(pij),  (j=1,2,...,m)

其中
k = 1 l n n > 0   ,   e j ≥ 0 k=\frac{1}{lnn}>0\ ,\ e_j≥0 k=lnn1>0 , ej0

4.5 计算权重

1-e为信息效用值,再进行归一化即为权重
d j = 1 − e j ,    ( j = 1 , 2 , . . . , m ) w j = d j ∑ j = 1 m d j ,    ( j = 1 , 2 , . . . , m ) d_j=1-e_j,\ \ (j=1,2,...,m)\\ w_j=\frac{d_j}{\sum_{j=1}^{m}d_j},\ \ (j=1,2,...,m) dj=1ej,  (j=1,2,...,m)wj=j=1mdjdj,  (j=1,2,...,m)

4.6 计算综合得分

综合得分=权重*得分
s c o r e i = ∑ j = 1 m w j z i j ,    ( i = 1 , 2 , . . . , n ) score_i=\sum_{j=1}^{m}{w_jz_{ij}},\ \ (i=1,2,...,n) scorei=j=1mwjzij,  (i=1,2,...,n)

% 代码实战一下吧,如下是清风老师的课程里的例子,自己再敲了一下代码并简化了一丢丢?
clc,clear;
% 1、导入数据
load data_river.mat
% 2、正向化
[n,m] = size(A);
disp(['该数据一共有',num2str(n),'个评价对象,有',num2str(m),'个评价指标'])
jud = input(['这' num2str(m) '个指标是否需要进行正向化处理,需要请输入1 ,不需要输入0:']);
if jud == 1
    col_list = input('请输入需要正向化的指标所在列组成的列表,如第2、3列,需输入[2,3]: ');
    type_list = input('请输入这些列的指标类型组成的列表(1:极小型, 2:中间型, 3:区间型): ');
    for i = 1:size(col_list,2)  % 列
        A(:,col_list(i)) = Positivization(col_list(i),type_list(i),A(:,col_list(i)));
    end
end
% 3、标准化
if isempty(find(A < 0))
    disp('不存在负数,标准化后的矩阵为:')
    % A_stand = A./ repmat(sum(A.*A).^(1/2),n,1) % 按列求和
    A_stand = (A - repmat(min(A),n,1))./(repmat(max(A)-min(A),n,1)) 
else
    disp('存在负数,标准化后的矩阵为:')
    A_stand = (A - repmat(min(A),n,1))./(repmat(max(A)-min(A),n,1)) 
end
% 4、计算概率矩阵:相当于每个标准化后的指标归一化
disp('概率矩阵为:')
P = A_stand./repmat(sum(A_stand),n,1)
% 5、计算每个指标的信息熵
disp('指标的信息熵:')
E = -sum(P.*My_log(P))/log(n)
% 6、计算权重
disp('指标对应的权重:')
W = (1-E)./sum(E)
% 归一化
W = W./sum(W)
% 7、计算最终得分
disp('最终综合得分为:')
score = sum(W.*A_stand,2)
score_stand = score ./ sum(score);
[score_stand_sort, index] = sort(score_stand, 'descend');
disp('最终名次为:')
disp(index)

My_log.m

function [lnP] = My_log(P)
    % 当矩阵P中的元素为0时,返回0
    n = size(P,1);
    m = size(P,2);
    lnP = zeros(n,m);
    for i = 1:n*m
        if P(i) == 0
            lnP(i) = 0;
        else
            lnP(i) = log(P(i));
        end
    end
end

Positivization.m

% 传入三个参数:
% i为第几列,type为指标类型(1:极小型, 2:中间型, 3:区间型),A_col为对应列向量
% 返回正向化后的列向量A_col
function [A_col] = Positivization(i,type,A_col)
    
    if type == 1        % 极小型
        disp(['第',num2str(i),'列是极小型'] )
        A_col = min_to_max(A_col);
    elseif type == 2    % 中间型
        disp(['第',num2str(i),'列是中间型'] )
        value = input('请输入最佳值: ');
        A_col = mid_to_max(A_col, value);
    elseif type == 3    % 区间型
        disp(['第',num2str(i),'列是区间型'] )
        l = input('请输入区间的下界: ');
        r = input('请输入区间的上界: '); 
        A_col = inter_to_max(A_col, l, r);
    else
        disp('没有这种类型的指标,请检查type是否输入错误')
    end
end

命令行窗口:

数据集为:
    4.6900    6.5900   51.0000   11.9400
    2.0300    7.8600   19.0000    6.4600
    9.1100    6.3100   46.0000    8.9100
    8.6100    7.0500   46.0000   26.4300
    7.1300    6.5000   50.0000   23.5700
    2.3900    6.7700   38.0000   24.6200
    7.6900    6.7900   38.0000    6.0100
    9.3000    6.8100   27.0000   31.5700
    5.4500    7.6200    5.0000   18.4600
    6.1900    7.2700   17.0000    7.5100
    7.9300    7.5300    9.0000    6.5200
    4.4000    7.2800   17.0000   25.3000
    7.4600    8.2400   23.0000   14.4200
    2.0100    5.5500   47.0000   26.3100
    2.0400    6.4000   23.0000   17.9100
    7.7300    6.1400   52.0000   15.7200
    6.3500    7.5800   25.0000   29.4600
    8.2900    8.4100   39.0000   12.0200
    3.5400    7.2700   54.0000    3.1600
    7.4400    6.2600    8.0000   28.4100

该数据一共有20个评价对象,有4个评价指标
这4个指标是否需要进行正向化处理,需要请输入1 ,不需要输入0:1
请输入需要正向化的指标所在列组成的列表,如第2、3列,需输入[2,3]: [2,3,4]
请输入这些列的指标类型组成的列表(1:极小型, 2:中间型, 3:区间型): [2,1,3]
第2列是中间型
请输入最佳值: 7
第3列是极小型
第4列是区间型
请输入区间的下界: 10
请输入区间的上界: 20
不存在负数,标准化后的矩阵为:

A_stand =

    0.3676    0.7429    0.0612    1.0000
    0.0027    0.4214    0.7143    0.6940
    0.9739    0.5429    0.1633    0.9058
    0.9053    1.0000    0.1633    0.4443
    0.7023    0.6786    0.0816    0.6914
    0.0521    0.8714    0.3265    0.6007
    0.7791    0.8857    0.3265    0.6551
    1.0000    0.9000    0.5510         0
    0.4719    0.5929    1.0000    1.0000
    0.5734    0.8429    0.7551    0.7848
    0.8121    0.6571    0.9184    0.6992
    0.3278    0.8357    0.7551    0.5419
    0.7476    0.1500    0.6327    1.0000
         0         0    0.1429    0.4546
    0.0041    0.6071    0.6327    1.0000
    0.7846    0.4214    0.0408    1.0000
    0.5953    0.6214    0.5918    0.1824
    0.8615    0.0286    0.3061    1.0000
    0.2099    0.8429         0    0.4088
    0.7449    0.5071    0.9388    0.2731

概率矩阵为:

P =

    0.0337    0.0611    0.0067    0.0750
    0.0003    0.0347    0.0785    0.0520
    0.0892    0.0447    0.0179    0.0679
    0.0829    0.0823    0.0179    0.0333
    0.0643    0.0558    0.0090    0.0518
    0.0048    0.0717    0.0359    0.0450
    0.0714    0.0729    0.0359    0.0491
    0.0916    0.0741    0.0605         0
    0.0432    0.0488    0.1099    0.0750
    0.0525    0.0694    0.0830    0.0588
    0.0744    0.0541    0.1009    0.0524
    0.0300    0.0688    0.0830    0.0406
    0.0685    0.0123    0.0695    0.0750
         0         0    0.0157    0.0341
    0.0004    0.0500    0.0695    0.0750
    0.0719    0.0347    0.0045    0.0750
    0.0545    0.0511    0.0650    0.0137
    0.0789    0.0024    0.0336    0.0750
    0.0192    0.0694         0    0.0307
    0.0682    0.0417    0.1031    0.0205

指标的信息熵:

E =

    0.9116    0.9495    0.9019    0.9574

指标对应的权重:

W =

    0.0238    0.0136    0.0264    0.0114


W =

    0.3162    0.1805    0.3510    0.1523

最终综合得分为:

score =

    0.4241
    0.4334
    0.6012
    0.5917
    0.4785
    0.3799
    0.6206
    0.6720
    0.7596
    0.7180
    0.8042
    0.6021
    0.6378
    0.1194
    0.4853
    0.4908
    0.5359
    0.5373
    0.2807
    0.6982

最终名次为:
    11
     9
    10
    20
     8
    13
     7
    12
     3
     4
    18
    17
    16
    15
     5
     2
     1
     6
    19
    14
  • 76
    点赞
  • 494
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的风666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值