功能是否按列相关?

时间:2014-05-21 05:25:48

标签: python numpy scipy

我有两个numpy数组

X.shape = (100, 10)
Y.shape = (100, 10)

我想找到X和Y列之间的皮尔森相关性

from scipy.stats.stats import pearsonr

def corr( X, Y ):
    return np.array([ pearsonr( x, y )[0] for x,y in zip( X.T, Y.T ) ] )    

corr( X, Y ).shape = (10, )

这是否有功能?到目前为止,我能找到的所有函数都可以计算出相关矩阵。在Matlab中有一个成对相关函数,所以我非常确定有人必须为Python编写一个。

我之所以不喜欢上面的示例功能,是因为它似乎很慢。

2 个答案:

答案 0 :(得分:1)

我从scipy.stats.pearsonr修改了

from scipy.stats import pearsonr

x = np.random.rand(100, 10)
y = np.random.rand(100, 10)

def corr( X, Y ):
    return np.array([ pearsonr( x, y )[0] for x,y in zip( X.T, Y.T) ] )

def pair_pearsonr(x, y, axis=0):
    mx = np.mean(x, axis=axis, keepdims=True)
    my = np.mean(y, axis=axis, keepdims=True)
    xm, ym = x-mx, y-my
    r_num = np.add.reduce(xm * ym, axis=axis)
    r_den = np.sqrt((xm*xm).sum(axis=axis) * (ym*ym).sum(axis=axis))
    r = r_num / r_den
    return r

np.allclose(pair_pearsonr(x, y, axis=0), corr(x, y))

答案 1 :(得分:1)

如果列是变量,行是X,Y中的观测值(并且您想查找X和Y之间的列相关性):

X = (X - X.mean(axis=0)) / X.std(axis=0)
Y = (Y - Y.mean(axis=0)) / Y.std(axis=0)
pearson_r = np.dot(X.T, Y) / X.shape[0]

要查找p值,请将pearson_r转换为t统计信息:

t = pearson_r * np.sqrt(X.shape[0] - 2) / np.sqrt(1 - pearson_r ** 2)

,p值为2×P(T> t)。