python 使用corrcoeff实现matlab的corr功能

Ore*_*nin 1 python matlab numpy

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

我想实现matlab's corr函数的行为:
我有2个矩阵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'),它确实按预期返回了 shape(30000, 1) 的矩阵,但这些值与 matlab 中的结果不同。

我迫切需要解决这个问题,请帮忙。

Ehs*_*san 5

Matlabcorr默认情况下计算A和 的列的相关性B,而 Python 则corrcoef计算数组内行的相关性(如果向函数传递两个数组,似乎它会对垂直堆叠的数组执行相同的操作)。如果你不关心性能并且需要找到一种简单的方法来做到这一点,你可以水平堆叠两个数组并计算相关性并获得你想要的相应元素:

correlation = np.corrcoef(np.hstack((B,A)),rowvar=False)[0,1:]
Run Code Online (Sandbox Code Playgroud)

但是,如果您更关心性能而不是简单的代码,则需要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]
Run Code Online (Sandbox Code Playgroud)

示例代码的输出:

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
Run Code Online (Sandbox Code Playgroud)