两个三维图像互信息python_python – 使用numpy计算成对互信息的最佳方式
對于m×n矩陣,計算所有列(n x n)的互信息的最佳(最快)方式是什么?
I(X, Y) = H(X) + H(Y) – H(X,Y)
其中H(X)是指X的香農熵。
目前我正在使用np.histogram2d和np.histogram來計算關節(X,Y)和單個(X或Y)計數。對于給定的矩陣A(例如,一個250000×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
A = np.array([[ 2.0, 140.0, 128.23, -150.5, -5.4 ],
[ 2.4, 153.11, 130.34, -130.1, -9.5 ],
[ 1.2, 156.9, 120.11, -110.45,-1.12 ]])
bins = 5 # ?
n = A.shape[1]
matMI = np.zeros((n, n))
for ix in np.arange(n):
for jx in np.arange(ix+1,n):
matMI[ix,jx] = calc_MI(A[:,ix], A[:,jx], bins)
雖然我的嵌套for循環的工作版本以合理的速度進行,我想知道是否有更好的方法來應用calc_MI在A的所有列(以計算它們的成對互信息)?
我也想知道:
>是否有有效的方法來映射函數來操作np.arrays的列(或行)(可能像np.vectorize,它看起來更像一個裝飾器)?
>這個具體計算是否還有其他最佳實現(互信息)?
總結
以上是生活随笔為你收集整理的两个三维图像互信息python_python – 使用numpy计算成对互信息的最佳方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: layui移动端适配_实战:移动端适配的
- 下一篇: python提取每个单词首字母_Pyth