【问题标题】:What is the difference between MATLAB/Octave corr and Python numpy.correlate?MATLAB/Octave corr 和 Python numpy.correlate 有什么区别?
【发布时间】:2013-05-17 22:05:44
【问题描述】:

我正在尝试使用 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 之间的浮点数。

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

【问题讨论】:

    标签: python matlab numpy octave correlation


    【解决方案1】:

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

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

    另外,根据this answernumpy.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 个变量和 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)[来源]

    两个一维序列的互相关。

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

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

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

    【讨论】:

    • 我已经尝试过了,但numpy.cov(a,b) 返回一个 2x2 浮点数组,我不知道这与相关性有何关系。
    • 或尝试简单地获取Pearson's r
    • this
    • @Rasman - 我已经尝试过corrcoef,但它也返回了一个我不知道如何处理的 2x2 数组。我刚试过pearsonsr,也有同样的问题。虽然这些值看起来比我从 correlate 得到的要好得多,但我仍然没有得到与 octave 函数相同的答案。我应该期待吗?
    • @Crystal:我想我可能已经找到了 2x2 数组的全部内容。我已经编辑了答案以提供可能的解决方案。
    猜你喜欢
    • 2012-12-20
    • 2013-03-26
    • 2020-10-03
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2022-01-21
    • 2016-02-20
    相关资源
    最近更新 更多