Đố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:
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:
và kể từ (hình):
Chúng tôi có điều đó:
Vì là PDF, CDF bằng:
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à:
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_numb
rấ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ự.
B
theta
n
R
x<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)