Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
皮尔逊';使用Python3.5中的scipy.stats.pearsonr与numpy.corrcoff,统计两个2D数组中所有行对之间的相关系数_Python_Arrays_Python 3.x_Numpy_Scipy - Fatal编程技术网

皮尔逊';使用Python3.5中的scipy.stats.pearsonr与numpy.corrcoff,统计两个2D数组中所有行对之间的相关系数

皮尔逊';使用Python3.5中的scipy.stats.pearsonr与numpy.corrcoff,统计两个2D数组中所有行对之间的相关系数,python,arrays,python-3.x,numpy,scipy,Python,Arrays,Python 3.x,Numpy,Scipy,我试图计算两个2D数组中每对行之间的皮尔逊相关系数。然后,根据相关矩阵的对角元素对其行/列进行排序。首先,根据以下代码中的一个随机矩阵(即“randmtx”)计算相关系数矩阵(即“ccmtx”): import numpy as np import matplotlib.pyplot as plt from scipy.stats import pearsonr def correlation_map(x, y): n_row_x = x.shape[0] n_row_y =

我试图计算两个2D数组中每对行之间的皮尔逊相关系数。然后,根据相关矩阵的对角元素对其行/列进行排序。首先,根据以下代码中的一个随机矩阵(即“randmtx”)计算相关系数矩阵(即“ccmtx”):

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr

def correlation_map(x, y):
    n_row_x = x.shape[0]
    n_row_y = x.shape[0]
    ccmtx_xy = np.empty((n_row_x, n_row_y))
    for n in range(n_row_x):
        for m in range(n_row_y):
            ccmtx_xy[n, m] = pearsonr(x[n, :], y[m, :])[0]

    return ccmtx_xy

randmtx = np.random.randn(100, 1000) # generating random matrix
#ccmtx = np.corrcoef(randmtx, randmtx) # cc matrix based on numpy.corrcoef
ccmtx = correlation_map(randmtx, randmtx) # cc matrix based on scipy pearsonr
#
ccmtx_diag = np.diagonal(ccmtx)
#
ids, vals = np.argsort(ccmtx_diag, kind = 'mergesort'), np.sort(ccmtx_diag, kind = 'mergesort')
#ids, vals = np.argsort(ccmtx_diag, kind = 'quicksort'), np.sort(ccmtx_diag, kind = 'quicksort')

plt.plot(ids)
plt.show()

plt.plot(ccmtx_diag[ids])
plt.show()

vals[0]
这里的问题是,当使用“pearsonr”时,“ccmtx”的对角线元素正好是1.0,这是有意义的。然而,使用“corrcoef”时,“ccmtrix”的对角线元素并不完全是一个(某些对角线略小于1),这似乎是由于浮点数的精度错误造成的

我发现令人恼火的是,单个矩阵的自相关矩阵的对角元素不是1.0,因为这导致在基于对角元素对矩阵进行排序时,相关矩阵的行/列出现混乱

我的问题是:

[1] 当我坚持使用“pearsonr”函数时,有没有什么好方法可以加快计算时间?(例如,矢量化pearsonr?)

[2] 在numpy中使用“corrcoef”时,有没有什么好的方法/实践来防止这种精度错误?(例如,np.around中的“小数”选项?)

我搜索了两个矩阵中所有行或列对之间的相关系数计算。然而,由于算法包含某种“cov/方差”运算,这种精度问题似乎总是存在的

次要问题:“合并排序”选项似乎比“快速排序”提供了可靠的结果,因为快速排序洗牌1d数组的顺序正好是1到随机顺序

如有任何想法/意见,将不胜感激

对于问题1矢量化Pearson,请参见对问题的评论

我只回答问题2:如何提高数据的精度

相关矩阵R根据以下公式从协方差矩阵C计算得出:

该实现针对性能和内存使用进行了优化。它计算协方差矩阵,然后按
sqrt(C_ii)
sqrt(Cjj)
执行两次除法。这种独立的平方根是不精确性的来源。例如:

np.sqrt(3 * 3) - 3 == 0.0

np.sqrt(3) * np.sqrt(3) - 3  == -4.4408920985006262e-16
我们可以通过实现自己的简单
corrcoef
例程来解决这个问题:

def corrcoef(a, b):
    c = np.cov(a, b)
    d = np.diag(c)
    return c / np.sqrt(d[:, None] * d[None, :])

请注意,此实现需要比numpy实现更多的内存,因为它需要存储大小为n*n的临时矩阵,并且速度稍慢,因为它需要n^2个平方根,而不是仅2个平方根

顺便说一句,以下是版本:“np.\uuuuu版本\uuuuuu'1.12.1'”scipy.\uuuuu版本\uuuuuuuu'0.19.0'”。当计算单个向量/数组的自相关(即cc!=1.0)时,此代码似乎也存在精度错误。添加一个轴。因此,至少要使用np.2d。仅供参考:您是否仔细查看了
ccmtx=np.corrcoef(randmtx,randmtx)
计算的内容?传递第二个
randmtx
会导致冗余计算。仔细检查docstring,并查看
np.corrcoef(a)
np.corrcoef(a,a)
中的小数组
a
(例如形状(4,3))。