熵值法原理及Python實(shí)現(xiàn)的示例詳解
熵值法也稱熵權(quán)法,是學(xué)術(shù)研究,及實(shí)際應(yīng)用中的一種常用且有效的編制指標(biāo)的方法。
1.簡單理解 信息熵
機(jī)器學(xué)習(xí)中的決策樹算法是對信息熵的一種典型的應(yīng)用。
在信息論中,使用 熵 (Entropy)來描述隨機(jī)變量分布的不確定性。
假設(shè)對隨機(jī)變量X,其可能的取值有x1,x2,...,xn 。即有n種可能發(fā)生的結(jié)果。其對應(yīng)發(fā)生的概率依次為p1,p2,...,pn,則事件pi對應(yīng)的信息熵為:
信息熵中l(wèi)og的底數(shù)通常為2,理論上可以使用不同的底數(shù)。
如何理解信息熵呢,假設(shè)已知今天是周日,則對于“明天是周幾”這件事,只有一種可能的結(jié)果:是周一,且p=1。則“明天是周幾”的信息熵H(X)為−1×log1=0,取信息熵的最小值0。表示“明天是周幾”這個(gè)話題的不確定性很低,明天周幾很確定。
再比如拋一枚硬幣,則結(jié)果為正面和反面的概率都是0.5。則信息熵為log2,相比“明天周幾”這件事的信息熵稍大些了。
假設(shè)某事情有100中可能的結(jié)果,每種結(jié)果發(fā)生的概率為0.01。則H(X)=log100,對于等概率均勻分布的事件,不確定的結(jié)果種類越多,則熵越大。
2.編制指標(biāo) (學(xué)術(shù)情景應(yīng)用)
遷移到編制指標(biāo)的情形,通過下邊一個(gè)簡單的示例理解熵權(quán)法在學(xué)術(shù)研究中的應(yīng)用。
以陳浩,劉媛華的論文《數(shù)字經(jīng)濟(jì)促進(jìn)制造業(yè)高質(zhì)量發(fā)展了嗎?——基于省級面板數(shù)據(jù)和機(jī)器學(xué)習(xí)模型的實(shí)證分析》中部分內(nèi)容展示為例:
對于離散型的隨機(jī)變量,某指標(biāo)在樣本中出現(xiàn)的頻率即可視為概率P,進(jìn)而求出每個(gè)指標(biāo)的熵值。
而對于上圖中的連續(xù)型的隨機(jī)變量,則在處理思想上與離散型隨機(jī)變量有所不同。
通常可以先對數(shù)據(jù)做標(biāo)準(zhǔn)化處理,假設(shè)X指標(biāo)中的第i個(gè)樣本的標(biāo)準(zhǔn)化處理結(jié)果為Zi:(注意對正向指標(biāo)和負(fù))
則指標(biāo)X中的第i個(gè)樣本的權(quán)重為:
上邊說到,指標(biāo)的熵值計(jì)算公式為:
為了方便求變異系數(shù),這里計(jì)算熵值的時(shí)候常常在該公式的基礎(chǔ)上再乘以一個(gè)常數(shù)K,即
其中K=1/ln(n) ,n是樣本的個(gè)數(shù)。易知,乘以常數(shù)后計(jì)算出的熵值,通常范圍都是在區(qū)間[0,1]內(nèi)的。
舉個(gè)例子,假設(shè)一共有十個(gè)樣本,且十個(gè)樣本的連續(xù)型X指標(biāo)數(shù)值非常相近,甚至完全一致。
對數(shù)的底數(shù)取10,則每個(gè)樣本的權(quán)重都有接近或等于1/10。
通過公式
計(jì)算出的熵值則為1,然后引入一個(gè)新的指標(biāo)“差異系數(shù)”來刻畫數(shù)據(jù)之間的差異性大小(即使用1減去熵值得到所謂“差異系數(shù)”,不要跟變異系數(shù)混淆),第j個(gè)指標(biāo)的差異系數(shù)dj?=1−Hj?(H_j為第j個(gè)指標(biāo)的熵值)
計(jì)算可知差異系數(shù)為0。則說明該指標(biāo)在數(shù)值上不存在任何差異(雀食如此)。
隨著數(shù)據(jù)本身數(shù)值上的差距的提升,指標(biāo)的熵值會逐步減小,差異系數(shù)逐漸增大。這樣說相信很容易理解了。
指標(biāo)的熵值越?。ú町愊禂?shù)越大),則該指標(biāo)在最終要編制的指標(biāo)中所占的權(quán)重則越大。
具體的權(quán)重計(jì)算公式為:
即某指標(biāo)差異系數(shù)占所有指標(biāo)差異系數(shù)和的比重。
上圖的情景中,作者首先對二級指標(biāo)進(jìn)行衡量,然后使用熵權(quán)法,求出每個(gè)二級指標(biāo)的熵值,進(jìn)而求出權(quán)重,分別計(jì)算出四個(gè)一級指標(biāo);
然后再對四個(gè)一級指標(biāo)再次使用熵權(quán)法計(jì)算權(quán)重,進(jìn)而得到最終指標(biāo):制造業(yè)高質(zhì)量發(fā)展水平。
3.python實(shí)現(xiàn)
3.1 數(shù)據(jù)準(zhǔn)備
為方便讀者測試,這邊手動生成一段數(shù)據(jù)作為示例。
將指標(biāo)1,指標(biāo)2,指標(biāo)3,指標(biāo)4,合并編制為一個(gè)“綜合指標(biāo)”。
import pandas as pd import numpy as np # 1. 初始數(shù)據(jù) 假設(shè)指標(biāo)4是負(fù)向指標(biāo),其余三個(gè)為正向指標(biāo) df1 = pd.DataFrame({'指標(biāo)1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], '指標(biāo)2': [2, 4, 6, 8, 10, 2, 4, 6, 8, 10], '指標(biāo)3': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1], '指標(biāo)4': [3, 1, 2, 3, 5, 8, 7, 8, 8, 9] }) print(df1)
數(shù)據(jù)為DataFrame格式,效果展示如下:
3.2 數(shù)據(jù)預(yù)處理
然后是數(shù)據(jù)預(yù)處理部分,這里定義一個(gè)泛用性較強(qiáng)的標(biāo)準(zhǔn)化處理函數(shù),
該函數(shù)對于正向指標(biāo)和負(fù)向指標(biāo)(越大越好的指標(biāo)和越小越好的指標(biāo)),可以分別進(jìn)行不同的處理。
(處理邏輯通過代碼可以很容易看出)
同時(shí)該函數(shù)也可以兼容只進(jìn)行其中一種處理的情景。
# 2.數(shù)據(jù)預(yù)處理 定義標(biāo)準(zhǔn)化處理函數(shù) def Standardization(data,cols1=None, cols2=None): """ :param data:目標(biāo)數(shù)據(jù) :param cols1: 需要處理的正向指標(biāo)列名列表,類型為列表或None [col1, col2, col3] :param cols2: 需要處理的負(fù)向指標(biāo)列名列表,類型為列表或None [col1, col2, col3] :return: 輸出處理結(jié)果 """ if cols1 == None and cols2 == None: return data elif cols1 != None and cols2 == None: return (data[cols1] - data[cols1].min())/(data[cols1].max()-data[cols1].min()) elif cols1 == None and cols2 != None: return (data[cols2].max - data[cols2])/(data[cols2].max()-data[cols2].min()) else: a = (data[cols1] - data[cols1].min())/(data[cols1].max()-data[cols1].min()) b = (data[cols2].max() - data[cols2])/(data[cols2].max()-data[cols2].min()) return pd.concat([a, b], axis=1)
調(diào)用函數(shù),進(jìn)行標(biāo)準(zhǔn)化處理:
df2 = Standardization(df1, cols1=['指標(biāo)1', "指標(biāo)2", "指標(biāo)3"], cols2=['指標(biāo)4']) print(df2)
處理結(jié)果如下:
3.3 熵值、權(quán)重計(jì)算
然后定義一個(gè)通過熵值計(jì)算權(quán)重,及樣本評分的函數(shù)。
def Weightfun(data): """ :param data: 預(yù)處理好的數(shù)據(jù) :return: 輸出權(quán)重。 """ K = 1/np.log(len(data)) e = -K*np.sum(data*np.log(data)) d = 1-e w = d/d.sum() return w
該函數(shù)的返回值有兩個(gè),w是權(quán)重,score是評分
調(diào)用函數(shù),計(jì)算出各個(gè)指標(biāo)的權(quán)重:
w = Weightfun(df2) print(w)
各個(gè)指標(biāo)權(quán)重如下圖所示:
3.4 編制綜合評價(jià)指標(biāo)
直接將DataFrame格式的數(shù)據(jù)與求出的權(quán)重相乘,并求和,即得到通過熵值法編制出的綜合指標(biāo),代碼及結(jié)果如下圖所示:
df3= df2 * w df3['綜合指標(biāo)'] = df3.sum(axis=1)
到此這篇關(guān)于熵值法原理及Python實(shí)現(xiàn)的示例詳解的文章就介紹到這了,更多相關(guān)Python熵值法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python學(xué)習(xí)與數(shù)據(jù)挖掘應(yīng)知應(yīng)會的十大終端命令
今天我們將介紹一些基本的數(shù)據(jù)收集、探索和聚合—所有這些都是通過shell完成的。如果你使用的是Linux或Mac,那么接下來就不會有任何問題,但是Windows用戶應(yīng)該在繼續(xù)之前下載一個(gè)終端仿真器2021-11-11關(guān)于Python3 lambda函數(shù)的深入淺出
今天小編就為大家分享一篇關(guān)于Python3 lambda函數(shù)的深入淺出,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python連接數(shù)據(jù)庫并批量插入包含日期記錄的操作
這篇文章主要介紹了Python連接數(shù)據(jù)庫并批量插入包含日期記錄的操作,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06詳解python實(shí)現(xiàn)小波變換的一個(gè)簡單例子
這篇文章主要介紹了詳解python實(shí)現(xiàn)小波變換的一個(gè)簡單例子,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07django跳轉(zhuǎn)頁面?zhèn)鲄⒌膶?shí)現(xiàn)
這篇文章主要介紹了django跳轉(zhuǎn)頁面?zhèn)鲄⒌膶?shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python Web框架之Django框架Form組件用法詳解
這篇文章主要介紹了Python Web框架之Django框架Form組件用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架中各種常用Form組件的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08