【发布时间】:2016-06-21 09:46:16
【问题描述】:
尽管 Scikit-learn 等库提供了整体互信息的度量(通过直方图),但我环顾四周,令人惊讶地没有找到一个易于使用的框架或现有代码来计算 Pointwise Mutual Information (Wiki PMI) )。这是在 Python 和 Pandas 的上下文中!
我的问题:
我有一个 DataFrame,每行包含一系列 [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
【问题讨论】:
-
您能否展示您的示例数据和预期输出?
-
嗨,我添加了一个简单的例子,感谢您的帮助@JohnGalt
-
我认为,通过考虑总记录,您应该计算概率而不是频率:
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']) )? -
谢谢,这绝对是正确的!
标签: python pandas dataframe entropy