Matlab生成任意分布数据实例演示
在实际是工作中经常会遇到类似概率分布的问题。概率问题经常会涉及到随机数分布问题,过冷水就遇到了如何生成满足如下分布数据的问题。
数据范围在2~20之间,但是生成的数据要满足如图所示的概率密度泛函,在一般问题中我们经常遇到的生成平均数据使用rand()函数就可以生成0~1区间的随机数据然后对数据进行处理就可以得到满足任意区间的数据,生成满足正态分布的随机也有现成函数randn() 函数可调用,如图所示的问题 how do?,本期过冷水就详细的给大家讲一讲如何Matlab生成满足任意概率密度的分布函。
均匀分布
matlab的rand指令可以帮助我们生成0-1均匀分布的数据,这样,如果我们想要[a,b]的分布数据,只需要a (b-a)*rand就可以。需要注意的是rand函数有其内置的平均值和标准差
A=rand(1000000,1); muA=mean(A) sigmaA = std(A) muA = 0.5000 sigmaA = 0.2887
如果想要生成指定均值和方差的随机数该如何实现?其实在已知均匀分布的期望和方差条件下是可以反求均匀分布的区间的。均匀分布的期望和方差和随机数区间存在以下关系
如果想生成均值E=0;S=1的随机数,可以利用上述公式反推出;
B=2*sqrt(3)*rand(10000000,1)-sqrt(3); muB=mean(B) sigmaB = std(B) muB = 3.8898e-04 sigmaB = 1.0000
均值和方差满足预期,掌握了均匀分数数据生成后,可以做生成在约束条件的下均匀分布,在二维空间绘制半径为r的圆内均匀分布数据点
angle=rand(1,1000)*2*pi; %(0,2*pi)之间均匀分布数据点 r=sqrt(rand(1,1000));%(0,1)之间r^2均匀分布数据点 x=r.*cos(angle); y=r.*sin(angle); figure1 = figure; colormap(gray); axes1 = axes('Parent',figure1,'units','normalized','position',[0 0 1 1]); uistack(axes1,'down') image(blackboard,'Parent',axes1,'CDataMapping','scaled') set(axes1,'handlevisibility','off','visible','off'); axes2 = axes('Parent',figure1); hold(axes2,'on'); plot(x,y,'MarkerFaceColor',[1 0 0],'Marker','o','LineStyle','none','Color',[1 0 0]); box(axes2,'on'); axis(axes2,'equal'); axis(axes2,'off'); hold(axes2,'off'); set(axes2,'FontName','Times New Roman','FontSize',12,'FontWeight','bold','LineWidth',3,'Color','none'); set(axes2,'Color','none','LineWidth',6,'TickLength',[0.01 0.005],'XColor',[1 0 1],'YColor',[1 0 1],'ZColor',[1 0 1]);
同理可绘制半径为r的三维球内均匀分布数据点
angle1=rand(1,1000)*2*pi; angle2=acos(rand(1,1000)*2-1); r=power(rand(1,1000),1/3); x=r.*cos(angle1).*sin(angle2); y=r.*sin(angle1).*sin(angle2); z=r.*cos(angle2); figure1 = figure; colormap(gray); axes1 = axes('Parent',figure1,'units','normalized','position',[0 0 1 1]); uistack(axes1,'down') image(blackboard,'Parent',axes1,'CDataMapping','scaled') set(axes1,'handlevisibility','off','visible','off'); axes2 = axes('Parent',figure1); hold(axes2,'on'); plot3(x,y,z,'MarkerFaceColor',[1 0 0],'Marker','o','LineStyle','none','Color',[1 0 0]); view( axes2,[15 30]) box(axes2,'on'); axis(axes2,'square'); hold(axes2,'off'); box(axes2,'on') set(axes2,'Color','none','LineWidth',6,'TickLength',[0.01 0.005],'XColor',[1 0 1],'YColor',[1 0 1],'ZColor',[1 0 1]);
Interesting! 在指定范围生成数据是非常实用的技能,其实如果能够构造出合适的约束条件,图形将会更加多样化。
正态分布
上述案例是给出了约束条件下的均匀分布,那么如何给出在约束条件下的非均匀分布?正态分布是非均匀分布中具有代表性的案例,正态分布实际可以直接调用randn()函数,为了比较清楚看正态分布生成随机数的特点,以二维圆为案例来看一下正态分布数据。
angle=rand(1,1000)*2*pi; %(0,2*pi)之间均匀分布数据点 r=sqrt(normrnd(0.3,0.13,[1,1000]));%(0,1)之间r^2均匀分布数据点 x=r.*cos(angle); y=r.*sin(angle); figure1 = figure; axes1 = axes('Parent',figure1); hold(axes1,'on'); plot(x,y,'MarkerFaceColor',[1 0 0],'Marker','o','LineStyle','none','Color',[1 0 0]); box(axes1,'on'); axis(axes1,'square'); hold(axes1,'off'); set(axes1,'FontName','Times New Roman','FontSize',12,'FontWeight','bold','LineWidth',3);
从图像上我们生成了一圆层厚度不一致的随机数,已经实现了满足约束条件下的非随机分布只要在往前轴一步看如何生成特地的非随机分布
任意随机分布数据生成
可以采用Monte Carlo 方法采用随机约束的方法来生成随机数。
1:选定生成数据范围[a,b],并在此范围生成服从均匀分布数据xi;
2:生成服从均匀分布的数据y.y的取值范围为概率密度分布范围;
3:若y < f ( x )保留x,否则舍去。保留的x即为生成的数据,否则舍去。这一步就是对利用Y值对x进行甄选
实践代码
fun=@(x)(0.2089.*exp(-((x-9.985)./0.7535).^2) 0.*exp(-((x 1.593)./0.0846).^2) 0.1223.*exp(-((x-3.874)./0.585).^2) -0.1669.*exp(-((x 0.1669)./0.6609).^2)-0.02173.*exp(-((x-9.238)./0.5248).^2) -0.09805.*exp(-((x-8.219)./0.9768).^2) 0.1764.*exp(-((x-7.735)./1.995).^2) 0.07335.*exp(-((x-11.83)./2.733).^2)) xmin=2.6;xmax=20; num=2000; %数据数量 n=1;data1=zeros(1,num); while n<num 1 x = (xmax-xmin)*rand(1) 2.6; f=fun(x); Y = 0.14*rand(1); if Y<=f data1(1,n)=x; n=n 1; end end figure subplot(2,1,1); stem(data1,'filled');title('生成结果') subplot(2,1,2);hist(data1,100); hold on x=2.6:0.01:25; plot(x,fun(x)*200,'r','LineWidth',2);xlabel('x');title('自定义分布')
根据上文思路写出的代码生成数据基本满足一开始的分布特征,这样就实现了自定义分布数据。可以利用自定义函数生成数据点特殊的分布函数,我们给出如下分布特征的密度函数
x=linspace(0,1,100); y =(2*x/0.3).*exp(-4*x/0.5); figure plot(x,y) figure1 = figure; axes1 = axes('Parent',figure1); hold(axes1,'on'); plot(x,y,'LineWidth',3); ylabel('ρ(x)'); xlabel('x'); box(axes1,'on'); hold(axes1,'off'); set(axes1,'FontName','Times New Roman','FontSize',12,'FontWeight','bold','LineWidth',3);
将这样的一个分布应用在二维圆的绘制上
fun=@(x)(2*x/0.3).*exp(-4*x/0.5); xmin=0;xmax=1; num=2000; %数据数量 n=1;data1=zeros(1,num); while n<num 1 x =(xmax-xmin)*rand(1) xmin; f=fun(x); Y = 0.3*rand(1); if Y<=f data1(1,n)=x; n=n 1; end end angle=rand(1,2000)*2*pi;; %(0,2*pi)之间均匀分布数据点 r=data1;%(0,1)之间r^2均匀分布数据点 x=r.*cos(angle); y=r.*sin(angle); figure1 = figure; axes1 = axes('Parent',figure1); hold(axes1,'on'); plot(x,y,'MarkerFaceColor',[1 0 0],'MarkerSize',3,'Marker','o','LineStyle','none','Color',[1 0 0]); box(axes1,'on'); axis(axes1,'square'); hold(axes1,'off'); set(axes1,'FontName','Times New Roman','FontSize',12,'FontWeight','bold','LineWidth',3);
我们得到和正态分布约束条件下的图像有相反的分布趋势,中间数据密集靠近外环的数据点较少,这样的一种分布在实际情况中就是有点像密度的非均匀变化,我们我们将生成的数据赋予其物理意义,就成功的将统计统计上的非均匀分布实实在在用在表述物质性质变化上了。很有实际意义。有需要的读者可自主尝试应用,本期过冷水就给大家分享上述内容。