Matematiksel teoriden “eğimli düzgün dağılım” dan rastgele sayılar üretme


9

Bazı amaçlar için, "eğimli düzgün" dağıtımdan rasgele sayılar (veri) üretmem gerekiyor. Bu dağılımın "eğimi" makul aralıklarla değişebilir ve daha sonra dağılımım eğime bağlı olarak üniformdan üçgene değişmelidir. İşte benim türetme:

resim açıklamasını buraya girin

En kolaylaştırır ve veri oluştururlar oluşturmak Let için (mavi, kırmızı homojen olarak dağılmıştır). Mavi çizginin olasılık yoğunluk fonksiyonunu elde etmek için sadece o çizginin denklemine ihtiyacım var. Böylece:0B

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

ve beri (resim):

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

Buna sahibiz:

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

Yana PDF olduğunu CDF eşittir:f(x)

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

Şimdi bir veri üreticisi yapalım. Fikir şu ki, eğer düzeltirsem , burada açıklandığı gibi tekdüze bir dağılımdan den numaralar rastgele sayılar hesaplanabilir . Böylece, sabit ile dağıtımımdan 100 rastgele sayıya ihtiyacım varsa , o zaman tekdüze dağılımdan herhangi bir için "eğimli dağıtım" dan vardır ve şu şekilde hesaplanabilir:φ,Bx(0,1)φ,Bti(0,1)xix

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

Bu teoriden Python kodunu şöyle yaptım:

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

Ancak üretilen sayılar rand_numbsıfıra veya B'ye çok yakındır (25 olarak ayarladığım). Varyans yok, 100 sayı oluşturduğumda hepsi 25'e yakın ya da hepsi sıfıra yakın. Tek koşuda:

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]

Bu yüzden kodumda çok yanlış bir şey olmalı. Birisi türetimi veya kodumu bana yardımcı olabilir mi? Bu konuda çıldırıyorum, hiçbir hata göremiyorum. Sanırım R kodu bana benzer sonuçlar verecek.


2
Yalnızca rasgele sayılar üretmeniz gerekiyorsa, dağıtımı hiç yapmanız gerekmez. Sadece resme dart atmak ve onların X-koordinatlarını korumak, ancak soldaki üçgeni "bir dart toprakları zaman ", onun değiştirmek gelen x-koordinatı için . Örneğin, ve değerlerine ( ile arasında değerler verildiğinde dağılımlarınızı üreten gerçek bir parametre ) verin ve ihtiyacınız olan rastgele değerlerin sayısı olarak ayarlayın . İşte kod:ϕxBxBtheta11nRx<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)
whuber

Yanıtlar:


9

Türeviniz tamam. üzerinde pozitif bir yoğunluk elde etmek için sınırlaması yapmanız gerektiğini unutmayın. kodunuzda arasında almanız gerekir. , kodunuzun başarısız olduğu yer burası.(0,B)

B2tanϕ<2.
B=25ϕ±tan12625

İkinci dereceden bir çözücü kullanmaktan kaçınabilirsiniz (ve yapmalısınız) ve ardından 0 ile arasındaki kökleri seçebilirsiniz . İkinci dereceden bir polinom içinde çözülecek olan ile Yapı ile ve ; ayrıca artar .Bx

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

Bundan , ilgilendiğimiz parabolün bir kısmının parabolün sağ tarafının bir parçası olduğunu ve saklanacak kökün iki kökün en yükseği olduğunu görmek kolaydır. olduğu Aksine, ise parabol baş aşağıdır ve soluna ilgi duyuyoruz Bölüm. Saklanacak kök en düşük köküdür. işareti göz önüne alındığında , bunun ilk durumda olduğundan aynı kök (yani ) olduğu görülmektedir.tanϕ>0

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

İşte bazı R kodu.

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)))

histogram 1

Ve :ϕ<0

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

resim açıklamasını buraya girin


1
Bir hata yaptım, çünkü açımı sınırların dışına çıkardım, anladım. Ama neden sayısal çözücüsü kullanmaktan kaçınmam gerektiğine dair açıklamanız benim için hala sisli. Daha fazla açıklamaya çalışabilir misiniz lütfen? almayı seviyorum. F(x)
Robert

@Robert değeri doğru ise kodunuzun iyi çalıştığını düşünüyorum . Bununla birlikte, potansiyel sorunları yakalamanızı önler ( ya 0 ile arasında hiçbir çözüm yoksa? Ya da her iki çözüm de? Veya gerçek bir çözüm yoksa?). Hazır çözücüyü kullanmaktan kaçınmak için ek çalışma buna değer. ϕB
Elvis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.