概述
文章仅为个人理解,如有不妥之处欢迎指正。
1、目的
matlab自带了很多产生特定分布的函数,但总归是有限的,学习了一下如何产生服从任意分布的数据,在此记录一下。
2、问题
以四自由度卡方(
χ
2
chi^2
χ2)分布为例,其概率密度函数为
f
(
x
)
=
4
x
h
e
x
p
[
−
2
x
h
]
f(x)=frac{4x}{h}exp[-frac{2x}{h}]
f(x)=h4xexp[−h2x]
v
a
r
(
x
)
=
h
2
/
2
var(x)=h^2/2
var(x)=h2/2 其中,
h
h
h为待产生数据
x
x
x的均值。概率密度函数如下图,
3、方法
舍选法:
①选定生成数据范围[
x
m
i
n
,
x
m
a
x
x_{min},x_{max}
xmin,xmax],并在此范围生成服从均匀分布数据
x
x
x;
②生成服从均匀分布的数据
Y
Y
Y,范围建议[0,1]即可;
③若
Y
<
f
(
x
)
Y<f(x)
Y<f(x),保留
x
x
x,否则舍去。保留的
x
x
x即为生成的数据。
其中前面两步都好理解,关键是第三步
Y
<
f
(
x
)
Y<f(x)
Y<f(x)的如何理解?
我的理解是用Y对x进行甄选。看下面的图,红点代表
f
(
x
)
f(x)
f(x),用均匀分布(假设范围[0,1])的数
Y
Y
Y与
f
(
x
)
f(x)
f(x)比较,
x
x
x有
f
(
x
)
f(x)
f(x)的概率大于
Y
Y
Y,即绿色部分,然后保留符合
Y
<
f
(
x
)
Y<f(x)
Y<f(x)的
x
x
x,对每个
x
x
x都这么操作,这样就能生成符合概率密度函数轮廓的数据。
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
最后
以上就是着急热狗为你收集整理的用Matlab产生服从任意分布的数据的全部内容,希望文章能够帮你解决用Matlab产生服从任意分布的数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复