数学建模之熵权法(EWM)matlab实例实现

本文参考http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html

熵权法是一种客观赋值的方法,即它通过数据所包含的信息量来确定权重,形象的说如果每个人考试都能考100分,那么这个指标对于这些人的评价是毫无意义的,因为没有任何区分度,熵权法就是通过区分度来确定对于特征的权值,从而能够对事物进行综合的评价。

一般来说,若某个指标的信息熵指标权重确定方法之熵权法越小,表明指标值得变异程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的信息熵指标权重确定方法之熵权法越大,表明指标值得变异程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。

基于此熵权法步骤如下:

首先需要将数据标准化即让数据分布在0-1之间,方式有多种
例如归一化,即 当前特征元素-当前特征列的最小值/当前特征列的最大值-当前特征列的最小值(本文采用此方法):
在这里插入图片描述
或者标准化
在这里插入图片描述

然后计算各指标的信息熵
pij表示的是当前元素在当前特征列的占比
Ej代表此特征的信息熵
且规定0ln0 = 0
在这里插入图片描述

最后就是确定各指标的权重
由于信息熵越大,其所代表的数据不确定性越大
因此信息熵越小,代表其区分度越高,即说明此特征越重要
因此需要1-Ei来获取对应特征的实际重要程度
再通过除以所有特征重要程度之和,即能计算出,此特征在所有特征中的重要程度占比,从而计算出对应特征的权重。
在这里插入图片描述

下边展示一道例题:
在这里插入图片描述
由于从题目中能够看出,各指标都是正向指标,因此最终特征值*特征权重求和也都是包含正向因素,值越大代表评价越高,但是如果包含负向评价的话,我认为,可能特征值取反应该就能转变成正向评价了吧。

第一步先进行归一化处理

data = [100,90,100,84,90,100,100,100,100
    100,100,78.6,100,90,100,100,100,100
    75,100,85.7,100,90,100,100,100,100
    100,100,78.6,100,90,100,94.4,100,100
    100,90,100,100,100,90,100,100,80
    100,100,100,100,90,100,100,85.7,100
    100,100,78.6,100,90,100,55.6,100,100
    87.5,100,85.7,100,100,100,100,100,100
    100,100,92.9,100,80,100,100,100,100
    100,90,100,100,100,100,100,100,100
    100,100,92.9,100,90,100,100,100,100];
[Y,PS] = mapminmax(data',0,1);%由于此函数是按行进行归一化的,因此先转置再转回来就好了
to_one = Y';

结果如下:
在这里插入图片描述
第二步求特征元素占比

ele_weight = [];
sum_col = sum(to_one); %默认按列求和
[row, col] = size(to_one); %获取原数据矩阵的行和列
for i = 1:row
    for j = 1:col
        ele_weight(i,j) = to_one(i,j)/sum_col(j); %计算出归一化后每个元素在所在特征列的占比
    end
end

第三步求各元素信息熵
在这里插入图片描述

E_ele = [];
for i = 1:row
    for j = 1:col
        if ele_weight(i,j) == 0 %规定0*ln(0) = 0,不赋值默认为0
            continue
        end
        E_ele(i,j) = -ele_weight(i,j)*log(ele_weight(i,j));%计算信息熵,matlab中log即取ln
    end
end
E = sum(E_ele./log(row));%计算此特征的信息熵
sum_E = sum(E)

最后一步通过特征信息熵求出特征权重并计算分数
在这里插入图片描述

W = (1-E)./(col-sum_E);%通过信息熵计算对应特征的权重,列数即为特征数
W = W';%转置便于矩阵乘法直接计算出对应的评价分数

data * W

matlab完整代码如下:

clc,clear
data = [100,90,100,84,90,100,100,100,100
    100,100,78.6,100,90,100,100,100,100
    75,100,85.7,100,90,100,100,100,100
    100,100,78.6,100,90,100,94.4,100,100
    100,90,100,100,100,90,100,100,80
    100,100,100,100,90,100,100,85.7,100
    100,100,78.6,100,90,100,55.6,100,100
    87.5,100,85.7,100,100,100,100,100,100
    100,100,92.9,100,80,100,100,100,100
    100,90,100,100,100,100,100,100,100
    100,100,92.9,100,90,100,100,100,100];
[Y,PS] = mapminmax(data',0,1);%由于此函数是按行进行归一化的,因此先转置再转回来就好了
to_one = Y';

ele_weight = [];
sum_col = sum(to_one); %默认按列求和
[row, col] = size(to_one); %获取原数据矩阵的行和列
for i = 1:row
    for j = 1:col
        ele_weight(i,j) = to_one(i,j)/sum_col(j); %计算出归一化后每个元素在所在特征列的占比
    end
end

E_ele = [];
for i = 1:row
    for j = 1:col
        if ele_weight(i,j) == 0 %规定0*ln(0) = 0,不赋值默认为0
            continue
        end
        E_ele(i,j) = -ele_weight(i,j)*log(ele_weight(i,j));%计算信息熵
    end
end

E = sum(E_ele./log(row));%计算此特征的信息熵
sum_E = sum(E);
W = (1-E)./(col-sum_E);%通过信息熵计算对应特征的权重
W = W';%转置便于矩阵乘法直接计算出对应的评价分数

data * W

  • 60
    点赞
  • 455
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Icy Hunter

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

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

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

打赏作者

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

抵扣说明:

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

余额充值