赞
踩
刚好最近做了部分概率密度分布的工作,概率的知识早就还给了高数老师,只好一边复习(约等于学习)概率部分知识,一边扒matlab document。
万物从买买买开始,先推个书。这本数学指南简直太好用了,强烈推荐。手头也有其他版本的,天书一样看不懂。
我假设看到本文的人都跟我一样把知识换给老师,所以我们从头开始吧。
对于一个随机量 X = x1, x2,... xn
经验均值 u = mean(X) = (x1+x2+...xn)/n
经验标准差 (Δx)**2 = std(X) = [(x1-u)**2+(x2-u)**2+...+(xn-u)**2]/(n-1)
以下不好打字,就用百度百科的截图替代了
正态分布 (normal distribution)
Matlab中,用于计算概率和概率密度的相关函数有histcounts(histogram直方图),ksdensity
其中,histcounts与histogram是一类,可以计数,计算概率密度,概率密度函数,累积概率密度函数等,通过‘normalization'来选择。hist系列需要给出直方图的根数(nbin),或者直方图的宽度设置(edge,即每根的左右边界),得到的值与nbin一致,比edge少一个。
ksdensity只用于计算概率密度函数,默认nbin=100,也可给定所需的具体点位pts
为了对比,我把ksdensity给定的点位设置为hist每根的正中心。
hist 还可以给出类似discretize的功能,把一列数分类,并给出bin,其中bin的尺寸与x一致,对应位置是x值在哪一类,可以用ismember把属于同一类的数据挑出来。还可以把bin归类,用summary展示,
- clear;clc;close all
- x = randn(100000,1);
- width = 0.2;
- xi = -4:width:4;
- edge = [xi-0.5*width,xi(end)+0.5*width];% -4-0.5*width:width:4+0.5*width;
- [dens,edge,bin] = histcounts(x,edge,'normalization','pdf');
- [yi,xi]=ksdensity(x,xi);
- figure
- hold on
- histogram(x,edge,'normalization','pdf')
- plot(xi,dens,'o-')
- plot(xi,yi,'*-')
- legend('histogram','histcounts','ksdensity')
-
- id = ismember(bin,1);
- x(id);
- id = ismember(bin,20);
- a = categorical(bin);
- summary(a)
0 4
1 3
2 7
3 13
4 16
5 50
6 92
7 152
8 262
9 488
10 719
11 1145
12 1562
13 2191
14 3038
15 3831
16 5018
17 5920
18 6372
19 7280
20 7712
21 7932
22 7975
23 7457
24 6532
25 5747
26 4847
27 3884
28 3022
29 2211
30 1634
31 1104
32 729
33 444
34 268
35 162
36 88
37 50
38 19
39 14
40 5
41 1
histcounts 根据设置的区间,根据概念来计算pdf,受数据影响,而ksdensity是给出类似理论概率函数,不太受区间设置影响,并给出对应点的pdf。hist获得的pdf图可能会根据直方图每根条带的宽度设置不同而出现较大的差异,但ksdensity不会,他的pdf是基本一致的。
我用另外一组实际数据,分别用0.05 0.1 0.2的bar宽度,就可以看到非常明显的区别。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。