如何摆脱循环并使我的Correlation矩阵功能更有效

时间:2017-10-09 19:11:58

标签: python numpy linear-algebra

我有这个函数来计算相关矩阵并按预期工作但是我试图使它更有效并摆脱循环但我却遇到了麻烦。我的功能如下:

def correlation(X):
    N = X.shape[0]  # num of rows
    D = X.shape[1]  # num of cols

    covarianceMatrix = np.cov(X)  # start with covariance matrix

    # use covarianceMatrix to create size of M
    M = np.zeros([covarianceMatrix.shape[0], covarianceMatrix.shape[1]])

    for i in range(covarianceMatrix.shape[0]):
        for j in range(covarianceMatrix.shape[1]):

           corr = covarianceMatrix[i, j] / np.sqrt(np.dot(covarianceMatrix[i, i], covarianceMatrix[j, j]))
           M[i,j]  = corr

    return M

使用numpy执行此计算的更有效方法是什么,而不是使用它的内置函数,例如corrcoef()。

1 个答案:

答案 0 :(得分:0)

一旦得到协方差矩阵,您只需要乘以对角线平方根的乘积。使用代码位作为起点:

(define-syntax edges
  (syntax-rules (-> <->)
    [(edges _)
     (begin)]
    [(edges node-name1 -> node-name2 ...) 
     (begin (edge node-name1 (edges node-name2 ...)))]
    [(edges node-name1 <-> node-name2 ...)
     (begin (edge node-name1 node-name2) ...
            (edge node-name2 node-name1)
            ...)])) 

如果你有复杂的值,有点困难,你可能应该在-1和1之间剪切:

covarianceMatrix = np.cov(X) tmp = 1.0 / np.sqrt(np.diag(covarianceMatrix)) corr = covarianceMatrix.copy() corr *= tmp[:, None] corr *= tmp[None, :]