我有这个函数来计算相关矩阵并按预期工作,但是我试图提高效率并摆脱循环,但我在这样做时遇到了麻烦。我在下面的函数:
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())执行此计算的更有效方法是什么?
获得协方差矩阵后,只需乘以对角线平方根反比的乘积即可。使用代码片段作为起点:
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)