R
從數學理論的“傾斜均勻分佈”生成隨機數
出於某種目的,我需要從“傾斜均勻”分佈中生成隨機數(數據)。這種分佈的“斜率”可能會在某個合理的區間內變化,然後我的分佈應該根據斜率從均勻變為三角形。這是我的推導:
讓我們簡單一點,生成數據表格到(藍色、紅色為均勻分佈)。為了獲得藍線的概率密度函數,我只需要那條線的方程。因此:
因為(圖片):
我們有:
自從是 PDF,CDF 等於:
現在讓我們製作一個數據生成器。這個想法是,如果我能修復, 隨機數如果我能從中得到數字,就可以計算出來從這裡描述的均勻分佈。因此,如果我需要 100 個隨機數從我的分佈中固定,那麼對於任何從均勻分佈有從“傾斜分佈”,和可以計算為:
根據這個理論,我用 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 代碼會給我類似的結果。
你的推導沒問題。請注意,要獲得正密度,你必須約束
在您的代碼中所以你應該採取之間,這就是您的代碼失敗的地方。 您可以(並且應該)避免使用二次求解器,然後選擇 0 到. 二次多項式方程要解決的是
和
按施工和; 還增加. 由此不難看出,如果,我們感興趣的拋物線部分是拋物線右側的一部分,要保持的根是兩個根中最高的,即
相反,如果,拋物線是顛倒的,我們對它的左邊部分感興趣。要保留的根是最低的。考慮到符號看來這是同一個根(即與) 比第一種情況。 這是一些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)))
與:
phi <- -pi/8 hist(f(runif(1e6)))