我環顧四周,並出人意料地沒有像儘管Scikit學習,爲全面互信息(直方圖)度量庫中找到了逐點互信息(Wiki PMI)計算的易用性框架或現有的代碼。這是Python和熊貓的背景!Pandas DataFrame可以有效地計算PMI(Pointwise Mutual Information)嗎?
我的問題:
我有一系列[X,Y]每行中示例的數據幀,並希望計算一系列PMI值的按式(或更簡單的一個):
PMI(x, y) = log(p(x,y)/p(x) * p(y))
到目前爲止,我的做法是:
def pmi_func(df, x, y):
df['freq_x'] = df.groupby(x).transform('count')
df['freq_y'] = df.groupby(y).transform('count')
df['freq_x_y'] = df.groupby([x, y]).transform('count')
df['pmi'] = np.log(df['freq_x_y']/(df['freq_x'] * df['freq_y']))
這會給出一個有效的和/或有效的計算?
樣品I/O:
x y PMI
0 0 0.176
0 0 0.176
0 1 0
你能證明你的樣本數據和預期的輸出可能? – Zero
嗨,我添加了一個簡單的例子,感謝您的幫助@JohnGalt – jfive
,我認爲,你應該就地cacl'ing概率頻率:'np.log(DF [「freq_x_y」] /(DF [「freq_x」 ] * DF [ 'freq_y']))'應該成爲'np.log(LEN(df.index)* DF [ 'freq_x_y'] /(DF [ 'freq_x'] * DF [ 'freq_y']))',通過考慮總記錄? – Zero