Jeśli Cholesky-rozkładają macierz kowariancji C
do L L^T
i generuje losowe niezależne wektor x
, następnie Lx
będzie losowy wektor z kowariancji C
.
import numpy as np
import matplotlib.pyplot as plt
linalg = np.linalg
np.random.seed(1)
num_samples = 1000
num_variables = 2
cov = [[0.3, 0.2], [0.2, 0.2]]
L = linalg.cholesky(cov)
# print(L.shape)
# (2, 2)
uncorrelated = np.random.standard_normal((num_variables, num_samples))
mean = [1, 1]
correlated = np.dot(L, uncorrelated) + np.array(mean).reshape(2, 1)
# print(correlated.shape)
# (2, 1000)
plt.scatter(correlated[0, :], correlated[1, :], c='green')
plt.show()
Zobacz: Cholesky decomposition
Jeśli chcesz wygenerować dwie serie, X
i Y
, ze szczególnym (Pearson) correlation coefficient (np 0,2):
rho = cov(X,Y)/sqrt(var(X)*var(Y))
można wybrać macierz kowariancji być
cov = [[1, 0.2],
[0.2, 1]]
To sprawia, że cov(X,Y) = 0.2
i wariancje, var(X)
i var(Y)
zarówno równy 1. Tak rho
będzie równy 0,2.
Na przykład poniżej generujemy pary skorelowanych serii, X
i Y
, 1000 razy. Następnie wykreślić histogram współczynników korelacji:
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
linalg = np.linalg
np.random.seed(1)
num_samples = 1000
num_variables = 2
cov = [[1.0, 0.2], [0.2, 1.0]]
L = linalg.cholesky(cov)
rhos = []
for i in range(1000):
uncorrelated = np.random.standard_normal((num_variables, num_samples))
correlated = np.dot(L, uncorrelated)
X, Y = correlated
rho, pval = stats.pearsonr(X, Y)
rhos.append(rho)
plt.hist(rhos)
plt.show()
Jak widać, współczynniki korelacji są zazwyczaj blisko 0,2, ale dla każdej próbki, korelacja najprawdopodobniej nie będzie 0,2 dokładnie .
Niestety, moje złe, na Pythonie 3.3. – PascalVKooten
Whaaat ... Wsparcie zostało dodane naprawdę niedawno! Dzięki za przypomnienie. – PascalVKooten
@Dualinity, w nieco mniej humorystycznym tonie, obok wspaniałej kolekcji pakietów z Blendera, naprawdę sugeruję wypróbowanie Pythona (X, Y). Jest to zbiór pakietów Pythona do rozwoju naukowego + IPython + Great IDE o nazwie Spyder. http://code.google.com/p/pythonxy/ – Oz123