ある目的のために、「傾斜均一」分布から乱数(データ)を生成する必要があります。この分布の「勾配」は、ある程度の間隔で変化する可能性があり、その場合、私の分布は勾配に基づいて均一から三角形に変化するはずです。これが私の派生です:
それを簡単にして、からまでのデータを生成しましょう(青、赤は均一な分布です)。青い線の確率密度関数を取得するには、その線の方程式が必要です。したがって:
以降(写真):
私たちはそれを持っています:
以来、 PDFであり、CDFに等しいです。
次に、データジェネレータを作成します。アイデアは私が修正しますならばということ、である、乱数 Iから番号を取得します場合に計算することができます説明するように一様分布からここに。私は固定と私の分布から100個の乱数が必要な場合はこのように、、その後、いずれかの一様分布からがあり「傾斜配分」からは、およびのように計算することができます。
この理論から、Pythonで次のようなコードを作成しました。
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
しかし、から生成された数値は、rand_numb
ゼロまたはB(私が25に設定したもの)に非常に近いです。100の数値を生成すると、差異はありません。すべての数値が25に近いか、すべてがゼロに近いです。1回の実行で:
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]
したがって、私のコードに非常に問題があるはずです。誰かが私の派生物やコードを手伝ってくれる?私は今これに夢中です、私はどんな間違いも見ることができません。Rコードでも同様の結果が得られると思います。
B
theta
n
R
x<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)