Python熵权法确定权重
聲明:本文只是個(gè)人按照原理對(duì)熵權(quán)法的實(shí)現(xiàn),結(jié)果與手動(dòng)計(jì)算的結(jié)果一樣。如果有疑問,請(qǐng)多參考一些其他的資料。
熵權(quán)法賦權(quán)是一種客觀賦權(quán)方法, 在一些評(píng)價(jià)中, 通過對(duì)熵的計(jì)算確定權(quán)重, 就是根據(jù)各項(xiàng)評(píng)價(jià)指標(biāo)值的差異程度, 確定各評(píng)價(jià)指標(biāo)的權(quán)重。詳細(xì)介紹及計(jì)算公式可參考文獻(xiàn)[1]。
主要步驟包括(1)原始數(shù)據(jù)矩陣進(jìn)行標(biāo)準(zhǔn)化(2)定義熵(3)定義熵權(quán)。具體步驟也可參考https://blog.csdn.net/wangh0802/article/details/53981356。這里不再贅述。這里通過Python實(shí)現(xiàn)計(jì)算步驟。
借用上面博客中的數(shù)據(jù),下表是對(duì)各個(gè)科室指標(biāo)考核后的評(píng)分結(jié)果。Xi為指標(biāo),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 |
將上述數(shù)據(jù)保存到Excel表格中,并用xlrd讀取。
Python程序如下
import numpy as np import xlrd#讀數(shù)據(jù)并求熵 path=u'K:\\選指標(biāo)的.xlsx' hn,nc=1,1 #hn為表頭行數(shù),nc為表頭列數(shù) 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):#返回每個(gè)樣本的指數(shù)#樣本數(shù),指標(biāo)個(gè)數(shù)n,m=np.shape(data0)#一行一個(gè)樣本,一列一個(gè)指標(biāo)#下面是歸一化maxium=np.max(data0,axis=0)minium=np.min(data0,axis=0)data= (data0-minium)*1.0/(maxium-minium)##計(jì)算第j項(xiàng)指標(biāo),第i個(gè)樣本占該指標(biāo)的比重sumzb=np.sum(data,axis=0)data=data/sumzb#對(duì)ln0處理a=data*1.0a[np.where(data==0)]=0.0001 # #計(jì)算每個(gè)指標(biāo)的熵e=(-1.0/np.log(n))*np.sum(data*np.log(a),axis=0) # #計(jì)算權(quán)重w=(1-e)/np.sum(1-e)recodes=np.sum(data0*w,axis=1)return recodes data=readexcel(hn,nc) grades=entropy(data)計(jì)算的結(jié)果為:
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 ])上面的程序計(jì)算得分時(shí)用了標(biāo)準(zhǔn)化前的值×權(quán)重,這對(duì)于原始評(píng)分量綱相同時(shí)沒有什么問題。
按照論文上的公式,計(jì)算得分時(shí)應(yīng)該用標(biāo)準(zhǔn)化后的值×權(quán)重,這對(duì)于原始數(shù)據(jù)量綱不同時(shí)應(yīng)該這樣做,因此按照論文的公式計(jì)算的程序如下:
import numpy as np import xlrd#讀數(shù)據(jù)并求熵 path=u'K:\\選指標(biāo)的.xlsx' hn,nc=1,1 #hn為表頭行數(shù),nc為表頭列數(shù) 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):#返回每個(gè)樣本的指數(shù)#樣本數(shù),指標(biāo)個(gè)數(shù)n,m=np.shape(data0)#一行一個(gè)樣本,一列一個(gè)指標(biāo)#下面是歸一化maxium=np.max(data0,axis=0)minium=np.min(data0,axis=0)data= (data0-minium)*1.0/(maxium-minium)##計(jì)算第j項(xiàng)指標(biāo),第i個(gè)樣本占該指標(biāo)的比重sumzb=np.sum(data,axis=0)data=data/sumzb#對(duì)ln0處理a=data*1.0a[np.where(data==0)]=0.0001 # #計(jì)算每個(gè)指標(biāo)的熵e=(-1.0/np.log(n))*np.sum(data*np.log(a),axis=0) # #計(jì)算權(quán)重w=(1-e)/np.sum(1-e)recodes=np.sum(data*w,axis=1)return recodes data=readexcel(hn,nc) grades=entropy(data)結(jié)果如下:
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])完。
參考文獻(xiàn):
[1] 倪九派, 李萍, 魏朝富,等. 基于AHP和熵權(quán)法賦權(quán)的區(qū)域土地開發(fā)整理潛力評(píng)價(jià)[J]. 農(nóng)業(yè)工程學(xué)報(bào), 2009, 25(5):202-209.
總結(jié)
以上是生活随笔為你收集整理的Python熵权法确定权重的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat8安装(或卸载重装)
- 下一篇: 易语言变量和c对应关系,详解易语言变量用