熵权法实现
文章目录
- 熵权法
- 算法步骤
- 数据./data.csv:
- 程序:
- 熵权法的优缺点
- 参考:
熵权法
一般来说,若某个指标的概率越大,不确定程度越小,信息熵越小,指标离散程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的指标的概率越小,不确定程度越小,信息熵越大,表明指标值得离散程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。
而熵权法是统计学领域,与信息学领域对熵值的解释有所不同。简言之,在统计学领域中,当数据越分散时,熵值越小,可认为该数据包含信息越多,因此权重越大,这也是熵权法的解释;而在信息学领域中,数据越分散,计算熵值越小,数据中的信息越不可靠,可以说数据包含的信息越少。
算法步骤
假设有 m m m个研究对象, n n n个指标:
i = 1 , 2 , … , m , j = 1 , 2 , … , n i=1,2,\dots,m,j=1,2,\dots,n i=1,2,…,m,j=1,2,…,n
X = [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x m 1 x m 2 ⋯ x m n ] X=\begin{bmatrix} {x_{11}}&{x_{12}}&{\cdots}&{x_{1n}}\\ {x_{21}}&{x_{22}}&{\cdots}&{x_{2n}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {x_{m1}}&{x_{m2}}&{\cdots}&{x_{mn}}\\ \end{bmatrix} X= x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1nx2n⋮xmn
指标标准化。
对于正向指标: x i j = x i j − min ( x j ) max ( x j ) − min ( x j ) x_{ij}=\frac{x_{ij}-\min(x_j)}{\max(x_j)-\min(x_j)} xij=max(xj)−min(xj)xij−min(xj).
对于负向指标: x i j = max ( x j ) − x i j max ( x j ) − min ( x j ) x_{ij}=\frac{\max(x_j)-x_{ij}}{\max(x_j)-\min(x_j)} xij=max(xj)−min(xj)max(xj)−xij.
计算第 i i i个研究对象下第 j j j项指标的比重 p i j p_{ij} pij
p i j = x i j ∑ i m x i j p_{ij}=\frac{x_{ij}}{\sum\limits_{i}^mx_{ij}} pij=i∑mxijxij
计算第j项指标的熵值
e j = − k ∑ i m p i j ln p i j e_j=-k\sum\limits_i^mp_{ij}\ln p_{ij} ej=−ki∑mpijlnpij, k = 1 ln m k=\frac{1}{\ln m} k=lnm1
计算第 j j j项指标的差异系数 g j g_j gj
差异系数越大越好,表示该指标对于研究对象所起的作用越大,该指标较好。
g j = 1 − e j g_j=1-e_j gj=1−ej
给指标赋权,定义权重 w j w_j wj
w j = g j ∑ j n g j w_j=\frac{g_j}{\sum\limits_j^ng_j} wj=j∑ngjgj
通过权重计算样本评价值,第 i i i个研究对象下第 j j j项指标的评价值为:
F i j = a j x i j F_{ij}=a_jx_{ij} Fij=ajxij
则第 i i i个研究对象的总体评价值为:
F i = ∑ j n F i j F_i=\sum\limits_j^nF_{ij} Fi=j∑nFij
数据./data.csv:
车型,油耗,功率,费用,安全性,维护性,操作性
本田,5,1.4,6,3,5,7
奥迪,9,2,30,7,5,9
桑塔纳,8,1.8,11,5,7,5
别克,12,2.5,18,7,5,5
程序:
#!/usr/bin/env python
# coding: utf-8
import numpy as np
import pandas as pd#定义数据标准化函数。为了避免求熵值时对数无意义,对数据进行平移,对标准化后的数据统一加了常数0.001
def std_data(value,flag):for i in range(len(indicator)):#print(flag[i])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.001elif 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.001return 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 j in range(len(indicator)):p[:,j]=value[:,j]/np.sum(value[:,j],axis=0)#沿轴print(p)e=-1/np.log(len(project))*sum(p*np.log(p)) #计算熵值g=1-e # 计算一致性程度w=g/sum(g) #计算权重return w
if __name__ == '__main__':##读取数据data=pd.read_csv('./data.csv',encoding='utf-8',index_col=0)data.dropna()indicator=data.columns.tolist() ##指标个数project=data.index.tolist() ##方案数、评价主体value=data.valuesprint(indicator)print(project)print(value)print(data.head())##数据标准化flag=["-","+","-","+","+","+"] ##表示指标为正向指标还是反向指标std_value=std_data(value,flag)std_value.round(3)##结果w=cal_weight(indicator,project,std_value)w=pd.DataFrame(w,index=data.columns,columns=['权重'])print("#######权重:#######")print(w)score=np.dot(std_value,w).round(2)score=pd.DataFrame(score,index=data.index,columns=['综合得分']).sort_values(by =['综合得分'],ascending = False)print(score)
熵权法的优缺点
1.优点
首先,熵权法是客观确定权重的方法,相较于层次分析法等主观法而言具有一定的精确性;
其次,该方法确定出的权重可以进行修正,从而决定了其适应性较高的特点。
2.缺点
该方法的应用范围有限,仅适于计算权重。
参考:
https://www.zhihu.com/question/274997106/answer/1222518795
https://blog.csdn.net/ziyin_2013/article/details/116496411
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
