熵属于物理概念,最先由申农引入到信息论,目前已经在工程技术、社会经济等领域得到了非常广泛的应用。
熵权法的基本思路是依据指标变异性的大小来确定权重。其前提是,若某个指标的信息熵越小,则指标值得变异程度越大,在综合评价中所能起到的作用也越大,其权重越大。相反,某个指标的信息熵越大,则指标值得变异程度越小,在综合评价中所起到的作用也越小,其权重越小。优于其思路简单,易于理解,目前已经在工程技术、社会经济等领域得到了非常广泛的应用。
熵权法具有的问题是过于客观,有时会和实际情况不符,如耕地坡度的差异,本来较大差异对该地区耕地潜力不会造成太大影响,但是会将其权重判定很大。
实现步骤:
(1)数据归一化
设有n个评价单元,m项评价指标,定量取得各评价单元对应评价指标的数据,形成原始数据矩 ,利用公式4-6,公式4-7归一化处理后,得标准化矩阵,即:
(4-5)
其中,。
正项指标公式:
(4-6)
负向指标公式:
(4-7)
(2) 求各指标的信息熵
计算第j项指标的熵值:
, (4-8)
其中,, ,满足,
(3)确定各指标权重
计算第j项指标的权重:
import numpy as np
import xlrd
path=u'D:\\数据处理.xlsx' #读数据并求熵
hn,nc=21,1 #hn为表头行数,nc为表头列数
sheetname=u'Sheet1'
def readexcel(hn,nc):
data = xlrd.open_workbook(path)
table = data.sheet_by_name(sheetname)
nrows = table.nrows #获取工作表行数
data=[]
for i in range(hn,nrows):
data.append(table.row_values(i)[nc:])
return np.array(data)
def entropy(data): #返回每个样本的指数
n=np.shape(data)[0]
sumzb=np.sum(data,axis=0)
data=data/sumzb
#对ln0处理
a=data*1.0
a[np.where(data==0)]=0.0001
# #计算每个指标的熵
e=(-1.0/np.log(n))*np.sum(data*np.log(a),axis=0)
# #计算权重
w=(1-e)/np.sum(1-e)
w = [round(i,4) for i in w]
print(w)
recodes=np.sum(data*w,axis=1)
return recodes
data=readexcel(hn,nc)
grades=entropy(data)
""" 归一化
n,m=np.shape(data0) #行为样本数,列为指标个数
maxium=np.max(data0,axis=0) #下面是归一化 axis=0为列项 axis=1为横向
minium=np.min(data0,axis=0)
data= (data0-minium)*1.0/(maxium-minium)
##计算第j项指标,第i个样本占该指标的比重
"""