from sklearn import metrics
import math
import numpy as np
from sklearn import metrics
from sklearn import metrics
defnmi
(a,b)
:#此為計算互資訊的函式,還可以計算標準互資訊
#樣本點數
total =
len(a)
a_ids =
set(a)
b_ids =
set(b)
#互資訊計算
mi =
0 eps =
1.4e-45
for ida in a_ids:
for idb in b_ids:
idaoccur = np.where(a==ida)
idboccur = np.where(b==idb)
idaboccur = np.intersect1d(idaoccur,idboccur)
px =
1.0*
len(idaoccur[0]
)/total
py =
1.0*
len(idboccur[0]
)/total
pxy =
1.0*
len(idaboccur)
/total
mi = mi + pxy*math.log(pxy/
(px*py)
+eps,2)
# 標準化互資訊
hx =
0for ida in a_ids:
idaoccurcount =
1.0*
len(np.where(a==ida)[0
])hx = hx -
(idaoccurcount/total)
*math.log(idaoccurcount/total+eps,2)
hy =
0for idb in b_ids:
idboccurcount =
1.0*
len(np.where(b==idb)[0
])hy = hy -
(idboccurcount/total)
*math.log(idboccurcount/total+eps,2)
mihat =
2.0*mi/
(hx+hy)
return mi
if __name__ ==
'__main__'
: dic =,2
:,3:
,4:,
5:} i =
1while i <
len(dic.keys())
+1:# 把90天的資料分離出來成為字典
for k in dic[5]
.keys():
# 比較兩個字典,沒有的key的加上該key並取值為0
if k not
in dic[i]
.keys():
dic[i]
[k]=
0 dic[i]
=# 對dic[i]字典按照key值排序後輸出
i +=
1print
('90天的資料處理排序後是'
)print
(dic)
print
('*****開始計算互資訊**********'
) c=
1 result1=
#result存放最終對比的nmi結果
result2=
while c <
len(dic.keys())
+1: a=
list
(dic[c]
.values())
b=list
(dic[5]
.values())
#b是最終的那個資料
c = np.array(a)
d = np.array(b)
result_nmi1 = nmi(c, d)
#計算互資訊
result_nmi2 = metrics.normalized_mutual_info_score(a, b)
c+=1print
(result1)
print
(result2)
列向量互資訊計算
首先資訊熵的計算公式如下 其中i x 表示x的資訊量 注 這裡對數所使用的底,通常是 2,自然常數e,或是10。當b 2,熵的單位是bit 當b e,熵的單位是nat 而當 b 10,熵的單位是dit。p xi 是xi發生的概率英文裡面叫做probability mass function,乙個隨機...
1 互資訊 資訊熵 條件互資訊 相關
參考於 資訊量可以被看成在學習 x 的值的時候的 驚訝程度 如果有人告訴我們乙個相當不可能的時間發生了,我們收到的資訊要多於我們被告知某個很可能發生的事件發生時收到的資訊。如果我們知道某件事情一定會發生,那麼我們就不會接收到資訊。於是,我們對於資訊內容的度量將依賴於概率分布p x 因此我們想要尋找乙...
點互資訊(PMI)和正點互資訊(PPMI)
如下 在概率論中,如果x和y無關,p x,y p x p y 如果x和y越相關,p x,y 和p x p y 的比就越大。從後兩個條件概率可能更好解釋,在y出現的條件下x出現的概率除以單看x出現的概率,這個值越大表示x和y越相關。log來自於資訊理論的理論,而且 log 1 0 也恰恰表明p x,y...