根据数学理论从“倾斜均匀分布”生成随机数


9

出于某种目的,我需要从“倾斜均匀”分布中生成随机数(数据)。该分布的“斜率”可能会在某个合理的间隔内变化,然后我的分布应基于该斜率从均匀变为三角形。这是我的推论:

在此处输入图片说明

让我们简化一下,生成数据格式为0(蓝色,红色是均匀分布)。为了获得蓝线的概率密度函数,我只需要那条线的方程式。从而:B

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)

现在,让我们制作一个数据生成器。我们的想法是,如果我会解决,随机数X,可以计算如果我会从数0 1 从均匀分布所描述这里。因此,如果我需要从我的固定分配100张随机数φ ,那么对于任意从均匀分布0 1 X 从“倾斜分布”,和X可以被计算为:φ,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,或者都接近零。在一次运行:

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
ϕxBxBtheta11nRx<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)

Answers:


9

(0,B)

B2tanϕ<2.
B=25ϕ±tan12625

Bx

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

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)

ϕB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.