文章僅爲個人理解,如有不妥之處歡迎指正。
1、目的
matlab自帶了很多產生特定分佈的函數,但總歸是有限的,學習了一下如何產生服從任意分佈的數據,在此記錄一下。
2、問題
以四自由度卡方()分佈爲例,其概率密度函數爲 其中,爲待產生數據的均值。概率密度函數如下圖,
3、方法
舍選法:
①選定生成數據範圍[],並在此範圍生成服從均勻分佈數據;
②生成服從均勻分佈的數據,範圍建議[0,1]即可;
③若,保留,否則捨去。保留的即爲生成的數據。
其中前面兩步都好理解,關鍵是第三步的如何理解?
我的理解是用Y對x進行甄選。看下面的圖,紅點代表,用均勻分佈(假設範圍[0,1])的數與比較,有的概率大於,即綠色部分,然後保留符合的,對每個都這麼操作,這樣就能生成符合概率密度函數輪廓的數據。
4、結果
clear
xmin = 0;
xmax = 40;
num=5000; %數據數量
n=1;
h=1; %均值
data=zeros(1,num);
y = @(x,h)(4*x/h).*exp(-2*x/h);
while n<num
x = (xmax-xmin)*rand(1)-xmin;
fx=y(x,h);
Y = rand(1);
if Y<=fx
data(1,n)=x;
n=n+1;
end
end
subplot(211);
stem(data,'filled');title('生成結果')
subplot(212);hist(data,100);
hold on
t=0:0.01:5;
plot(t,y(t,h)*300,'r','LineWidth',2);xlabel('x');title('四自由度卡方分佈')
若要產生其他分佈的數據,修改匿名函數就可以了。
參考:
https://www.cnblogs.com/xingshansi/p/6539319.html