Ich bin Angenommen, Sie notieren correlation coefficients und nicht cross covariances (im Gegensatz zu @Divakar und @Alexander). Daher ist ein Eintrag in Ihrer Kovarianzmatrix c[i,j] = rr[i,j]*sqrt(c[i,i]*c[j,j])
, wobei rr[i,j]
der Korrelationskoeffizient ist. Offensichtlich ist c[i,i]
die i-te Varianz und rr[i,i]==1
.
Das folgende Beispiel zeigt, wie eine Kovarianzmatrix aus einer Liste Varianzen und eine Liste von Korrelationen bauen:
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))
Beachten Sie, dass die Analyse des Textes nicht enthalten ist, dass die Indizes bei 0 beginnen und keine Doppelkorrelationen (rr[i,j]==rr[j,i]
) sind angegeben.
Könnte man die Kovarianzmatrix-Ausgabe für die Beispieleingabedaten aufschreiben? – Divakar
Wie in der Antwort unten, aber symmetrisch und mit Diagonale gefüllt mit Einsen. – Melanie