6

我正在尝试使用 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

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

for i in range(25):
    c2[i] = numpy.correlate(a[:,i], b)

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

我试图了解这两种算法在幕后做了什么,但却惨遭失败。有人可以指出我的逻辑错误吗?

4

1 回答 1

7

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

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

此外,根据这个答案,该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 的每一行是一个观察值,每一列是一个变量,那么 corr (x, y) 的第 (i, j) 个条目是 x 中的第 i 个变量与第 j 个变量之间的相关性y 中的变量。

      corr (x,y) = cov (x,y) / (std (x) * std (y))

如果使用一个参数调用,则计算 corr (x, x),即 x 列之间的相关性。

和 Numpy:

numpy.correlate(a, v, mode='valid', old_behavior=False)[来源]

两个一维序列的互相关。

此函数计算信号处理文本中通常定义的相关性:

z[k] = sum_n a[n] * conj(v[n+k])

a 和 v 序列在必要时补零,而 conj 是共轭。

于 2013-05-22T18:25:26.043 回答