Ich habe einige Variablen aus meinem Python-Datensatz extrahiert und möchte aus den vorhandenen Distributionen einen größeren Datensatz generieren. Das Problem ist, dass ich versuche, dem neuen Datensatz eine gewisse Variabilität zu verleihen, während das ähnliche Verhalten beibehalten wird. Dies ist ein Beispiel für meine extrahierten Daten, die aus 400 Beobachtungen bestehen:
Value Observation Count Ratio of Entries
1 352 0.88
2 28 0.07
3 8 0.02
4 4 0.01
7 4 0.01
13 4 0.01
Jetzt versuche ich, diese Informationen zu verwenden, um einen ähnlichen Datensatz mit 2.000 Beobachtungen zu generieren. Ich kenne die numpy.random.choice
und die random.choice
Funktionen, möchte aber nicht genau die gleichen Verteilungen verwenden. Stattdessen möchte ich Zufallsvariablen (die Wertespalte) basierend auf der Verteilung generieren, jedoch mit größerer Variabilität. Ein Beispiel dafür, wie mein größerer Datensatz aussehen soll:
Value Observation Count Ratio of Entries
1 1763 0.8815
2 151 0.0755
3 32 0.0160
4 19 0.0095
5 10 0.0050
6 8 0.0040
7 2 0.0010
8 4 0.0020
9 2 0.0010
10 3 0.0015
11 1 0.0005
12 1 0.0005
13 1 0.0005
14 2 0.0010
15 1 0.0005
Die neue Verteilung könnte also geschätzt werden, wenn ich meine Originaldaten mit einer exponentiellen Abklingfunktion versehen würde. Ich bin jedoch nicht an kontinuierlichen Variablen interessiert. Wie komme ich darum herum und gibt es eine bestimmte oder mathematische Methode, die für das, was ich versuche, relevant ist?
Es hört sich so an, als ob Sie Daten basierend auf dem in der zweiten Tabelle beschriebenen PDF generieren möchten. Das PDF ist so etwas wie
0 for x <= B
A*exp(-A*(x-B)) for x > B
A
Definiert die Breite Ihrer Verteilung, die immer normalisiert wird, um eine Fläche von 1 zu haben. Dies B
ist der horizontale Versatz, der in Ihrem Fall Null ist. Sie können es zu einer Ganzzahlverteilung machen, indem Sie mit binning ceil
.
Die CDF eines normalisierten abklingenden Exponentials ist 1 - exp(-A*(x-B))
. Im Allgemeinen besteht eine einfache Möglichkeit, eine benutzerdefinierte Verteilung zu erstellen, darin, einheitliche Zahlen zu generieren und diese über die CDF zuzuordnen.
Glücklicherweise müssen Sie das nicht tun, da scipy.stats.expon
bereits die Implementierung bereitgestellt wird, nach der Sie suchen. Alles, was Sie tun müssen, ist an die Daten in Ihrer letzten Spalte anzupassen, um sie zu erhalten A
( B
ist eindeutig Null). Sie können dies leicht mit tun curve_fit
. Beachten Sie, dass die A
Karten 1.0/scale
in der PDF-Sprache angezeigt werden.
Hier ist ein Beispielcode. Ich habe hier eine zusätzliche Komplexitätsebene hinzugefügt, indem ich das Integral der Zielfunktion von n-1
bis n
für ganzzahlige Eingaben berechnet habe , wobei die Gruppierung für Sie bei der Anpassung berücksichtigt wurde.
import numpy as np
from scipy.optimize import curve_fit
from scipy.stats import expon
def model(x, a):
return np.exp(-a * (x - 1)) - exp(-a * x)
#Alternnative:
# return -np.diff(np.exp(-a * np.concatenate(([x[0] - 1], x))))
x = np.arange(1, 16)
p = np.array([0.8815, 0.0755, ..., 0.0010, 0.0005])
a = curve_fit(model, x, p, 0.01)
samples = np.ceil(expon.rvs(scale=1/a, size=2000)).astype(int)
samples[samples == 0] = 1
data = np.bincount(samples)[1:]
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen