2013-09-08 14 views
11

Ich möchte korrelierte Arrays von X und Y-Koordinaten zu generieren, um verschiedene Matplotlib Plotten Ansätze zu testen, aber ich scheitern irgendwo, weil ich nicht numpy.random.multivariate_normal zu bekommen Gib mir die Muster, die ich möchte. Im Idealfall möchte ich meine x-Werte zwischen -0,51 und 51,2 und meine y-Werte zwischen 0,33 und 51,6 (obwohl ich gleiche Bereiche in Ordnung wäre, da ich die Handlung später beschränken kann), aber ich bin mir nicht sicher, was (0, 0?) Und Kovarianzwerte, die ich verwenden sollte, um diese Proben von der Funktion zu erhalten.Generieren zufällige korrelierte x und y Punkte mit Numpy

Antwort

20

Wie der Name impliziert numpy.random.multivariate_normal generiert normale Verteilungen, bedeutet dies, dass es eine Nicht-Null-Wahrscheinlichkeit gibt, Punkte außerhalb eines gegebenen Intervalls zu finden. Sie können korrelierte gleichförmige Verteilungen erzeugen, aber dies ist ein wenig komplizierter. Werfen Sie einen Blick auf here für zwei mögliche Methoden.

Wenn Sie mit der Normalverteilung arbeiten möchten, können Sie die Sigmas so einrichten, dass Ihr Halbintervall 3 Standardabweichungen entspricht (Sie können die schlechten Punkte bei Bedarf auch herausfiltern). Auf diese Weise müssen Sie ~ 99% der Punkte in Ihrem Intervall, 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