Python實現(xiàn)計算信息熵的示例代碼
一:數(shù)據(jù)集準備
如博主使用的是:
多層感知機(MLP)實現(xiàn)考勤預測二分類任務(sklearn)對應數(shù)據(jù)集
導入至工程下
二:信息熵計算
1 導包
from math import log import pandas as pd
2 讀取數(shù)據(jù)集
dataSet = pd.read_csv('dataSet.csv', header=None).values.tolist()
3 數(shù)據(jù)統(tǒng)計
numEntries = len(dataSet) # 數(shù)據(jù)集大小 labelCounts = {} for featVec in dataSet: # currentLabel = featVec[-1] # 獲取分類標簽 if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 # 字典值不等于0??? labelCounts[currentLabel] += 1 # 每個類中數(shù)據(jù)個數(shù)統(tǒng)計
4 信息熵計算
infoEnt = 0.0 for key in labelCounts: # 信息熵計算 prob = float(labelCounts[key]) / numEntries infoEnt -= prob * log(prob, 2) return infoEnt # 返回值 infoEnt 為數(shù)據(jù)集的信息熵,表示為 float 類型
測試運行,得到 多層感知機(MLP)實現(xiàn)考勤預測二分類任務(sklearn)對應數(shù)據(jù)集 信息熵為0.5563916622348017
三:完整源碼分享
from math import log import pandas as pd dataSet = pd.read_csv('dataSet.csv', header=None).values.tolist() def calcInfoEnt(dataSet): numEntries = len(dataSet) # 數(shù)據(jù)集大小 labelCounts = {} for featVec in dataSet: # currentLabel = featVec[-1] # 獲取分類標簽 if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 # 字典值不等于0??? labelCounts[currentLabel] += 1 # 每個類中數(shù)據(jù)個數(shù)統(tǒng)計 infoEnt = 0.0 for key in labelCounts: # 信息熵計算 prob = float(labelCounts[key]) / numEntries infoEnt -= prob * log(prob, 2) return infoEnt # 返回值 infoEnt 為數(shù)據(jù)集的信息熵,表示為 float 類型 if __name__ == '__main__': # 輸出為當前數(shù)據(jù)集的信息熵 print(calcInfoEnt(dataSet))
四:方法補充
熵,在信息論中是用來刻畫信息混亂程度的一種度量。熵最早源于熱力學,后應廣泛用于物理、化學、信息論等領域。1850年,德國物理學家魯?shù)婪?middot;克勞修斯首次提出熵的概念,用來表示任何一種能量在空間中分布的均勻程度。1948年,Shannon在Bell System Technical Journal上發(fā)表文章“A Mathematical Theory of Communication”,將信息熵的概念引入信息論中。本文所說的熵就是Shannon熵,即信息熵,解決了對信息的量化度量問題。
下面是小編為大家收集的計算信息熵的另一種方法,希望對大家有所幫助
import math #以整型數(shù)據(jù)為例,給出其信息熵的計算程序。 ########################################### '''統(tǒng)計已知數(shù)據(jù)中的不同數(shù)據(jù)及其出現(xiàn)次數(shù)''' ########################################### def StatDataInf( data ): dataArrayLen = len( data ) diffData = []; diffDataNum = []; dataCpy = data; for i in range( dataArrayLen ): count = 0; j = i if( dataCpy[j] != '/' ): temp = dataCpy[i] diffData.append( temp ) while( j < dataArrayLen ): if( dataCpy[j] == temp ): count = count + 1 dataCpy[j] = '/' j = j + 1 diffDataNum.append( count ) return diffData, diffDataNum ########################################### '''計算已知數(shù)據(jù)的熵''' ########################################### def DataEntropy( data, diffData, diffDataNum ): dataArrayLen = len( data ) diffDataArrayLen = len( diffDataNum ) entropyVal = 0; for i in range( diffDataArrayLen ): proptyVal = diffDataNum[i] / dataArrayLen entropyVal = entropyVal - proptyVal * math.log2( proptyVal ) return entropyVal def main(): data = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2 ] [diffData, diffDataNum] = StatDataInf( data ) entropyVal = DataEntropy( data, diffData, diffDataNum ) print( entropyVal ) data = [1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1 ] [diffData, diffDataNum] = StatDataInf( data ) entropyVal = DataEntropy( data, diffData, diffDataNum ) print( entropyVal ) data = [1, 2, 3, 4, 2, 1, 2, 4, 3, 2, 3, 4, 1, 1, 1 ] [diffData, diffDataNum] = StatDataInf( data ) entropyVal = DataEntropy( data, diffData, diffDataNum ) print( entropyVal ) data = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 ] [diffData, diffDataNum] = StatDataInf( data ) entropyVal = DataEntropy( data, diffData, diffDataNum ) print( entropyVal ) data = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4, 5 ] [diffData, diffDataNum] = StatDataInf( data ) entropyVal = DataEntropy( data, diffData, diffDataNum ) print( entropyVal ) if __name__ == '__main__': main() ########################################### #運行結果 1.0 0.9182958340544896 1.965596230357602 2.0 2.3183692540329317
到此這篇關于Python實現(xiàn)計算信息熵的示例代碼的文章就介紹到這了,更多相關Python計算信息熵內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python實現(xiàn)學生信息管理系統(tǒng)源碼
這篇文章主要為大家詳細介紹了python實現(xiàn)學生信息管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-02-02對python 中re.sub,replace(),strip()的區(qū)別詳解
今天小編就為大家分享一篇對python 中re.sub,replace(),strip()的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python中pandas nlargest()的詳細用法小結
df.nlargest()是一個DataFrame的方法,用于返回DataFrame中最大的n個值所在的行,通過調用nlargest()方法,我們返回了分數(shù)最高的三個行,并按照降序排列,本文結合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-10-10