我正在尝试使用NumPy 1.8.0和Python 2.7.3将MATLAB / Octave程序移植到Python。我已经使用this reference作为帮助将MATLAB函数转换为NumPy方法取得了巨大成功,直到我想要计算两个矩阵之间的相关性为止。
第一个矩阵是40000x25浮点数,第二个矩阵是40000x1个整数。在Octave中,我使用语句corr(a,b)
并获得25x1的浮点矩阵。在NumPy(numpy.correlate(a,b)
)中尝试相应的方法会产生错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_1a9aa5a_20130415-py2.7-macosx-10.8-intel.egg/numpy/core/numeric.py", line 751, in correlate
return multiarray.correlate2(a,v,mode)
ValueError: object too deep for desired array
如果我更改代码以计算a
的每列的相关性,我可以使用它,如下所示:
for i in range(25):
c2[i] = numpy.correlate(a[:,i], b)
但是,c2
数组中的值与Octave的输出不同。 Octave返回一个25x1的浮点矩阵,小于1.我从NumPy得到的值是-270到900之间的浮点数。
我试图理解这两种算法在幕后做了什么但却失败了。有人可以指出我的逻辑失败吗?
答案 0 :(得分:7)
似乎存在numpy.corrcoef
,其根据需要计算相关系数。但是,它的界面与Octave / Matlab corr
不同。
首先,默认情况下,该函数将行视为变量,列为观察。为了模仿Octave / Matlab的行为,你可以传递一个反转它的标志。
另外,根据this answer,numpy.cov
函数(corrcoef
在内部使用,我假设)返回一个2x2矩阵,每个矩阵包含一个特定的协方差:
cov(a,a) cov(a,b)
cov(a,b) cov(b,b)
正如他指出的那样,[0][1]
元素是您cov(a,b)
所需的元素。因此,也许这样的事情会起作用:
for i in range(25):
c2[i] = numpy.corrcoef(a[:,i], b, rowvar=0)[0][1]
作为参考,以下是您尝试过的两个功能的摘录。似乎他们执行完全不同的事情。
八度:
- 功能文件:corr(x,y)
计算相关系数矩阵。
如果x和y的每一行都是观察,并且每列是a 变量,然后corr(x,y)的第(i,j)项是相关性 在x中的第i个变量和y中的第j个变量之间。
corr (x,y) = cov (x,y) / (std (x) * std (y))
如果使用一个参数调用,则计算corr(x,x),列之间的相关性 x。
和Numpy:
numpy.correlate(a,v,mode ='valid',old_behavior = False)[来源]
两个1维序列的互相关。
此函数计算通常在信号中定义的相关性 处理文本:
z[k] = sum_n a[n] * conj(v[n+k])
a和v序列在必要时为零填充,而conj为共轭。