Matlab如何用均勻分佈產生其他分佈?

##背景
Matlab有一個隨機數生成函數rand(1,n),即在(0,1)區間產生均勻分佈的n個隨機數。如果需要在帶權重的蒙特卡洛模擬中生成其他概率密度分佈的隨機數,該怎麼辦呢?能夠利用均勻分佈經過某種變換得到嗎?

這篇筆記就是介紹如何利用均勻分佈,產生其他分佈,比如概率密度:
f(y)=(42y)/3,y[0,1] f(y)=(4-2y)/3 ,y\in[0,1]
具體目的是先用matlab生成[0,1]的100個隨機數,然後通過什麼變換,將這100個隨機數做映射,而其統計結果符合上述的概率密度分佈。這樣做有什麼意義嗎?一方面能加深對概率密度間轉換的理解,你會發現考研數學中統計與概率終於有用武之地!另一方面,我們如果能夠產生自己所希望的概率分佈的隨機數,在帶權重的蒙特卡洛模擬中會如虎添翼,大大提高效率。

一、標準流程介紹

設隨機變量X的概率分佈爲U(0,1),若Y=h(X)=X2Y=h(X)=X^2,求Y的概率密度分佈?

先計算Y的累計分佈函數,再對其求導得到Y的概率密度函數:
F(y)=P(Yy)=P(X2y)=P(Xy)=y,y(0,1) F(y)=P(Y\leq y)=P(X^2\leq y)=P(X\leq \sqrt{y})=\sqrt{y},y\in(0,1)
f(y)=dF(y)dy=12y,y(0,1) f(y)=\frac{d F(y)}{d y}=\frac{1}{2\sqrt{y}},y\in(0,1)
這套流程非常標準化,也很實用,那麼現在的問題是:已知f(y),如何求出h(X)?

二、實戰

設隨機變量X的概率分佈爲U(0,1),若Y=h(X)f(y)=(42y)/3,y(0,1)Y=h(X),f(y)=(4-2y)/3 ,y\in(0,1),那麼h(x)爲多少?

如果不清楚前面的標準流程,這種題目絕對會一頭霧水,也多虧了考研時這方面的訓練,能夠比較清晰的獲得解答:
F(y)=P(Yy)=P(h(X)y)=P(Xh1(y))=h1(y) F(y)=P(Y\leq y)=P(h(X)\leq y)=P(X\leq h^{-1}(y))=h^{-1}(y)
另一方面:
F(y)=0yf(y)dy=13(4yy2),y(0,1) F(y)=\int_0^y f(y) dy=\frac{1}{3}(4y-y^2),y\in(0,1)
因此需要解一個反函數:
h1(y)=13(4yy2) h^{-1}(y)=\frac{1}{3}(4y-y^2)
h1(y)=xh^{-1}(y)=x,再反解y即可,這裏有點繞,需要細細品味:
y=243x=h(x) y=2-\sqrt{4-3x}=h(x)
即爲所求的映射關係。

三、直觀呈現

% matlab 代碼
clear;clc;
%產生n個(0,1)的隨機數
n=10000;
x=rand(1,n);
%x的概率密度統計圖
xx=linspace(0,1,21);%將最大最小區間分成21個等分點(20等分),然後分別計算各個區間的個數
yy=hist(x,xx)/n/0.05;%計算各個區間的概率密度
bar(xx,yy)%畫出均勻分佈的概率密度分佈圖
%%
y=2-sqrt(4-3*x);
yy2=hist(y,xx)/n/0.05;%計算各個區間的概率密度
bar(xx,yy2)%畫出特定分佈概率密度分佈圖

均勻分佈.jpg
特定分佈.jpg

更精彩的應用請參考:如何用帶權重的蒙特卡洛計算積分?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章