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

相关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』

时间: 2024-10-07 06:29:25

Matlab根据样本随机数求概率曲线的相关文章

[MATLAB] 利用遗传算法函数求目标函数的最优解

最近接触到了遗传算法以及利用遗传算法求最优解,所以就把这些相关的内容整理记录一下. 一.遗传算法简介(摘自维基百科) 遗传算法(英语:genetic algorithm (GA))是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等. 算法 选择初始生命种群 循环 评价种群中的个体适应度 以比例原则(分数高的挑中概率也较高)选择产生下一个种群. 改变该种群(交叉和变异) 直到停止循环的条件满足

matlab 全部的随机数函数

matlab 全部的随机数函数 (一)Matlab内部函数 a. 基本随机数 Matlab中有两个最基本生成随机数的函数. 1.rand() 生成(0,1)区间上均匀分布的随机变量.基本语法: rand([M,N,P ...]) 生成排列成M*N*P... 多维向量的随机数.如果只写M,则生成M*M矩阵:如果参数为[M,N]可以省略掉方括号.一些例子: rand(5,1) %生成5个随机数排列的列向量,一般用这种格式 rand(5) %生成5行5列的随机数矩阵 rand([5,4]) %生成一个

matlab练习程序(求n线段交点)

很简单的算法,这里是把每对线段都进行比较了. 还有一种似乎先通过x和y排序再进行交点判断的,不过那种方法我还没看太明白. 这里的方法如下: 1.根据线段的端点求两条直线的交点. 2.判断直线的交点是否在两条线段上. 结果如下: matlab代码如下: clear all;close all;clc; n=20; p=rand(n,4); %(x1,y1,x2,y2)线段两端点 for i=1:n pbar=p(i,:); pbar=reshape(pbar,[2,2]); line(pbar(1

matlab 全部的随机数函数之内部函数

a. 基本随机数 Matlab中有两个最基本生成随机数的函数. 1.rand() 生成(0,1)区间上均匀分布的随机变量.基本语法: rand([M,N,P ...]) 生成排列成M*N*P... 多维向量的随机数.如果只写M,则生成M*M矩阵:如果参数为[M,N]可以省略掉方括号.一些例子: rand(5,1) %生成5个随机数排列的列向量,一般用这种格式 rand(5) %生成5行5列的随机数矩阵 rand([5,4]) %生成一个5行4列的随机数矩阵 生成的随机数大致的分布. x=rand

matlab练习程序(求向量间的旋转矩阵与四元数)

问题是这样,如果我们知道两个向量v1和v2,计算从v1转到v2的旋转矩阵和四元数,由于旋转矩阵和四元数可以互转,所以我们先计算四元数. 我们可以认为v1绕着向量u旋转θ?角度到v2,u垂直于v1-v2平面. 四元数q可以表示为cos(θ/2)?+sin(θ/2)?u,即:q0?=cos(θ/2)?,q1?=sin(θ/2)?u.x,q2=sin(θ/2)?u.y,q3=sin(θ/2)?u.z 所以我们求出u和θ/2即可,u等于v1与v2的叉积,不要忘了单位化:θ/2用向量夹角公式就能求. ma

matlab练习程序(求灰度图像最大灰度,最小灰度,平均灰度)

转自 http://www.cnblogs.com/tiandsp/archive/2012/01/07/2316006.html  感谢Dsp tian clearclc;img = imread('124.jpg');     % Read image from graphics file [m n t] = size(img);            % 获取图型大小   max = 0;min = 256;avg = 0;for i =1:1:m    for j = 1:1:n    

MATLAB - 练习程序,求灰度图像均值、最大、最小数值

clear all; close all; clc img=imread('lena.bmp'); figure; imshow(uint8(img)); [m n]=size(img); img_max=0; img_min=256; img_avg=0; for i=1:1:m for j=1:1:n if img(i, j)<img_min img_min=img(i,j); end if img(i, j)>img_max img_max=img(i,j); end img_avg=i

利用随机数 求两数相减不退位

static void Main(string[] args)        {            while (true)            { int a, b, c,m,n;                Random r = new Random();  //主要的就是三位数的百分位最大不会同时取到四位数的百分位,也就是说c永远小于b;                a = r.Next(1,10);                b=r.Next(2, 10);        

使用python已知平均数求随机数

问题描述:产生40个数,范围是363-429之间,平均值为402 思路: 1 产生一个随机数 2 使用平均数求和随机数求出第二个数,生成20组 3 将排序打乱 # -*- coding: cp936 -*- import random import string ###################产生随机整数################### ###################第一个数随机产生,第二个使用平均数求出################### #count 数字的个数 #a