2013-09-08 17 views
11

Chciałbym wygenerować skorelowane tablice współrzędnych x i y, aby przetestować różne podejścia do plotowania matplotlib, ale gdzieś się nie udaje, ponieważ nie mogę uzyskać numpy.random.multivariate_normal daj mi próbki, które chcę. Idealnie, chcę moje wartości x między -0,51 i 51,2, a moje wartości y pomiędzy 0,33 i 51,6 (chociaż przypuszczam, że równe zakresy byłyby w porządku, ponieważ mogę ograniczyć wykres później), ale nie jestem pewien, co znaczy (0, 0?) I wartości kowariancji, których powinienem użyć, aby pobrać te próbki z funkcji.Generowanie losowo skorelowanych punktów X i Y za pomocą Numpy

Odpowiedz

20

Jak sama nazwa wskazuje, numpy.random.multivariate_normal generuje rozkład normalny, co oznacza, że ​​istnieje nie-zerowe prawdopodobieństwo znalezienia punktów poza dowolnym podanym przedziałem. Możesz generować skorelowane rozkłady równomierne, ale to trochę bardziej skomplikowane. Spójrz na here dla dwóch możliwych metod.

Jeśli chcesz przejść z rozkładem normalnym, możesz ustawić sigmy, aby półokres odpowiadał 3 odchyleniom standardowym (w razie potrzeby możesz również odfiltrować złe punkty). W ten sposób będziesz miał ~ 99% swoich punktów wewnątrz przedziału, ex:

import numpy as np 
from matplotlib.pyplot import scatter 

xx = np.array([-0.51, 51.2]) 
yy = np.array([0.33, 51.6]) 
means = [xx.mean(), yy.mean()] 
stds = [xx.std()/3, yy.std()/3] 
corr = 0.8   # correlation 
covs = [[stds[0]**2   , stds[0]*stds[1]*corr], 
     [stds[0]*stds[1]*corr,   stds[1]**2]] 

m = np.random.multivariate_normal(means, covs, 1000).T 
scatter(m[0], m[1]) 

enter image description here

Powiązane problemy