Für einen bestimmten Zweck muss ich Zufallszahlen (Daten) aus einer "geneigten gleichmäßigen" Verteilung generieren. Die "Steigung" dieser Verteilung kann in einem angemessenen Intervall variieren, und dann sollte sich meine Verteilung basierend auf der Steigung von gleichmäßig zu dreieckig ändern. Hier ist meine Ableitung:
Machen wir es einfach und generieren Daten von bis (blau, rot ist gleichmäßige Verteilung). Um die Wahrscheinlichkeitsdichtefunktion der blauen Linie zu erhalten, benötige ich nur die Gleichung dieser Linie. Somit:B.
und da (Bild):
Wir haben das:
Da PDF ist, ist CDF gleich:
Jetzt machen wir einen Datengenerator. Die Idee ist, dass, wenn ich repariere , Zufallszahlen berechnet werden können, wenn ich Zahlen aus aus einer gleichmäßigen Verteilung wie hier beschrieben erhalte . Wenn ich also 100 Zufallszahl aus meiner Verteilung muß mit festen , dann für jede aus gleichmäßiger Verteilung gibt es von „geneigter Verteilung“, und kann wie folgt berechnet werden:xφ , B t i (x i x
Aus dieser Theorie habe ich Code in Python erstellt, der wie folgt aussieht:
import numpy as np
import math
import random
def tan_choice():
x = random.uniform(-math.pi/3, math.pi/3)
tan = math.tan(x)
return tan
def rand_shape_unif(N, B, tg_fi):
res = []
n = 0
while N > n:
c = random.uniform(0,1)
a = tg_fi/2
b = 1/B - (tg_fi*B)/2
quadratic = np.poly1d([a,b,-c])
rots = quadratic.roots
rot = rots[(rots.imag == 0) & (rots.real >= 0) & (rots.real <= B)].real
rot = float(rot)
res.append(rot)
n += 1
return res
def rand_numb(N_, B_):
tan_ = tan_choice()
res = rand_shape_unif(N_, B_, tan_)
return res
Aber die Zahlen, aus rand_numb
denen generiert wird, sind sehr nahe bei Null oder bei B (was ich als 25 eingestellt habe). Es gibt keine Varianz, wenn ich 100 Zahlen generiere, sind alle nahe bei 25 oder alle nahe bei Null. In einem Lauf:
num = rand_numb(100, 25)
numb
Out[140]:
[0.1063241766836174,
0.011086243095907753,
0.05690217839063588,
0.08551031241199764,
0.03411227661295121,
0.10927087752739746,
0.1173334720516189,
0.14160616846114774,
0.020124543145515768,
0.10794924067959207]
In meinem Code muss also etwas sehr falsch sein. Kann mir jemand bei meiner Ableitung oder meinem Code helfen? Ich bin jetzt verrückt danach, ich kann keinen Fehler sehen. Ich nehme an, dass R-Code mir ähnliche Ergebnisse liefert.
B
theta
n
R
x<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)