用Matlab产生服从任意分布的数据

文章仅为个人理解,如有不妥之处欢迎指正。

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} xminxmax],并在此范围生成服从均匀分布数据 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
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值