对于mxn矩阵,计算所有列对(nxn)的互信息的最佳(最快)方法是什么?
通过互信,我的意思是:
I(X,Y)= H(X)+ H(Y) - H(X,Y)
其中H(X)是指的香农熵X.
目前我正在使用np.histogram2d并np.histogram计算关节(X,Y)和个体(X或Y)计数.对于给定的矩阵A(例如250000 X 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])
Run Code Online (Sandbox Code Playgroud)
当然必须有更好/更快的方法来做到这一点?
顺便说一句,我也在数组上寻找列(列式或行式操作)的映射函数,但还没有找到一个很好的通用答案.
这是我的完整实现,遵循Wiki页面中的约定:
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 …Run Code Online (Sandbox Code Playgroud) 如何合并不同元素的混合(matlab风格)numpy?
[array([ 0.]), 0.0, 0.0011627, 0.0, 2.69, 0.0, array([ 3.8269, 7.0184]), array([ 4.4e-16, 2.1e+00])]
(我尝试过np.concatenate,但显然它只需要数组作为输入).基本上,我想通过索引动态地连接矢量中的元素.我试过了:
V = np.array([1,2,3,4,5,6])
Y = np.array([7,8,9,10,11,12])
Z = np.array([V[0:2],Y[0],V[3],Y[1:3],V[4:],Y[4:]])
Run Code Online (Sandbox Code Playgroud)
它工作,但内部有数组元素.我只想要一个平面的数字向量(Matlab风格),后来我用一堆这些向量做了一个矩阵(称为RES).即使是简单的
np.savetxt('TT',RES,fmt='%1.1e')
Run Code Online (Sandbox Code Playgroud)
失败,因为它期望浮动而不是内部的数组.
猜猜这应该很简单.np.hstack做的工作.但是有没有其他简单的方法来做Matlab样式索引和向量和标量的组合?
我有2个大型数据列(大约150万个值).它们的结构如下:
col1 = [2,2,1,4,5,4,3,4,4,4,5,2,3,1,1 ..] etc.,
col2 = [1,1,8,8,3,5,6,7,2,3,10.........] etc.,
Run Code Online (Sandbox Code Playgroud)
我想制作一个联合计数矩阵CountsMAT.col1的值范围为1到5,col2的范围为1到10.
counts of [(1,2),(1,3),...(1,10),
(2,1), (2,2),....(2,10),
(3,1),......,(3,3)...(3,10),
...........................
(5,1),(5,2),...(5,5).....(5,10)] are required ie.,
a CountsMAT of size (5,10)
max(col1) = 5; max(col2) = 10 ;
Run Code Online (Sandbox Code Playgroud)
我已经实现了一个带有defaultdict和for循环的版本,但这需要一段时间.我相信这可以直接用Pandas更好地处理,我很欣赏使用numpy/pandas的最佳实现.许多其他类似的查询指向Pandas的'groupby',但我并不精通它.
对于基于dict的实现,获取矩阵格式的输出也比较棘手.但是猜猜Pandas/numpy会更容易.谢谢!