Python熵權法確定權重
阿新 • • 發佈:2019-01-29
熵權法賦權是一種客觀賦權方法, 在一些評價中, 通過對熵的計算確定權重, 就是根據各項評價指標值的差異程度, 確定各評價指標的權重。詳細介紹及計算公式可參考文獻[1]。
借用上面部落格中的資料,下表是對各個科室指標考核後的評分結果。Xi為指標,ABCD..K為科室。
科室 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 |
---|---|---|---|---|---|---|---|---|---|
A | 100 | 90 | 100 | 84 | 90 | 100 | 100 | 100 | 100 |
B | 100 | 100 | 78.6 | 100 | 90 | 100 | 100 | 100 | 100 |
C |
75 | 100 | 85.7 | 100 | 90 | 100 | 100 | 100 | 100 |
D | 100 | 100 | 78.6 | 100 | 90 | 100 | 94.4 | 100 | 100 |
E | 100 | 90 | 100 | 100 | 100 | 90 | 100 | 100 | 80 |
F | 100 | 100 | 100 | 100 | 90 | 100 | 100 | 85.7 | 100 |
G | 100 | 100 | 78.6 | 100 | 90 | 100 | 55.6 | 100 | 100 |
H | 87.5 | 100 | 85.7 | 100 | 100 | 100 |
100 | 100 | 100 |
I | 100 | 100 | 92.9 | 100 | 80 | 100 | 100 | 100 | 100 |
J | 100 | 90 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
K | 100 | 100 | 92.9 | 100 | 90 | 100 | 100 | 100 | 100 |
將上述資料儲存到Excel表格中,並用xlrd讀取。
Python程式如下
import numpy as np import xlrd #讀資料並求熵 path=u'K:\\選指標的.xlsx' hn,nc=1,1 #hn為表頭行數,nc為表頭列數 sheetname=u'Sheet3' 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(data0): #返回每個樣本的指數 #樣本數,指標個數 n,m=np.shape(data0) #一行一個樣本,一列一個指標 #下面是歸一化 maxium=np.max(data0,axis=0) minium=np.min(data0,axis=0) data= (data0-minium)*1.0/(maxium-minium) ##計算第j項指標,第i個樣本佔該指標的比重 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) recodes=np.sum(data0*w,axis=1) return recodes data=readexcel(hn,nc) grades=entropy(data)
計算的結果為:
In[32]:grades
Out[32]:
array([95.7069621 , 93.14062354, 93.17273781, 92.77037549, 95.84064938,
98.01005572, 90.20508545, 95.17203466, 95.96929203, 97.80841298,
97.021269 ])
上面的程式計算得分時用了標準化前的值×權重,這對於原始評分量綱相同時沒有什麼問題。
按照論文上的公式,計算得分時應該用標準化後的值×權重,這對於原始資料量綱不同時應該這樣做,因此按照論文的公式計算的程式如下:
import numpy as np
import xlrd
#讀資料並求熵
path=u'K:\\選指標的.xlsx'
hn,nc=1,1
#hn為表頭行數,nc為表頭列數
sheetname=u'Sheet3'
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(data0):
#返回每個樣本的指數
#樣本數,指標個數
n,m=np.shape(data0)
#一行一個樣本,一列一個指標
#下面是歸一化
maxium=np.max(data0,axis=0)
minium=np.min(data0,axis=0)
data= (data0-minium)*1.0/(maxium-minium)
##計算第j項指標,第i個樣本佔該指標的比重
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)
recodes=np.sum(data*w,axis=1)
return recodes
data=readexcel(hn,nc)
grades=entropy(data)
結果如下:
In[34]:grades
Out[34]:
array([0.08767219, 0.07639727, 0.08342572, 0.07555273, 0.08920511,
0.11506703, 0.06970125, 0.09550656, 0.09852824, 0.10232353,
0.10662037])
完。
參考文獻:
[1] 倪九派, 李萍, 魏朝富,等. 基於AHP和熵權法賦權的區域土地開發整理潛力評價[J]. 農業工程學報, 2009, 25(5):202-209.