R

從數學理論的“傾斜均勻分佈”生成隨機數

  • February 2, 2017

出於某種目的,我需要從“傾斜均勻”分佈中生成隨機數(數據)。這種分佈的“斜率”可能會在某個合理的區間內變化,然後我的分佈應該根據斜率從均勻變為三角形。這是我的推導:

在此處輸入圖像描述

讓我們簡單一點,生成數據表格到(藍色、紅色為均勻分佈)。為了獲得藍線的概率密度函數,我只需要那條線的方程。因此:

因為(圖片):

我們有:

自從是 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)))

直方圖 1

與:

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

在此處輸入圖像描述

引用自:https://stats.stackexchange.com/questions/259569

comments powered by Disqus