Schnelle willkürliche Verteilung zufällige Stichproben

Das random Modul ( http://docs.python.org/2/library/random.html ) hat mehrere feste Funktionen nach dem Zufallsprinzip aus. Zum Beispiel wird random.gauss zufälligen Punkt aus einer Normalverteilung mit einem gegebenen Mittelwert und Sigma-Werten random.gauss .

Ich suche nach einer Möglichkeit, eine Anzahl N von zufälligen Samples zwischen einem bestimmten Intervall mit meiner eigenen Verteilung so schnell wie möglich in python zu extrahieren. Das ist was ich meine:

 def my_dist(x): # Some distribution, assume c1,c2,c3 and c4 are known. f = c1*exp(-((x-c2)**c3)/c4) return f # Draw N random samples from my distribution between given limits a,b. N = 1000 N_rand_samples = ran_func_sample(my_dist, a, b, N) 

Wo ran_func_sample ist was ich bin und a, b sind die Grenzen, aus denen die Proben zu zeichnen. Gibt es etwas von dieser Art in python ?

3 Solutions collect form web for “Schnelle willkürliche Verteilung zufällige Stichproben”

Sie müssen Inverse Transformation Sampling- Methode verwenden, um zufällige Werte verteilt nach einem Gesetz, das Sie wollen. Mit dieser Methode können Sie einfach invertierte Funktion auf Zufallszahlen mit standardmäßiger Verteilung im Intervall [0,1] anwenden.

Nachdem du die invertierte Funktion gefunden hast, bekommst du 1000 Nummern, die nach der benötigten Verteilung verteilt werden, diese offensichtliche Weise:

 [inverted_function(random.random()) for x in range(1000)] 

Mehr über Inverse Transform Sampling :

Auch gibt es eine gute Frage auf StackOverflow im Zusammenhang mit dem Thema:

  • Pythonische Möglichkeit, Listenelemente mit unterschiedlicher Wahrscheinlichkeit auszuwählen

Dieser Code implementiert die Abtastung von diskreten Wahrscheinlichkeitsverteilungen. Durch das Setzen eines Flags auf das Objekt kann es auch als stückweise konstante Wahrscheinlichkeitsverteilung verwendet werden, die dann verwendet werden kann, um beliebige pdfs zu approximieren. Nun, willkürliche pdfs mit kompakter Unterstützung; Wenn Sie effizient extrem lange Schwänze probieren möchten, wäre eine einheitliche Beschreibung des pdf erforderlich. Aber das ist immer noch effizient, auch für Dinge wie luftig-Punkt-gesteuerte Funktionen (die ich es zuerst erschaffen habe). Die interne Sortierung von Werten ist dort absolut kritisch, um Genauigkeit zu erhalten; Die vielen kleinen Werte in den Schwänzen sollten wesentlich dazu beitragen, aber sie werden in fp Genauigkeit ohne Sortierung ertrinken.

 class Distribution(object): """ draws samples from a one dimensional probability distribution, by means of inversion of a discrete inverstion of a cumulative density function the pdf can be sorted first to prevent numerical error in the cumulative sum this is set as default; for big density functions with high contrast, it is absolutely necessary, and for small density functions, the overhead is minimal a call to this distibution object returns indices into density array """ def __init__(self, pdf, sort = True, interpolation = True, transform = lambda x: x): self.shape = pdf.shape self.pdf = pdf.ravel() self.sort = sort self.interpolation = interpolation self.transform = transform #a pdf can not be negative assert(np.all(pdf>=0)) #sort the pdf by magnitude if self.sort: self.sortindex = np.argsort(self.pdf, axis=None) self.pdf = self.pdf[self.sortindex] #construct the cumulative distribution function self.cdf = np.cumsum(self.pdf) @property def ndim(self): return len(self.shape) @property def sum(self): """cached sum of all pdf values; the pdf need not sum to one, and is imlpicitly normalized""" return self.cdf[-1] def __call__(self, N): """draw """ #pick numbers which are uniformly random over the cumulative distribution function choice = np.random.uniform(high = self.sum, size = N) #find the indices corresponding to this point on the CDF index = np.searchsorted(self.cdf, choice) #if necessary, map the indices back to their original ordering if self.sort: index = self.sortindex[index] #map back to multi-dimensional indexing index = np.unravel_index(index, self.shape) index = np.vstack(index) #is this a discrete or piecewise continuous distribution? if self.interpolation: index = index + np.random.uniform(size=index.shape) return self.transform(index) if __name__=='__main__': shape = 3,3 pdf = np.ones(shape) pdf[1]=0 dist = Distribution(pdf, transform=lambda i:i-1.5) print dist(10) import matplotlib.pyplot as pp pp.scatter(*dist(1000)) pp.show() 

Und als realistischeres Beispiel:

 x = np.linspace(-100, 100, 512) p = np.exp(-x**2) pdf = p[:,None]*p[None,:] #2d gaussian dist = Distribution(pdf, transform=lambda i:i-256) print dist(1000000).mean(axis=1) #should be in the 1/sqrt(1e6) range import matplotlib.pyplot as pp pp.scatter(*dist(1000)) pp.show() 
 import numpy as np import scipy.interpolate as interpolate def inverse_transform_sampling(data, n_bins, n_samples): hist, bin_edges = np.histogram(data, bins=n_bins, density=True) cum_values = np.zeros(bin_edges.shape) cum_values[1:] = np.cumsum(hist*np.diff(bin_edges)) inv_cdf = interpolate.interp1d(cum_values, bin_edges) r = np.random.rand(n_samples) return inv_cdf(r) 

Wenn wir also unser inverse_transform_sampling mit einer bestimmten Verteilung inverse_transform_sampling , gibt die Funktion inverse_transform_sampling einen Datensatz mit genau derselben Verteilung zurück. Hier ist der Vorteil, dass wir unsere eigene Stichprobengröße erhalten können, indem wir sie in der Variablen n_samples .

  • Random String Generation mit Großbuchstaben und Ziffern in Python
  • N zufällige, zusammenhängende und nicht überlappende Teilsequenzen jeder Länge
  • Auswählen eines zufälligen Listenelements der Länge n in Python
  • Was ist der beste Weg, um zufällige Strings einer bestimmten Länge in Python zu generieren?
  • Warum ist mein Mathe-Quiz immer falsch, wenn die Antwort richtig ist
  • Python entfernen Sie ein Element aus einer zufälligen Liste, nachdem sie ausgewählt wurden
  • Set.pop () ist nicht zufällig?
  • Erstellen von zufälligen Textzeichenfolgen eines gegebenen Musters
  • Erzeugen von "zufälligen" Strings aus einer anderen Zeichenfolge in Python?
  • Zufällig aus der Liste mit random.randint in python wählen
  • Wie man eine zufällige 4-stellige Zahl generiert, die nicht mit 0 beginnt und eindeutige Ziffern hat?
  • Python ist die beste Programmiersprache der Welt.