熵值法原理、应⽤及其Python 实现
熵值法是⼀种依据各指标值所包含的信息量的多少确定指标权重的客观赋权法,某个指标的熵越⼩,说明该指标值的变异程度越⼤,提供的信息量也就越多,在综合评价中起的作⽤越⼤,则该指标的权重也应越⼤。熵值法可单独进⾏综合评价;也可以与其他⽅法相结合,如层次分析法,⽤熵值法确定各指标的权重,然后运⽤层次分析法得到各个评价对象的综合得分。
1.熵值法的基本步骤假设i(取值范围[1,m])表⽰评价对象,j(取值范围[1,n])表⽰评价指标。
指标标准化。
对于正向指标:对于反向向指标:计算第i个研究对象下第j项指标的⽐重。计算第j项指标的熵值。,其中计算第j项指标的差异系数,差异系数越⼤越好,表⽰该指标对于研究对象所起的作⽤越⼤,该指标较好。
给指标赋权,定义权重。通过权重计算样本评价值,第i个研究对象下第j项指标的评价值为:
则第i个研究对象的总体评价值为:
2.熵值法的应⽤⽰例
运⽤熵值法综合评价2015年贵州省各市州城市建设环境,选取指标为城市燃⽓普及率、城市⽤⽔普及率、⼈均城市道路⾯积、每万⼈拥有
公共交通车辆、⼈均公园绿地⾯积、⽣活垃圾⽆害化处理率,下⾯截图来⾃《》。
=x ij ′max ()−min ()
x j x j −min ()
x ij x j =x ij
′max ()−min ()x j x j max ()−x j x ij p ij p =
ij x i =1∑m ij x ij e j e =j −k p ln p i =1∑m ij ij k =ln m
1g j g =j 1−e j
w j w =
j g j =1∑n j g j F =ij a x j ij ′能运行python的软件
F =i F j =1∑m
ij
根据熵值及权重设定表得,6个指标的权重由⼤到⼩依次为城市燃⽓普及率、⽣活垃圾⽆害化处理率、⼈均公园绿地⾯积、城市⽤⽔普及率、⼈均城市道路⾯积、每万⼈拥有公共交通车辆,即城市燃⽓普及率对城市建设环境的影响最⼤。从评价结果可得,贵州省各市城市建设环境差距并不是很显著,宜
居城市排序为贵阳市、毕节市、六盘⽔市、遵义市、仁怀市、清镇市、安顺市、兴义市、凯⾥市、都匀市、⾚⽔市、铜仁市。其中贵阳市在城市燃⽓普及率和每万⼈拥有公共交通车辆上遥遥领先于其他各市,兴义市的⼈均城市道路⾯积最多,毕节市的⼈均公园绿地⾯积⾼于其他各市。各市⽣活垃圾⽆害化处理率都⽐较⾼,均超过了90%。
3.运⽤Python实现熵值法
读取数据
import numpy as np
import pandas as pd
##读取数据
ad_csv('data.csv',encoding='gb18030',index_col=0)
list() ##指标个数
project=list() ##⽅案数、评价主体
value=data.values
print(indicator)
print(project)
print(value)
data.head()
数据标准化
###定义数据标准化函数。为了避免求熵值时对数⽆意义,对数据进⾏平移,对标准化后的数据统⼀加了常数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.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
##数据标准化
flag=["-","+","-","+","+","+"] ##表⽰指标为正向指标还是反向指标
std_value=std_data(value,flag)
und(3)
计算权重和综合得分
#定义熵值法函数、熵值法计算变量的权重
def cal_weight(indicator,project,value):
p= np.array([[0.0for 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
##结果
w=cal_weight(indicator,project,std_value)
w=pd.DataFrame(w,lumns,columns=['权重'])
print(">##权重:>##")
print(w)
score=np.dot(std_value,w).round(2)
#print(score)
score=pd.DataFrame(score,index=data.index,columns=['综合得分']).sort_values(by =['综合得分'],ascending = False)
score
ps:初衷是通过撰写博⽂记录⾃⼰所学所⽤,实现知识的梳理与积累;将其分享,希望能够帮到⾯临同样困惑的⼩伙伴⼉。如发现博⽂中存在问题,欢迎随时交流~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论