您的位置:首页 > 编程语言 > MATLAB

Matlab根据样本随机数求概率曲线

2014-04-29 20:13 260 查看
相关Matlab函数:hist, bar, cdfplot, ksdensity

(1) hist函数

n = hist(Y, x)

如果x是一个向量,返回x的长度个以x为中心的,Y的分布情况。

例如:如果x是一个5元素的向量,返回Y在以x为中心的,x长度个范围内数据直方分布。

[n,xout] = hist(...)

返回n和xout,包含有数目频率和间隔位置。可以使用bar(xout, n)来绘制直方图。

(2) bar函数

绘制条形图。bar(X,Y) 将Y矩阵的每一行化成一组条形图,条形图组数为行数;每组条形图数目为X矩阵的列数。

X指定条形图的中心位置,不能有重复的数。

(3) cdfplot函数

格式 cdfplot(X) %作样本X(向量)的累积分布函数图形

[h,stats] = cdfplot(X) %stats表示样本的一些特征

(4) ksdensity函数

如果你得到一堆数,你想知道它们的大致分布,可以使用kedensity函数解决这个问题。命令如下:

[f,xi]=ksdensity(x)

plot(xi,f)

其中,f是估计的密度值,而xi是一个辅助参数,用来决定画出图形的取值区间,简言之,xi大致涵盖了x的取值区间。

看过图形之后,开始对分布有大概的直观印象,然后可以用比如normfit命令来获得相关的参数估值。

示例1: 使用hist估计cdf

hist 是统计数据在指定的区间内分布的个数,这个分布的个数体现的是随机变量的分布状况,如果你的数据量足够多的话,hist 的结果可以用于估算随机变量的 cdf。

dx = 0.001;
Num = 100000;
x = -4:dx:4;
y = randn(Num,1);
[n,xout] = hist(y,x);
cdf = cumsum(n)/Num;
plot(x,cdf,'b-','LineWidth',6); hold on
plot(x,normcdf(x,0,1),'r-','LineWidth',2)
legend('Empirical CDF via hist', 'Analytical CDF via normpdf',4);
axis tight


示例2: 使用hist函数和导数定义估计pdf

随机数据给定的情况下,ksdensity 可以获得对 pdf 的较好的估计,它的算法是基于高斯核函数,估计较为准确。hist 只能粗略的估计 pdf (尽管 hist 估计cdf比较精确),这是因为 hist 估计pdf的办法是先估计 cdf,cdf再求导得到 pdf,数值求导的过程容易引入较大的误差。比如,下面的办法是利用导数的定义来求导。

求导公式为:

<img src="http://latex.codecogs.com/gif.latex?f(x)=\dfrac{dF(x)}{dx}=\lim_{\Delta x\rightarrow 0}\dfrac{F(x+\Delta x)-F(x)}{\Delta x}"/>

dx = 0.001;
Num = 100000;
x = -4:dx:4;
y = randn(Num,1);
[n,xout] = hist(y,x);
pdf = n/Num/dx;    % 导数定义
bar(xout,pdf);hold on
[f,xi] = ksdensity(y);
plot(xi,f,'ro','MarkerSize',8,'LineWidth',2);
plot(x, normpdf(x,0,1),'r-','LineWidth',2);hold off
legend('Empirical PDF via hist','Empirical PDF via ksdensity', 'Analytical PDF via normpdf');
axis tight


示例3:使用hist函数和求导函数gradient估计pdf

dx = 0.001;
Num = 100000;
x = -4:dx:4;
y = randn(Num,1);
[f,xi] = ksdensity(y);
[n,xout] = hist(y,x);
cdf = cumsum(n)/Num;
pdf = gradient(cdf,dx);
bar(xout(1:50:end),pdf(1:50:end));hold on   % 每隔50点抽样,为了更清楚显示pdf
plot(xi,f,'ro','MarkerSize',8,'LineWidth',2);
plot(x, normpdf(x,0,1),'r-','LineWidth',2);hold off
legend('Empirical PDF via hist + gradient', 'Empirical PDF via ksdensity','Analytical PDF via normpdf');
axis tight


参考文献

『http://www.ilovematlab.cn/thread-272344-1-1.html』

『http://www.ilovematlab.cn/thread-272251-1-1.html』
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: