MATLAB/Octave corr和Python numpy.correlate有什么区别?

Cry*_*tal 6 python matlab numpy octave correlation

我正在尝试使用NumPy 1.8.0和Python 2.7.3将MATLAB/Octave程序移植到Python.我已经使用这个参考作为帮助将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
Run Code Online (Sandbox Code Playgroud)

如果我更改代码来计算每列的相关性,我可以让它工作a,如下所示:

for i in range(25):
    c2[i] = numpy.correlate(a[:,i], b)
Run Code Online (Sandbox Code Playgroud)

但是,c2数组中的值与Octave的输出不同.Octave返回一个25x1的浮点矩阵,小于1.我从NumPy得到的值是-270到900之间的浮点数.

我试图了解这两种算法在引擎盖下做了什么但却失败了.有人可以指出我的逻辑失败吗?

voi*_*hos 7

似乎存在numpy.corrcoef根据需要计算相关系数的a .但是,它的界面与Octave/Matlab不同corr.

首先,默认情况下,该函数将行视为变量,列为观察.为了模仿Octave/Matlab的行为,你可以传递一个反转它的标志.

此外,根据这个答案,numpy.cov函数(corrcoef我在内部使用,我假设)返回一个2x2矩阵,每个矩阵包含一个特定的协方差:

cov(a,a)  cov(a,b)

cov(a,b)  cov(b,b)
Run Code Online (Sandbox Code Playgroud)

正如他所指出的那样,[0][1]元素就是你想要的cov(a,b).因此,也许这样的事情会起作用:

for i in range(25):
    c2[i] = numpy.corrcoef(a[:,i], b, rowvar=0)[0][1]
Run Code Online (Sandbox Code Playgroud)

作为参考,这里有一些您尝试过的两个函数的摘录.似乎他们执行完全不同的事情.

八度:

- 函数文件:corr(x,y)

计算相关系数矩阵.

如果x和y的每一行都是观察,并且每列是变量,则corr(x,y)的第(i,j)项是x和第j个中的第i个变量之间的相关性. y中的变量.

      corr (x,y) = cov (x,y) / (std (x) * std (y))
Run Code Online (Sandbox Code Playgroud)

如果使用一个参数调用,则计算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])
Run Code Online (Sandbox Code Playgroud)

a和v序列在必要时被填零,而conj是共轭.