【问题标题】:Function For Column-wise correlations?列相关性的功能?
【发布时间】:2014-05-21 05:25:47
【问题描述】:

我有两个 numpy 数组

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

我想找到 X 和 Y 列之间的 pearson 相关性

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 写过一个。

我之所以不喜欢上面的示例函数是因为它看起来很慢。

【问题讨论】:

  • pearsonr,如果你只是想要相关性,那就是np.corrcoef(x, y, rowvar=0, bias=?)。但是,np.corrcoef 也会计算联合相关矩阵中的 corr(X, X) 和 corr(Y, Y)。
  • 你看过stackoverflow.com/questions/19401078/…是否对你有帮助吗?

标签: python numpy scipy


【解决方案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)。

【讨论】:

    【解决方案2】:

    我修改自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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2019-07-05
      相关资源
      最近更新 更多