我搜索了一下,但惊讶地发现没有简单易用的框架或现有代码可以计算逐点互信息(Wiki PMI),尽管像Scikit-learn这样的库提供了一个关于总体互信息的度量(通过直方图)。这是在Python和Pandas的上下文中进行的!
我的问题:
我有一个包含每行[x,y]示例的DataFrame,并希望根据公式(或更简单的公式)计算一系列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']) )
这会提供有效和/或高效的计算吗?
样例输入/输出:
x y PMI
0 0 0.176
0 0 0.176
0 1 0
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