利用python的corrcoeff实现matlab的corr函数。

问题描述 投票:0回答:1

在我尝试了网上找到的所有解决方案后,我必须在这里问一下。

我想实现以下行为 matlab's corr 函数。我有两个矩阵A和B,A的形状: (200, 30000) B的形状: (200, 1)

在matlab中。corr(A, B) 将返回一个大小为(30000,1)的矩阵。numpy.corrcoef (或 dask 为了获得更好的性能)我得到了一个(30001, 30001)矩阵,这个矩阵非常大,而且答案是错误的。rowvar=False 正如一些答案所建议的那样,但它并没有很好地工作。

我甚至尝试了 scipy.spatial.distance.cdist(np.transpose(traces), np.transpose(my_trace), metric='correlation') 确实如预期的那样返回了一个形状为(30000, 1)的矩阵,但数值与matlab中的结果不同。

我急需解决这个问题,请帮助我。

python matlab numpy
1个回答
4
投票

Matlab的Corr函数:我有2个矩阵A和B,A的形状:(200,1)B的形状:(200,30000)在... corr 缺省情况下,计算的是 AB而Python的 corrcoef 计算一个数组内行的相关性(如果你传给函数两个数组,似乎它对垂直堆叠的数组也会做同样的处理)。如果你不关心性能,需要找一个简单的方法,你可以将两个数组水平堆叠,计算相关性,得到你想要的对应元素。

correlation = np.corrcoef(np.hstack((B,A)),rowvar=False)[0,1:]

但如果你对性能的关注超过了简单的代码,你就需要实现以下功能 corr 自己的功能。(请评论,如果你要找的是这个功能,我就会添加)

更新: 如果你想实施 corr 为了防止额外的计算占用内存,你可以使用它的公式来计算相关性,首先对数组进行归一化处理,然后再将它们相乘。

A = (A - A.mean(axis=0))/A.std(axis=0)
B = (B - B.mean(axis=0))/B.std(axis=0)
correlation = (np.dot(B.T, A)/B.shape[0])[0]

示例代码的输出:

A = np.array([1,2,2,2]).reshape(4,1)
B = np.arange(20).reshape(4,5)

Python: np.corrcoef(np.hstack((A,B)),rowvar=False)[0,1:]

[0.77459667 0.77459667 0.77459667 0.77459667 0.77459667]

Matlab:  corr(A,B)

0.7746    0.7746    0.7746    0.7746    0.7746
© www.soinside.com 2019 - 2024. All rights reserved.