如何用matlab生成服从混合高斯分布的随机数?


M=10; %产生M行N列的随机数矩阵 

N=8; 

miu1=1;%第一个分布的参数 

sigma1=2;%第一个分布的参数 

miu2=6;%第二个分布的参数 

sigma2=1;%第二个分布的参数 



R = 0.2*normrnd(miu1,sigma1,M,N)+0.8*normrnd(miu2,sigma2,M,N); 



单点的概率全是0,那你取出来的随机数算什么? 

若干个随机数要满足统计分布,是要按区间统计的 

另外我不知道你要做什么就是了。 

你如果想按一定的概率密度来产生随机数,你最好用反函数法之类的来弄。 


比如产生一个x.^2分布的随机数,不过这些要归一化。 


============================================ 

首先,我知道我的是错的了。如下图就可知 

M=1000; %产生M行N列的随机数矩阵 

N=1; 

miu1=1;%第一个分布的参数 

sigma1=2;%第一个分布的参数 

miu2=6;%第二个分布的参数 

sigma2=1;%第二个分布的参数 


R = 0.2*normrnd(miu1,sigma1,M,N)+0.8*normrnd(miu2,sigma2,M,N); 


x=-5:0.001:15; 

y1=normpdf(x,miu1,sigma1); 

y2=normpdf(x,miu2,sigma2); 

subplot(2,2,1); 

plot(x,y1); 

subplot(2,2,2); 

plot(x,y2); 

subplot(2,2,3); 

y3=0.2*y1+0.8*y2; 

plot(x,y3); 


subplot(2,2,4) 

dx=0.5; 

xx=-5:dx:15; 

yy=hist(R,xx); 

yy=yy/M/dx; 

plot(x,y3); 

hold on 

bar(xx,yy) 


======================================= 

正确做法,我还没弄出来,继续中。。。。 


============================================

_____________________新的尝试

下面的结果我觉得可能可以接受。 

思路:基于反变换法 

Matlab下面有 

p=normpdf(x,miu,sigma)是求出x处的概率密度。 

p=normcdf(x,miu,sigma)是求出X<x的累积概率密度(就是从负无穷大到x处的概率密度的积分) 

我给定一个区间,这个区间外的概率我认为是0(这一点不够严谨,理论上应当是从负无穷到正无穷) 

我这里取的是-10:15,其间我取了25000个点,求出这些点的累积概率值(两个的加权和y3),记这个为F(x),根据反变换法, 

F(x)=u,其中u是一个0到1的均匀随机数。只要求出它的解x0,那么x0就满足所给定的概率密度分布。这里我用的是插值。用 

(y3,x)来插值出u所在的位置 


声明,这里有一些地方不够严谨,严谨应当用解析的方法来做反变换。 

%%%%%下面是程序 


M=1000; %产生M行N列的随机数矩阵 

N=1; 

miu1=1;%第一个分布的参数 

sigma1=2;%第一个分布的参数 

miu2=6;%第二个分布的参数 

sigma2=1;%第二个分布的参数 


x=-10:0.001:15; 


y1=normpdf(x,miu1,sigma1); 

y2=normpdf(x,miu2,sigma2); 

y3=0.2*y1+0.8*y2; 


y1=normcdf(x,miu1,sigma1); 

y2=normcdf(x,miu2,sigma2); 

y=0.2*y1+0.8*y2; 

u=rand(N,M); 

R=interp1(y,x,u,'linear'); 


dx=0.5; 

xx=-10:dx:15; 

yy=hist(R,xx); 

yy=yy/M/dx; 

bar(xx,yy) 


hold on; 

plot(x,y3,'r*')


————————————————

版权声明:本文为CSDN博主「tony2278」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/mangobar/article/details/75175237