CV는 코드에 관한 것이 아니라 이것이 모든 좋은 답변, 특히 @Mark L. Stone의 기여를 어떻게 돌 볼지 궁금했습니다. 질문에 대한 실제 답변은 자신의 게시물에 제공됩니다 (의심이있을 경우 자신의 게시물에 크레딧을 제공하십시오). 앞으로이 게시물을 쉽게 검색 할 수 있도록이 추가 정보를 여기로 옮기고 있습니다. Mark의 답변 후에 다른 우수 답변을 재생하지 않고 OP의 게시물을 수정하여 문제를 마무리합니다.
PYTHON에서 :
import numpy as np
no_obs = 1000 # Number of observations per column
means = [1, 2, 3] # Mean values of each column
no_cols = 3 # Number of columns
sds = [1, 2, 3] # SD of each column
sd = np.diag(sds) # SD in a diagonal matrix for later operations
observations = np.random.normal(0, 1, (no_cols, no_obs)) # Rd draws N(0,1) in [3 x 1,000]
cor_matrix = np.array([[1.0, 0.6, 0.9],
[0.6, 1.0, 0.5],
[0.9, 0.5, 1.0]]) # The correlation matrix [3 x 3]
cov_matrix = np.dot(sd, np.dot(cor_matrix, sd)) # The covariance matrix
Chol = np.linalg.cholesky(cov_matrix) # Cholesky decomposition
array([[ 1. , 0. , 0. ],
[ 1.2 , 1.6 , 0. ],
[ 2.7 , -0.15 , 1.29903811]])
sam_eq_mean = Chol .dot(observations) # Generating random MVN (0, cov_matrix)
s = sam_eq_mean.transpose() + means # Adding the means column wise
samples = s.transpose() # Transposing back
print(np.corrcoef(samples)) # Checking correlation consistency.
[[ 1. 0.59167434 0.90182308]
[ 0.59167434 1. 0.49279316]
[ 0.90182308 0.49279316 1. ]]
[R]에서 :
no_obs = 1000 # Number of observations per column
means = 1:3 # Mean values of each column
no_cols = 3 # Number of columns
sds = 1:3 # SD of each column
sd = diag(sds) # SD in a diagonal matrix for later operations
observations = matrix(rnorm(no_cols * no_obs), nrow = no_cols) # Rd draws N(0,1)
cor_matrix = matrix(c(1.0, 0.6, 0.9,
0.6, 1.0, 0.5,
0.9, 0.5, 1.0), byrow = T, nrow = 3) # cor matrix [3 x 3]
cov_matrix = sd %*% cor_matrix %*% sd # The covariance matrix
Chol = chol(cov_matrix) # Cholesky decomposition
[,1] [,2] [,3]
[1,] 1 1.2 2.700000
[2,] 0 1.6 -0.150000
[3,] 0 0.0 1.299038
sam_eq_mean = t(observations) %*% Chol # Generating random MVN (0, cov_matrix)
samples = t(sam_eq_mean) + means
cor(t(samples))
[,1] [,2] [,3]
[1,] 1.0000000 0.6071067 0.8857339
[2,] 0.6071067 1.0000000 0.4655579
[3,] 0.8857339 0.4655579 1.0000000
colMeans(t(samples))
[1] 1.035056 2.099352 3.065797
apply(t(samples), 2, sd)
[1] 0.9543873 1.9788250 2.8903964