Python熵权法确定权重
生活随笔
收集整理的這篇文章主要介紹了
Python熵权法确定权重
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
聲明:本文只是個人按照原理對熵權法的實現,結果與手動計算的結果一樣。如果有疑問,請多參考一些其他的資料。
熵權法賦權是一種客觀賦權方法, 在一些評價中, 通過對熵的計算確定權重, 就是根據各項評價指標值的差異程度, 確定各評價指標的權重。詳細介紹及計算公式可參考文獻[1]。
主要步驟包括(1)原始數據矩陣進行標準化(2)定義熵(3)定義熵權。具體步驟也可參考https://blog.csdn.net/wangh0802/article/details/53981356。這里不再贅述。這里通過Python實現計算步驟。
借用上面博客中的數據,下表是對各個科室指標考核后的評分結果。Xi為指標,ABCD..K為科室。
| 100 | 90 | 100 | 84 | 90 | 100 | 100 | 100 | 100 |
| 100 | 100 | 78.6 | 100 | 90 | 100 | 100 | 100 | 100 |
| 75 | 100 | 85.7 | 100 | 90 | 100 | 100 | 100 | 100 |
| 100 | 100 | 78.6 | 100 | 90 | 100 | 94.4 | 100 | 100 |
| 100 | 90 | 100 | 100 | 100 | 90 | 100 | 100 | 80 |
| 100 | 100 | 100 | 100 | 90 | 100 | 100 | 85.7 | 100 |
| 100 | 100 | 78.6 | 100 | 90 | 100 | 55.6 | 100 | 100 |
| 87.5 | 100 | 85.7 | 100 | 100 | 100 | 100 | 100 | 100 |
| 100 | 100 | 92.9 | 100 | 80 | 100 | 100 | 100 | 100 |
| 100 | 90 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 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.nrowsdata=[]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.0a[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.nrowsdata=[]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.0a[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.
總結
以上是生活随笔為你收集整理的Python熵权法确定权重的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat8安装(或卸载重装)
- 下一篇: 易语言变量和c对应关系,详解易语言变量用