Sono presumendo che tu stia elencando correlation coefficients e non cross covariances (a differenza di @Divakar e @Alexander). Quindi, una voce nella matrice di covarianza è c[i,j] = rr[i,j]*sqrt(c[i,i]*c[j,j])
, con rr[i,j]
come coefficiente di correlazione. Ovviamente, c[i,i]
è la varianza i-esima e rr[i,i]==1
.
L'esempio seguente mostra come costruire una matrice di covarianza da un elenco varianze e un elenco di correlazioni:
import numpy as np
from itertools import product
n0 = 5 # dimension of random vector
print("Generating test-matrix CC0 ...")
# Generate a valid test covariance matrix (positive semi-definite)
sq_CC0 = np.random.randn(n0, n0)*10
CC0 = np.dot(sq_CC0, sq_CC0.T)
# extract lists:
lst_var = [(i, CC0[i, i]) for i in range(n0)] # list vor variances
lst_rr = [(i, j, CC0[i,j]/np.sqrt(CC0[i, i]*CC0[j,j])) # list of correlations
for i, j in product(range(n0), range(n0)) if i < j]
print(" Variances:")
for i, val in lst_var:
print(" ", i, val)
print(" Correlations:")
for i, j, val in lst_rr:
print(" ", i, j, val)
print("Building matrix CC1 ...")
n1 = len(lst_var) # dimension
# Exploit CC[i, j] = rr[i, j]* sqrt(CC[i, i]*CC[j, j]):
aa_var = np.array(lst_var) # convert to array to do index magic
ii = np.array(aa_var[:, 0], dtype=int) # indexes must be ints
vv = np.zeros(n1)
vv[ii] = np.sqrt(aa_var[ :, 1])
CC1a = np.outer(vv, vv) # Its entries are sqrt(CC[i, i]*CC[j, j])
aa_rr = np.array(lst_rr)
CC1b = np.zeros((n1, n1))
ii, jj = (np.array(aa_rr[ :, k], dtype=int) for k in [0, 1]) # indexes must be ints
CC1b[ii, jj] = aa_rr[:, 2] # build matrix with correlations
CC1 = CC1a * (CC1b + CC1b.T + np.eye(n1)) # build covariance matrix
print(" CC0 == CC1 is:", np.allclose(CC0, CC1))
Si noti che l'analisi del testo non è incluso, che gli indici partono da 0 e non doppie correlazioni (rr[i,j]==rr[j,i]
).
È possibile annotare l'output della matrice di covarianza per i dati di input del campione? – Divakar
Come nella risposta in basso ma simmetrici e con diagonale piena di quelli. – Melanie