对于m x n矩阵,计算所有列对的互信息的最佳(最快)方法是什么(nxn)?I(X, Y) = H(X) + H(Y) - H(X,Y)
其中,H(X)是指X的香农熵。
目前我使用np.histogram2d和np.histogram计算关节(X,Y)和个体(X或Y)计数。对于给定的矩阵A(例如250000x 1000个浮点矩阵),我正在做一个嵌套的for循环n = A.shape[1]
for ix = arange(n)
for jx = arange(ix+1,n):
matMI[ix,jx]= calc_MI(A[:,ix],A[:,jx])
当然,必须有更好/更快的方法来做到这一点?
另外,我也在数组的列(按列或按行操作)上寻找映射函数,但还没有找到一个好的通用答案。
下面是我的完整实现,遵循the Wiki page中的约定:import numpy as np
def calc_MI(X,Y,bins):
c_XY = np.histogram2d(X,Y,bins)[0]
c_X = np.histogram(X,bins)[0]
c_Y = np.histogram(Y,bins)[0]
H_X = shan_entropy(c_X)
H_Y = shan_entropy(c_Y)
H_XY = shan_entropy(c_XY)
MI = H_X + H_Y - H_XY
return MI
def shan_entropy(c):
c_normalized = c / float(np.sum(c))
c_normalized = c_normalized[np.nonzero(c_normalized)]
H = -sum(c_normalized* np.log2(c_normalized))
return H