Tạo các số ngẫu nhiên từ phân phối đồng phục dốc dốc của Wap từ lý thuyết toán học


9

Đối với một số mục đích, tôi cần tạo số ngẫu nhiên (dữ liệu) từ phân phối "đồng phục dốc". "Độ dốc" của phân phối này có thể thay đổi trong một số khoảng thời gian hợp lý, và sau đó phân phối của tôi sẽ thay đổi từ đồng nhất sang tam giác dựa trên độ dốc. Đây là dẫn xuất của tôi:

nhập mô tả hình ảnh ở đây

Hãy làm cho nó đơn giản và tạo dữ liệu từ đến (màu xanh, đỏ là phân phối đồng đều). Để có được hàm mật độ xác suất của đường màu xanh, tôi chỉ cần phương trình của đường đó. Như vậy:0B

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

và kể từ (hình):

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

Chúng tôi có điều đó:

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

Vì là PDF, CDF bằng:f(x)

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

Bây giờ hãy tạo một trình tạo dữ liệu. Ý tưởng là, nếu tôi sửa , các số ngẫu nhiên có thể được tính nếu tôi nhận được các số từ từ một phân phối thống nhất như được mô tả ở đây . Do đó, nếu tôi cần 100 số ngẫu nhiên từ phân phối của mình với cố định , thì với bất kỳ nào từ phân phối đồng đều có từ "phân phối dốc" và có thể được tính là:φ,Bx(0,1)φ,Bti(0,1)xix

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

Từ lý thuyết này, tôi đã tạo mã bằng Python trông như sau:

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

Nhưng các số được tạo từ rand_numbrất gần với 0 hoặc B (mà tôi đặt là 25). Không có phương sai, khi tôi tạo ra 100 số, tất cả chúng đều gần 25 hoặc tất cả đều gần bằng không. Trong một lần chạy:

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]

Vì vậy, phải có một cái gì đó rất sai trong mã của tôi. Bất cứ ai có thể giúp tôi với đạo hàm hoặc mã của tôi? Tôi điên về điều này bây giờ, tôi không thể thấy bất kỳ sai lầm. Tôi cho rằng mã R sẽ cho tôi kết quả tương tự.


2
Nếu bạn chỉ cần tạo số ngẫu nhiên, bạn hoàn toàn không phải thực hiện phân phối. Chỉ cần ném phi tiêu vào ảnh của bạn và giữ tọa độ x của chúng, nhưng khi phi tiêu rơi vào tam giác bên trái có nhãn " ", hãy thay đổi tọa độ x của nó từ thành . Ví dụ: đưa ra bất kỳ giá trị nào cho và (một tham số thực, khi được đưa ra các giá trị từ đến , sẽ tạo ra các bản phân phối của bạn) và được đặt thành số lượng giá trị ngẫu nhiên bạn cần. Đây là mã:ϕxBxBtheta11nRx<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)
whuber

Câu trả lời:


9

Dẫn xuất của bạn là ok. Lưu ý rằng để có được mật độ dương trên , bạn phải ràng buộc Trong mã của bạn do đó bạn nên lấy giữa , đó là nơi mã của bạn thất bại.(0,B)

B2tanϕ<2.
B=25ϕ±tan12625

Bạn có thể (và nên) tránh sử dụng một giải bậc hai, và sau đó chọn rễ giữa 0 và . Phương trình đa thức bậc hai theo cần giải là với Bằng cách xây dựng và ; cũng tăng trên .Bx

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

Từ đó, dễ dàng nhận thấy rằng nếu , phần parabola mà chúng ta quan tâm là một phần bên phải của parabola và phần gốc phải giữ là phần cao nhất trong hai gốc, đó là là Ngược lại, nếu , parabola bị lộn ngược và chúng tôi quan tâm đến bên trái của nó phần. Các gốc để giữ là thấp nhất. Có tính đến dấu hiệu của có vẻ như đây là cùng một gốc (tức là cái có ) so với trường hợp đầu tiên.tanϕ>0

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

Đây là một số mã 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)))

biểu đồ 1

Và với :ϕ<0

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

nhập mô tả hình ảnh ở đây


1
Tôi đã phạm một sai lầm, bởi vì tôi đặt góc của mình ra khỏi giới hạn, tôi nhận được nó. Nhưng lời giải thích của bạn tại sao tôi nên sử dụng bộ giải số vẫn còn mù mờ đối với tôi. Bạn có thể cố gắng để giải thích nó nhiều hơn, xin vui lòng? id tình yêu để có được nó. F(x)
Robert

@Robert Tôi nghĩ rằng mã của bạn hoạt động tốt nếu giá trị của là chính xác. Tuy nhiên, nó ngăn bạn nắm bắt các vấn đề tiềm ẩn (nếu không có giải pháp nào nằm trong khoảng từ 0 đến ? Hoặc nếu cả hai giải pháp là? Hoặc nếu không có giải pháp thực sự thì sao?). Các công việc bổ sung cần tránh để sử dụng bộ giải đã làm sẵn là đáng giá. ϕB
Elvis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.