数学理論の「傾斜均一分布」から乱数を生成する


9

ある目的のために、「傾斜均一」分布から乱数(データ)を生成する必要があります。この分布の「勾配」は、ある程度の間隔で変化する可能性があり、その場合、私の分布は勾配に基づいて均一から三角形に変化するはずです。これが私の派生です:

ここに画像の説明を入力してください

それを簡単にして、からまでのデータを生成しましょう(青、赤は均一な分布です)。青い線の確率密度関数を取得するには、その線の方程式が必要です。したがって:0B

f(x)=tg(φ)x+Y(0)

以降(写真):

tg(φ)=1/BY(0)B/2Y(0)=1Btg(φ)B2

私たちはそれを持っています:

f(x)=tg(φ)x+(1Btg(φ)B2)

以来、 PDFであり、CDFに等しいです。f(x)

F(x)=tg(φ)x22+x(1Btg(φ)B2)

次に、データジェネレータを作成します。アイデアは私が修正しますならばということ、である、乱数 Iから番号を取得します場合に計算することができます説明するように一様分布からここに。私は固定と私の分布から100個の乱数が必要な場合はこのように、、その後、いずれかの一様分布からがあり「傾斜配分」からは、およびのように計算することができます。φ,Bx(0,1)φ,Bti(0,1)xix

tg(φ)xi22+xi(1Btg(φ)B2)ti=0

この理論から、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コードでも同様の結果が得られると思います。


2
乱数を生成するだけでよい場合は、分布を計算する必要はありません。ダーツを写真に投げてx座標を保持するだけですが、ダーツが「」というラベルが付いた左の三角形に着地したら、x座標をからます。たとえば、任意の値をおよび(からまでの値を指定すると分布を生成する実際のパラメーター)に与え、必要なランダム値の数に設定します。ここにあるコードは:ϕxBxBtheta11nRx<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)
whuber

回答:


9

あなたの派生は大丈夫です。で正の密度を得るには、制約 が必要であることに注意して ください。コード、を間に取る必要があります、ここでコードが失敗します。(0,B)

B2tanϕ<2.
B=25ϕ±tan12625

二次ソルバーの使用を避け(そして、すべきです)、次に0と間の根を選択します。解かれるの2次多項式は 、 構成により、およびです。また、は増加します。Bx

F(x)=t
F(x)=12tanϕx2+(1BB2tanϕ)x.
F(0)=0F(B)=1F(0,B)

これから、場合、関心のある放物線の部分は放物線の右側の一部であり、維持するルートは2つのルートの中で最も高いことがわかります。is 逆に、場合、放物線は上下逆になり、その左側に関心があります部。維持するルートは最も低いルートです。符号を考慮すると、これは最初のケースと同じルート(つまり、持つルート)であるように見えます。tanϕ>0

x=1tanϕ(B2tanϕ1B+(B2tanϕ1B)2+2tanϕt.)
tanϕ<0tanϕ+Δ

ここにいくつかのRコードがあります。

phi <- pi/8; B <- 2
f <- function(t) (-(1/B - 0.5*B*tan(phi)) + 
       sqrt( (1/B - 0.5*B*tan(phi))**2 + 2 * tan(phi) * t))/tan(phi)
hist(f(runif(1e6)))

ヒストグラム1

そして:ϕ<0

phi <- -pi/8
hist(f(runif(1e6)))

ここに画像の説明を入力してください


1
私はミスを犯しました。自分の角度を範囲外に設定したので、それがわかりました。しかし、なぜ数値ソルバーを使用して回避すべきかについてのあなたの説明は、私にとってはまだ霧のようです。もっと説明していただけますか?それを取得するのが大好きです。F(x)
ロバート

@Robert私はの値が正しければコードはうまく機能すると思います。ただし、潜在的な問題を見つけることができません(0と間にソリューションがない場合、または両方のソリューションがある場合、または実際のソリューションがない場合)。既製のソルバーの使用を避けるための追加の作業は、それだけの価値があります。BϕB
Elvis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.