2017-10-09 10 views
1

相関行列を計算し、期待通りに機能するこの関数を持っていますが、より効率的にループを取り除こうとしていますが、そうすることに問題があります。下記のMy機能:ループを取り除き、相関行列関数をより効率的にするにはどうすればよいですか?

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(として機能)。

+0

は、その作業を行います正しく? 2つのスカラーを持つ 'np.dot'は、少なくとも奇妙に見えます。 – MSeifert

答えて

0

共分散行列を取得したら、対角の逆平方根の積を掛けるだけです。出発点として、あなたのコードのビットを使用する:

covarianceMatrix = np.cov(X) 
tmp = 1.0/np.sqrt(np.diag(covarianceMatrix)) 

corr = covarianceMatrix.copy() 
corr *= tmp[:, None] 
corr *= tmp[None, :] 

あなたは、複雑な値を持っている、とあなたはおそらく経由で-1と1の間でクリップしなければならない場合は、もう少し難しい:

np.clip(corr, -1, 1, out=corr)

関連する問題