熵值法求权重

一、熵值法原理分析

(一)选取数据

m个样本,共n个指标, X i j X_{ij} Xij为为第 i i i个样本的第 j j j个指标的数值, i = 1 , 2 , 3 , . . . m ; j = 1 , 2 , 3... n . i = 1 , 2 , 3 , . . . m ; j = 1 , 2 , 3... n. i=1,2,3,...m;j=1,2,3...n.

(二)数据标准化处理

1、正负相关性处理

各项指标的计量单位以及方向不统一的情况下,需要对对数据进行标准化,为了避免求熵值时对数无意义,可以为每个值加上较小数量级的实数,如0.001

(1)正相关指标

X ′ = X i j − M i n ( X i j ) M a x ( X i j ) − M i n ( X i j ) X'= \frac{X_{ij}- Min(X_{ij})}{Max(X_{ij})-Min(X_{ij})} X=Max(Xij)Min(Xij)XijMin(Xij)

(2)对于负向指标(越小越好的指标)

X ′ = M a x ( X i j ) − X i j M a x ( X i j ) − M i n ( X i j ) X' = \frac{Max(X_{ij})-X_{ij}}{Max(X_{ij})-Min(X_{ij})} X=Max(Xij)Min(Xij)Max(Xij)Xij

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

计算样本权重:
P i j = X i j ∑ i = 1 n X i j P_{ij} = \frac{X_{ij}}{\sum_{i=1}^nX_{ij}} Pij=i=1nXijXij

4、计算第 j j j 项指标的熵值

计算指标熵值:
e j = − 1 l n ( m ) ∗ ∑ i = 1 m ( P i j ∗ l n ( P i j ) ) e_j = -\frac{1}{ln(m)}*\sum_{i=1}^m(P_{ij}*ln(P_{ij})) ej=ln(m)1i=1m(Pijln(Pij))
,其中m为样本个数。

5、计算第 j j j 项指标的差异系数

某项指标的信息效用值取决于该指标的信息熵与 1 之间的差值,它的值直接影响权重的大小。信息效用值越大,对评价的重要性就越大,权重也就越大。
d j = 1 − e j d_j=1-e_j dj=1ej

6、计算评价指标权重

利用熵值法估算各指标的权重,其本质是利用该指标信息的差异系数来计算,其差异系数越高,对评价的重要性就越大(或称权重越大,对评价结果的贡献就越大)
第j jj项指标的权重:
w j = d j ∑ j = 1 m d j w_j=\frac{d_j}{\sum_{j=1}^md_j} wj=j=1mdjdj

7、计算各样本综合得分

z i = ∑ j = 1 m w j x i j z_i=\sum_{j=1}^mw_jx_{ij} zi=j=1mwjxij

二、测试案例

1、本案例数据集以2012年全国大学生数学建模A题部分数据为例
样品编号氨基酸总量天门冬氨酸苏氨酸丝氨酸谷氨酸脯氨酸
葡萄样品12027.96101.22393.4277.61266.6723.88
葡萄样品22128.8264.43140.6271.9439.261560.97
葡萄样品38397.28108.07222.35173.0867.547472.28
葡萄样品42144.6879.39133.83158.74156.721182.23
葡萄样品5184452.28145.09164.05102.43816.08
葡萄样品63434.1768.01102.4275.7880.62932.76
葡萄样品72391.1665.1267.76239.2208.971096.28
葡萄样品81950.7672.09345.8744.23176.02962.01
2、完整代码
import numpy as np
import pandas as pd

## 读取数据
data=pd.read_csv('redputao.csv',encoding='utf-8',index_col=0)
indicator=data.columns.tolist()   ## 指标个数   多少列
project=data.index.tolist()       ## 样本个数   多少行
value=data.values
print(indicator)
print(project)
print(value)



## 定义数据标准化函数。为了避免求熵值时对数无意义,对数据进行平移,对标准化后的数据统一加了常数0.001
def std_data(value,flag):
    for i in range(len(indicator)):
        if flag[i]=='+':
            value[:,i]=(value[:,i]-np.min(value[:,i],axis=0))/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.01
        elif flag[i]=='-':
            value[:,i]=(np.max(value[:,i],axis=0)-value[:,i])/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.01
    return value


# 定义熵值法函数、熵值法计算变量的权重
def cal_weight(indicator, project, value):
    p = np.array([[0.0 for i in range(len(indicator))] for i in range(len(project))])
    # print(p)
    for i in range(len(indicator)):
        p[:, i] = value[:, i] / np.sum(value[:, i], axis=0)

    e = -1 / np.log(len(project)) * sum(p * np.log(p))  # 计算熵值
    g = 1 - e  # 计算一致性程度
    w = g / sum(g)  # 计算权重
    return w

# 表示各项指标为正向指标还是反向指标
flag=["+","+","+","+","+",    "+","+","+","+","+",
      "+","+","+","+","+",    "+","+","+","+","+",
      "+","+","+","+","+",    "+","+","+","+","+",
      "+","+","+","+","+",    "+","+","+","+","+",
      "+","+","+","+","+",    "+","+","+","+","+",
      "+","+","+","+"]

# 调用函数将数据标准化,即为每个数据添加正相关还是负相关标志
std_value=std_data(value, flag)

# 调用函数求权重
w = cal_weight(indicator, project, std_value)
w = pd.DataFrame(w, index=data.columns, columns=['权重'])
print(w)

# 调用函数求得分
score = np.dot(std_value, w).round(4)         # 对应数据与权重相乘得到分数,结果保留四位小数
score = pd.DataFrame(score, index=data.index, columns=['综合得分']).sort_values(by=['综合得分'], ascending=False)
print(score)

三、测试案例运行结果

运行结果
在这里插入图片描述
在这里插入图片描述

四、测试表格

csv下载链接 提取码:1234

  • 22
    点赞
  • 236
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亦是远方

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

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

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

打赏作者

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

抵扣说明:

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

余额充值