熵权法计算权重原理python实现
信息熵越大,信息量到底是越大還是越小?權(quán)重和信息熵的大小到底是正相關(guān)還是負(fù)相關(guān)?
網(wǎng)上有一些相反的說法。
有些說:熵越大,方差越大,包含的信息越多,權(quán)重越大。
另一些說:熵越小,不確定性越小,提供的信息越大,權(quán)重越大。
今天復(fù)盤一下熵權(quán)法計算權(quán)重的原理,并python實(shí)現(xiàn)。
文章目錄
- 熵權(quán)法計算權(quán)重原理
- 信息熵計算
- 熵權(quán)法計算
- 熵權(quán)悖論的解釋
- Python實(shí)現(xiàn)信息熵求權(quán)重
熵權(quán)法計算權(quán)重原理
信息熵計算
熵是對混亂程度的一種度量。混亂程度越大,熵就越大,包含的信息量越大;混亂程度越小,熵就越小,包含的信息量就越小。
計算公式:
這里的p是指標(biāo) j 中值為 i 的樣本數(shù)占總樣本數(shù)量的比例。
比如,共有2個樣本,當(dāng)指標(biāo) j 取值分別為0,1,那么p(j=0)=1/2,p(j=1)=1/2,帶入公式可得e=1。
當(dāng)2個樣本取值分別為1/2,1/2時,p只有一個,p(j=1/2)=1,帶入公式得e=0。
由此可知,方差越大,熵越大,包含的信息越多,權(quán)重應(yīng)當(dāng)越大。
那么,為什么會有一些地方說,熵越小,信息量越大,權(quán)重越大呢?
熵權(quán)法計算
這個問題要從熵權(quán)法計算權(quán)重的公式說起:
歸一化
對于不同量綱的指標(biāo)比較信息熵顯然沒有意義,需要先進(jìn)行歸一化。
同時,需要對負(fù)向指標(biāo)正向化處理,處理后的指標(biāo)均為正向指標(biāo)。
計算熵值
需要注意的是,這里的p不再是每個取值的數(shù)量所占的比例,而是該取值的大小除以該指標(biāo)所有取值的總和。
比如,共有2個樣本,當(dāng)指標(biāo) j 取值分別為0,1,那么p1=0/(0+1),p2=1/(0+1),帶入公式可得e=0。
當(dāng)2個樣本取值分別為1/2,1/2時,p1=1/2/(1/2+1/2)=1/2,p2=1/2/(1/2+1/2),帶入公式可得e=1。
計算信息熵冗余度(差異):
計算各項(xiàng)指標(biāo)的權(quán)重:
計算各樣本的綜合得分:
注意,這里的xij是歸一化后的取值,即第一步的結(jié)果。
熵權(quán)悖論的解釋
由此可知,權(quán)重與信息熵冗余度d正相關(guān),與信息熵e是負(fù)相關(guān)的。也就是說,方差越大,熵越小,包含的信息越多,權(quán)重應(yīng)當(dāng)越大。
這里與前面的結(jié)論相悖的原因就在于熵權(quán)法計算熵的公式中,p不是各取值的比例,而是各個取值的相對大小。公式不一樣,結(jié)論自然不一樣了。
Python實(shí)現(xiàn)信息熵求權(quán)重
import pandas as pd import numpy as np import mathdef nml(series): # 正向指標(biāo)歸一化 減最小值的min-max方法l = []for i in series:l.append((i - series.min()) / (series.max() - series.min()))return pd.Series(l, name=series.name)def nml_max(series): #負(fù)向指標(biāo)歸一化l = []for i in series:l.append((series.max() - i) / (series.max() - series.min()))return pd.Series(l, name=series.name)def nmlzt(df): #歸一化函數(shù),對正負(fù)向指標(biāo)分別調(diào)用nml()和nml_max()dfn = pd.DataFrame()for i in df.columns:if (i=='D'):dfn = pd.concat([dfn, nml_max(df[i])], axis=1)else:dfn = pd.concat([dfn, nml(df[i])], axis=1)# dfn為歸一化的數(shù)據(jù)return dfndef pij(df): #求信息熵公式中的p,這里直接用取值除以取值總和,而不是數(shù)量的比例D = df.copy()for i in range(D.shape[1]): # 列sum = D.iloc[:, i].sum()for j in range(D.shape[0]): # 行D.iloc[j, i] = D.iloc[j, i] / sum# 算pijreturn Ddef entropy(series): #計算信息熵_len = len(series)def ln(x):if x > 0:return math.log(x)else:return 0s = 0for i in series:s += i * ln(i)return -(1 / ln(_len)) * sdef _result(dfij): #求e、d、w并返回dfn = dfij.copy()w = pd.DataFrame(index=dfn.columns, dtype='float64')l = []for i in dfn.columns:l.append(entropy(dfn[i]))w['熵'] = lw['差異性系數(shù)'] = 1 - np.array(l)sum = w['差異性系數(shù)'].sum()l = []for i in w['差異性系數(shù)']:l.append(i / sum)w['權(quán)重'] = lreturn wdf = pd.read_csv('Blues_D.csv') #讀取你需要計算的文件 df=df[['D','GTI']] #選取需要計算的屬性列 dfn = nmlzt(df) #歸一化 dfij = pij(dfn) #求p w = _result(dfij) #求權(quán)重 w.to_excel('weight_info_entropy.xlsx', sheet_name='權(quán)重')#輸出結(jié)果 dfn = dfn.set_index(df.index, drop=True) print(dfn)總結(jié)
以上是生活随笔為你收集整理的熵权法计算权重原理python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。