金融决策科学中,零数理统计的应用原理是什么?
- 内容介绍
- 文章标签
- 相关推荐
本文共计7751个文字,预计阅读时间需要32分钟。
相关专题
以下模拟之:
# https://github.com/sijichun/MathStatsCode/blob/master/notebook_python/LLN_CLT.ipynbimport numpy as npfrom numpy import random as nprd True_P=0.5def sampling(N): ## 产生Bernouli样本 x=nprd.rand(N)<True_P return x M=10000 #模拟次数xbar=np.zeros(M) N=np.array([i+1 for i in range(M)]) x=sampling(M)for i in range(M): if i==0: xbar[i]=x[i] else: xbar[i]=(x[i]+xbar[i-1]*i)/(i+1)## 导入matplotlibimport matplotlib.pyplot as plt ## 使图形直接插入到jupyter中%matplotlib inline# 设定图像大小plt.rcParams['figure.figsize'] = (10.0, 8.0) plt.plot(N,xbar,label=r'$ar{x}$',color='pink') ## xbarxtrue=np.ones(M)*True_P plt.plot(N,xtrue,label=r'$0.5$',color='black') ## true xbarplt.xlabel('N') plt.ylabel(r'$ar{x}$') plt.legend(loc='upper right', frameon=True) plt.show() ## 画图
简单来说,大数定律讲的是,样本容量极大时,样本的均值必然趋近于总体的期望。
0.1.2 掷飞镖:均匀随机变量
伯努利随机变量是离散型随机变量的最简单类型。与此相反的随机变量被称为“连续型”随机变量,可在数值范围内取任意值。 最简单的连续型随机变量是均匀随机变量,有时称为 Uniform(a,b), Uniform(a,b)始终在数字 a和 b之间,也同样可能为取值范围内的任意位置。 对于离散随机变量,概率质量函数为每个可能的结果分配一个有限的概率。对于连续随机变量,其输出具体值的概率几乎为0,但其输出在特定区间的概率则大得多。
0.1.3 均匀分布和伪随机数
Uniform(0,1)分布是最基本的概率分布。它是最简单的一个,但也是在数学理论和计算实践中构建更复杂概率分布的基础。例如:
- 如果要模拟 Bernoulli(p)随机变量 B,可以通过模拟 Uniform(0,1)分布中的随机值 u来实现。如果 u<p,则设置 B=正面,否则设置 B=反面。
- 如果要模拟加权掷骰子,将[0.0, 1.0]取值范围分成6个区域,其中第 i个区域的大小与骰子投出第 i面的概率相同。然后再次从 Uniform(0,1)分布中绘制 u值。掷出的骰子即会落入 u的 [0.0, 1.0]区间。
- 如果要模拟指数随机变量,从 Uniform(0,1)中绘制 u,然后取 log(u)的倒数。
但是,技术上讲,用计算机程序模拟随机数是不可行的。它们是确定性的机器,只能遵循预定的规则——没有用于翻转硬币的子程序。一般会用“伪随机数”即某种固定生成算法来实现,比如早期的线性同余法。 当然伪随机数也有优点,可以在一开始就手动设置好部分参数,也被称为“种子/seed”。这样做可以使程序变得更加完全确定,并且可以在下次运行中精确地重现相同的结果。
如:
>>> import random>>> random.random()0.7006269308810754>>> random.random()0.4896124124288257575>>> random.seed(10086)>>> random.random()0.043562757723543566>>> random.random()0.7994528936212764>>> random.seed(10086)>>> random.random()0.043562757723543566
同一种子10086时,输出随机数相同。
0.1.4 非离散型、非连续型随机变量
从数学角度而言,随机变量既不离散也不连续。例如以种植树木的高度为例,在给定的时间点中,其中不发芽的一部分高度为0,这是在该高度下的有限概率质量。而那些发芽树木的高度则为在一定范围内的任意值。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt z = np.zeros(1000) x = np.random.exponential(size=1000) D = pd.Series(data) X = pd.Series(x) (D>0).value_counts().rename({True: ">0", False: "<0"}).plot(kind="pie") X.hist(bins=100)
0.1.5 期望和标准偏差
通常使用大写字母 X表示随机变量,小写字母 x表示变量的特定值。 如果写作 E[X]是指随机变量 X的平均值。这里的 E是指期望值,是均值的另一种形式。
- 不连续随机变量的预期值定义为:
E[X]=∑iipi
- 连续随机变量的预期值定义为:
E[X]=∫xfx(x)dx 通常由 μx表示随机变量 X的期望值,根据期望值定义某个事物的关键例子是方差和标准偏差。 X的方差定义为: var[X]=E[∣X−σx∣2] 标准差是方差的二次方根: σx=var[X] 标准差可以用来粗略衡量X与 μx的距离。
0.1.6 独立概率、边际概率和条件概率
通常需要同时考虑两个随机变量 X和 Y。如果已知一个变量,能以此了解另一个变量吗? 具体来说,假设变量是离散随机变量,令 pxy表示 X=x和 Y=y的概率。 X的边际概率为 Pr[X=x]=px=∑yPxy 如果重视一个随机变量而忽略另一个,那么就是概率分布。 另一方面,由已知的 X值推断 Y的情况,那么就可以在给定的 X=x时,得到每个 y的条件概率: Pr[Y=y∣X=x]=Py∣X=x=∑gpxypxy 条件概率在贝叶斯统计中起着重要的作用。 给定 X=x,通常想知道 Y的期望值,表达如下: E[Y∣X=x] 这些关于 Y的统计值与 X的取值条件相关, X和 Y的相关性定义为: Corr[X,Y]=σxσyE[(X−μx)(Y−μy)] 这是随机变量之间的线性关系的度量,其形式为 Y=mX+b。 如果已知随机变量 X和 Y中的任一个,并不能获取另一个随机变量的相关信息,则 X和 Y是独立随机变量。在数学上意味着: pxy=pxpy
0.1.7 重尾分布
关于概率分布最重要的理解之一就是“重尾”。直观地说,这是指最大值出现的概率。身高就是非重尾的一个很好的例子,因为没有人身高能超过10米。然而净资产是重尾分布,因为偶尔会出现比尔·盖茨。 了解重尾分布很重要,这是因为当事情为重尾分布时,通常用概率分布做的事情都不起作用。 举例,重尾分布的平均值很难估计,如果房间里有100个人,那么这些人的平均净资产可能会有很大的差异,像一个千万富翁就可能极大提高平均净资产。 以下通过帕累托分布中抽取重尾序列,模拟 N次,可见平均值趋涨:
import numpy as npimport matplotlib.pyplot as plt np.random.seed(10) N = 1000sums, means = 0, []for i in range(1, N): sums += np.random.pareto(1) means.append(sums/i) plt.plot(means)
0.1.8 二项分布
二项式( n, p) 的分布是抛硬币 n次得到正面的次数,其中每次抛掷正面的独立概率为 p。 即 n次抛掷硬币得到 k次正面的特定序列概率为 pk(1−p)n−k。 如何在 n次投掷硬币中抛出 k次正面是一个组合问题,确切公式表示为 ⟮kn⟯,即从 n个元素中选择 k个元素 ⟮kn⟯=k!(n−k)!n! 以下模拟之:
import numpy as npimport pandas as pd sample = np.random.binomial(200, 0.3)print(sample) N = 100sample = []for _ in range(N): sample.append(np.random.binomial(1, 0.3)) pd.value_counts(sample)""" 55 0 73 1 27 dtype: int64 """
0.1.9 泊松分布
泊松分布用于模拟可能发生许多事件的系统,并且所有事件都相互独立,但平均而言,只有少数时间会发生。一个很好的例子就是会有多少人在某一天访问一个网站,世界上有数十亿人可以访问这个网址,但平均而言,也许只有几百人会访问这个网站。 日常生活中,大量事件是有固定频率的,如:
它们的特点就是,我们可以预估这些事件的总数,但是没法知道具体的发生时间。已知平均每小时出生3个婴儿,请问下一个小时,会出生几个?有可能一下子出生6个,也有可能一个都不出生。这是我们没法知道的。 泊松分布就是描述某段时间内,事件具体的发生概率。
假设采用二项式( n, p)分布。将 n设置得非常大,将 p设置得足够小,则 np=λ 式中, λ是固定常数。 在使得 n大而 p小同时 λ不变的约束下,二项分布将收敛于泊松分布。概率质量函数由下式给出: pk=e−λk!λk 加入时间维度 t,P(N(t)=n)=e−λtk!(λt)k 已知1小时内出生3个婴儿的概率,就表示为 P(N(1)=3),那么接下来两个小时,一个婴儿都不出生的概率是0.25%,基本不可能发生。因为: P(N(2)=0)=0!(3×2)0e−3×2≈0.0025 接下来一个小时,至少出生两个婴儿的概率是80%:
egin{align} P(N(1)ge2) &= 1-P(N(1)=1)-P(N(1)=0) \ &= 1 - rac{(3 imes1)^1e^{-3 imes1}}{1!} - rac{(3 imes1)^0e^{-3 imes1}}{0!}\ &= 1 - 3e^{-3} - e^{-3} \ &= 1 - 4e^{-3} \ &pprox 0.8009 end{align}
以下模拟之:
import numpy as npimport pandas as pd sample = np.random.poisson(lam=5, size=5)print(sample) N = 100sample = []for _ in range(N): sample.append(np.random.poisson(5)) pd.value_counts(sample)""" [9 4 5 5 4] 4 22 3 15 6 14 5 14 7 9 2 9 10 6 8 6 9 2 1 2 0 1 dtype: int64 """
0.1.A 正态分布
正态分布是非常重要的一种概率分布,也称为高斯分布。它是典型的钟形曲线,其概率密度函数: f(x)=2πσ21e−(x−μ)/2σ2 式中, μ是其平均值, σ是标准偏差。 这种正态分布通常称为 N(μ,σ2)。 正态分布最重要的性质是其概率密度紧密聚集在均值附近,尾巴较小,并且不大可能会出现大量异常值。出于这个原因,简单的用正态分布来拟合数据可能会产生严重问题。通常在进行曲线拟合之前,识别并移除主要异常值是常用方法。
从理论上,正态分布被作为最有名的概率分布,是因为如果有足够多的时间采样并对结果进行平均,许多分布将收敛于正态分布。这适用于二项分布、泊松分布以及任何可能遇到的其他分布。从技术上讲,任何一个分布的平均值和标准偏差都是有限的。 这被归结于“中心极限定理”中:
它是概率论中最重要的一类定理,有广泛的实际应用背景。在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的。中心极限定理就是从数学上证明了这一现象。最早的中心极限定理是讨论重点,伯努利试验中,事件A出现的次数渐近于正态分布的问题。 以下模拟之:
# https://github.com/sijichun/MathStatsCode/blob/master/notebook_python/LLN_CLT.ipynbfrom numpy import random as nprddef sampling(N): ## 产生一组样本,以0.5的概率为z+3,0.5的概率为z-3,其中z~N(0,1) d = nprd.rand(N)<0.5 z = nprd.randn(N) x = np.array([z[i]+3 if d[i] else z[i]-3 for i in range(N)]) return x N = [2,3,4,10,100,1000] # sample sizeM = 2000MEANS = []for n in N: mean_x = np.zeros(M) for i in range(M): x = sampling(n) mean_x[i] = np.mean(x)/np.sqrt(10/n) ## 标准化,因为var(x)=10 MEANS.append(mean_x)## 导入matplotlibimport matplotlib.pyplot as pltimport matplotlib.mlab as mlab## 使图形直接插入到jupyter中%matplotlib inline# 设定图像大小plt.rcParams['figure.figsize'] = (10.0, 8.0) x = sampling(1000) plt.xlabel('x') plt.ylabel('Density') plt.title('Histogram of Mixed Normal') plt.hist(x, bins=30, normed=1) ## histgramplt.show() ## 画图## 均值ax1 = plt.subplot(2,3,1) ax2 = plt.subplot(2,3,2) ax3 = plt.subplot(2,3,3) ax4 = plt.subplot(2,3,4) ax5 = plt.subplot(2,3,5) ax6 = plt.subplot(2,3,6)## normal densityx = np.linspace(-3,3,100) d = [1.0/np.sqrt(2*np.pi)*np.exp(-i**2/2) for i in x]def plot_density(ax,data,N): ax.hist(data, bins=30, normed=1) ## histgram ax.plot(x, d) ax.set_title(r'Histogram of $ar{x}$:N=%d' % N) plot_density(ax1,MEANS[0],N[0]) plot_density(ax2,MEANS[1],N[1]) plot_density(ax3,MEANS[2],N[2]) plot_density(ax4,MEANS[3],N[3]) plot_density(ax5,MEANS[4],N[4]) plot_density(ax6,MEANS[5],N[5]) plt.show() ## 画图
简单来说,中心极限定理讲的是,样本容量极大时,样本均值的抽样分布趋近于正态分布。这和样本所属的总体的分布的类型无关,样本所属总体的分布可以是正态分布,也可以不是。
0.1.B 多元正态分布
如果我们以显著的方式推广上述分布变量到更高维度,如正态分布,正态分布可以定义任意维度d。密度函数类似于一个山丘,它在分布的平均值处达到峰值,并且总体呈现为椭圆形。
应该注意到,椭圆体可以向任意方向伸展,不必沿着某一个轴伸展。
0.1.C 指数分布
指数分布在其模拟某些事件发生的时间或事件之间的时间长度时最有用。比方说,对于进入商店的人,每个时刻人们走进商店的概率是一个较小的固定值,并且每个时刻都是相互独立的。在这种情况下,事件之间的时间量将呈指数分布。 指数分布是事件的时间间隔的概率。
指数分布由其平均值 θ(事件之间的平均时间)进行参数化。有时会使用 λ=1/θ(事件发生的平均速率)对其进行参数化,其概率密度函数:
f(x) = \left \{\begin{array}{rcl}\frac{1}{\theta}e^{-x/\theta} & & {x\ge0}\\0 & & {other}\\\end{array} \right.
指数分布的公式可以从泊松分布推断出来,引用上例, 如果下一个婴儿要间隔时间 t ,就等同于 t 之内没有任何婴儿出生。
egin{align} P(X > t) &= P(N(t)=0) = rac{(lambda t)^0e^{-lambda t}}{0!}\ &= e^{-lambda t} end{align}
反过来,事件在时间 t 之内发生的概率,就是1减去上面的值。 P(X≤t)=1−P(X>t)=1−e−λt 接下来15分钟,会有婴儿出生的概率是52.76%
egin{align} P(X le 0.25 ) &= 1 - e^{-3 imes0.25}\ &pprox 0.5276 end{align}
接下来的15分钟到30分钟,会有婴儿出生的概率是24.92%
egin{align} P(0.25 le X le 0.5) &= P(X le 0.5) - P(X le 0.25)\ &= (1-e^{-3 imes0.5})-(1-e^{-3 imes0.25}) \ &= e^{-0.75} - e^{-1.5} \ &pprox 0.2492 end{align}
以下模拟之:
import numpy as npimport pandas as pd sample = np.random.exponential(10)print(sample) N = 10sample = []for _ in range(N): sample.append(np.random.exponential(1)) pd.value_counts(sample)""" 34.293011008718764 1.426454 1 0.205591 1 0.119978 1 0.404349 1 0.220207 1 0.463974 1 0.495403 1 0.301081 1 2.966221 1 0.009234 1 dtype: int64 """
在很多应用中,指数分布的关键属性是“无记忆”。无论等待事件发生的时间有多久,剩余的等待时间仍然遵循相同的指数分布。一个事件在下一个时刻是否发生,与之前已发生的其他时间无关。 指数分布的无记忆特性通常被认为是重尾分布与非重尾分布的分界线。如果已经等待了一个事件发生的时间为 x,那么期望等待的时间比刚开始的时间长还是短呢?指数随机变量不会有任何结果。相比之下,20岁的人可能倾向于再等20多年,但90岁的人可能不会。因此年龄并不是重尾的。街上随机的一个人不太可能是百万富翁,但是如果碰巧挑选到的人都至少有80万元,那么百万富翁的可能性就大很多。因此,净资产是重尾的。
0.1.D 对数正态分布
重尾分布是对数正态分布,对其理解和模拟很简单。同时,对数正态分布的平均值和标准差都是有限的。对于所有现实世界的现象都是如此。 该分布中有一个明显的峰值,且峰值大于0,峰值的左侧迅速下降,在 x=0时变为0.0,在右边逐渐变窄,会使其有规律地出现大的异常值。对数正态分布最好这样考虑,从正态( μ, σ2)中抽取一个 x值,则 ex是对数正态分布的。 以下模拟之:
import numpy as npimport pandas as pd sample = np.random.lognormal(1, 2)print(sample) N = 10sample = []for _ in range(N): sample.append(np.random.lognormal(1, 2)) pd.value_counts(sample)""" 18.761595456554964 0.232312 1 9.743775 1 18.472365 1 21.047856 1 61.887021 1 13.400393 1 37.689687 1 5.035124124 1 0.026245 1 0.156932 1 dtype: int64 """
0.1.E 熵
熵是一种衡量随机变量“随机性”的方法,概念来自信息论领域。直观地说,公平硬币的随机性要高于99%出现正面的硬币。同样,如果一个正态分布的标准差很小,那么它的概率质量将紧紧地围绕它的平均值分布,且它比更大标准差的分布随机性更差。 如果随机变量 X是离散的,熵即 H[X]=E[Surpise[X]]=−∑xpxln(px) 如果随机变量 X是连续的,熵即 H[X]=−∫f(x)ln(f(x))dx 我们很少直接计算熵,但概念无处不在。
本文共计7751个文字,预计阅读时间需要32分钟。
相关专题
以下模拟之:
# https://github.com/sijichun/MathStatsCode/blob/master/notebook_python/LLN_CLT.ipynbimport numpy as npfrom numpy import random as nprd True_P=0.5def sampling(N): ## 产生Bernouli样本 x=nprd.rand(N)<True_P return x M=10000 #模拟次数xbar=np.zeros(M) N=np.array([i+1 for i in range(M)]) x=sampling(M)for i in range(M): if i==0: xbar[i]=x[i] else: xbar[i]=(x[i]+xbar[i-1]*i)/(i+1)## 导入matplotlibimport matplotlib.pyplot as plt ## 使图形直接插入到jupyter中%matplotlib inline# 设定图像大小plt.rcParams['figure.figsize'] = (10.0, 8.0) plt.plot(N,xbar,label=r'$ar{x}$',color='pink') ## xbarxtrue=np.ones(M)*True_P plt.plot(N,xtrue,label=r'$0.5$',color='black') ## true xbarplt.xlabel('N') plt.ylabel(r'$ar{x}$') plt.legend(loc='upper right', frameon=True) plt.show() ## 画图
简单来说,大数定律讲的是,样本容量极大时,样本的均值必然趋近于总体的期望。
0.1.2 掷飞镖:均匀随机变量
伯努利随机变量是离散型随机变量的最简单类型。与此相反的随机变量被称为“连续型”随机变量,可在数值范围内取任意值。 最简单的连续型随机变量是均匀随机变量,有时称为 Uniform(a,b), Uniform(a,b)始终在数字 a和 b之间,也同样可能为取值范围内的任意位置。 对于离散随机变量,概率质量函数为每个可能的结果分配一个有限的概率。对于连续随机变量,其输出具体值的概率几乎为0,但其输出在特定区间的概率则大得多。
0.1.3 均匀分布和伪随机数
Uniform(0,1)分布是最基本的概率分布。它是最简单的一个,但也是在数学理论和计算实践中构建更复杂概率分布的基础。例如:
- 如果要模拟 Bernoulli(p)随机变量 B,可以通过模拟 Uniform(0,1)分布中的随机值 u来实现。如果 u<p,则设置 B=正面,否则设置 B=反面。
- 如果要模拟加权掷骰子,将[0.0, 1.0]取值范围分成6个区域,其中第 i个区域的大小与骰子投出第 i面的概率相同。然后再次从 Uniform(0,1)分布中绘制 u值。掷出的骰子即会落入 u的 [0.0, 1.0]区间。
- 如果要模拟指数随机变量,从 Uniform(0,1)中绘制 u,然后取 log(u)的倒数。
但是,技术上讲,用计算机程序模拟随机数是不可行的。它们是确定性的机器,只能遵循预定的规则——没有用于翻转硬币的子程序。一般会用“伪随机数”即某种固定生成算法来实现,比如早期的线性同余法。 当然伪随机数也有优点,可以在一开始就手动设置好部分参数,也被称为“种子/seed”。这样做可以使程序变得更加完全确定,并且可以在下次运行中精确地重现相同的结果。
如:
>>> import random>>> random.random()0.7006269308810754>>> random.random()0.4896124124288257575>>> random.seed(10086)>>> random.random()0.043562757723543566>>> random.random()0.7994528936212764>>> random.seed(10086)>>> random.random()0.043562757723543566
同一种子10086时,输出随机数相同。
0.1.4 非离散型、非连续型随机变量
从数学角度而言,随机变量既不离散也不连续。例如以种植树木的高度为例,在给定的时间点中,其中不发芽的一部分高度为0,这是在该高度下的有限概率质量。而那些发芽树木的高度则为在一定范围内的任意值。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt z = np.zeros(1000) x = np.random.exponential(size=1000) D = pd.Series(data) X = pd.Series(x) (D>0).value_counts().rename({True: ">0", False: "<0"}).plot(kind="pie") X.hist(bins=100)
0.1.5 期望和标准偏差
通常使用大写字母 X表示随机变量,小写字母 x表示变量的特定值。 如果写作 E[X]是指随机变量 X的平均值。这里的 E是指期望值,是均值的另一种形式。
- 不连续随机变量的预期值定义为:
E[X]=∑iipi
- 连续随机变量的预期值定义为:
E[X]=∫xfx(x)dx 通常由 μx表示随机变量 X的期望值,根据期望值定义某个事物的关键例子是方差和标准偏差。 X的方差定义为: var[X]=E[∣X−σx∣2] 标准差是方差的二次方根: σx=var[X] 标准差可以用来粗略衡量X与 μx的距离。
0.1.6 独立概率、边际概率和条件概率
通常需要同时考虑两个随机变量 X和 Y。如果已知一个变量,能以此了解另一个变量吗? 具体来说,假设变量是离散随机变量,令 pxy表示 X=x和 Y=y的概率。 X的边际概率为 Pr[X=x]=px=∑yPxy 如果重视一个随机变量而忽略另一个,那么就是概率分布。 另一方面,由已知的 X值推断 Y的情况,那么就可以在给定的 X=x时,得到每个 y的条件概率: Pr[Y=y∣X=x]=Py∣X=x=∑gpxypxy 条件概率在贝叶斯统计中起着重要的作用。 给定 X=x,通常想知道 Y的期望值,表达如下: E[Y∣X=x] 这些关于 Y的统计值与 X的取值条件相关, X和 Y的相关性定义为: Corr[X,Y]=σxσyE[(X−μx)(Y−μy)] 这是随机变量之间的线性关系的度量,其形式为 Y=mX+b。 如果已知随机变量 X和 Y中的任一个,并不能获取另一个随机变量的相关信息,则 X和 Y是独立随机变量。在数学上意味着: pxy=pxpy
0.1.7 重尾分布
关于概率分布最重要的理解之一就是“重尾”。直观地说,这是指最大值出现的概率。身高就是非重尾的一个很好的例子,因为没有人身高能超过10米。然而净资产是重尾分布,因为偶尔会出现比尔·盖茨。 了解重尾分布很重要,这是因为当事情为重尾分布时,通常用概率分布做的事情都不起作用。 举例,重尾分布的平均值很难估计,如果房间里有100个人,那么这些人的平均净资产可能会有很大的差异,像一个千万富翁就可能极大提高平均净资产。 以下通过帕累托分布中抽取重尾序列,模拟 N次,可见平均值趋涨:
import numpy as npimport matplotlib.pyplot as plt np.random.seed(10) N = 1000sums, means = 0, []for i in range(1, N): sums += np.random.pareto(1) means.append(sums/i) plt.plot(means)
0.1.8 二项分布
二项式( n, p) 的分布是抛硬币 n次得到正面的次数,其中每次抛掷正面的独立概率为 p。 即 n次抛掷硬币得到 k次正面的特定序列概率为 pk(1−p)n−k。 如何在 n次投掷硬币中抛出 k次正面是一个组合问题,确切公式表示为 ⟮kn⟯,即从 n个元素中选择 k个元素 ⟮kn⟯=k!(n−k)!n! 以下模拟之:
import numpy as npimport pandas as pd sample = np.random.binomial(200, 0.3)print(sample) N = 100sample = []for _ in range(N): sample.append(np.random.binomial(1, 0.3)) pd.value_counts(sample)""" 55 0 73 1 27 dtype: int64 """
0.1.9 泊松分布
泊松分布用于模拟可能发生许多事件的系统,并且所有事件都相互独立,但平均而言,只有少数时间会发生。一个很好的例子就是会有多少人在某一天访问一个网站,世界上有数十亿人可以访问这个网址,但平均而言,也许只有几百人会访问这个网站。 日常生活中,大量事件是有固定频率的,如:
它们的特点就是,我们可以预估这些事件的总数,但是没法知道具体的发生时间。已知平均每小时出生3个婴儿,请问下一个小时,会出生几个?有可能一下子出生6个,也有可能一个都不出生。这是我们没法知道的。 泊松分布就是描述某段时间内,事件具体的发生概率。
假设采用二项式( n, p)分布。将 n设置得非常大,将 p设置得足够小,则 np=λ 式中, λ是固定常数。 在使得 n大而 p小同时 λ不变的约束下,二项分布将收敛于泊松分布。概率质量函数由下式给出: pk=e−λk!λk 加入时间维度 t,P(N(t)=n)=e−λtk!(λt)k 已知1小时内出生3个婴儿的概率,就表示为 P(N(1)=3),那么接下来两个小时,一个婴儿都不出生的概率是0.25%,基本不可能发生。因为: P(N(2)=0)=0!(3×2)0e−3×2≈0.0025 接下来一个小时,至少出生两个婴儿的概率是80%:
egin{align} P(N(1)ge2) &= 1-P(N(1)=1)-P(N(1)=0) \ &= 1 - rac{(3 imes1)^1e^{-3 imes1}}{1!} - rac{(3 imes1)^0e^{-3 imes1}}{0!}\ &= 1 - 3e^{-3} - e^{-3} \ &= 1 - 4e^{-3} \ &pprox 0.8009 end{align}
以下模拟之:
import numpy as npimport pandas as pd sample = np.random.poisson(lam=5, size=5)print(sample) N = 100sample = []for _ in range(N): sample.append(np.random.poisson(5)) pd.value_counts(sample)""" [9 4 5 5 4] 4 22 3 15 6 14 5 14 7 9 2 9 10 6 8 6 9 2 1 2 0 1 dtype: int64 """
0.1.A 正态分布
正态分布是非常重要的一种概率分布,也称为高斯分布。它是典型的钟形曲线,其概率密度函数: f(x)=2πσ21e−(x−μ)/2σ2 式中, μ是其平均值, σ是标准偏差。 这种正态分布通常称为 N(μ,σ2)。 正态分布最重要的性质是其概率密度紧密聚集在均值附近,尾巴较小,并且不大可能会出现大量异常值。出于这个原因,简单的用正态分布来拟合数据可能会产生严重问题。通常在进行曲线拟合之前,识别并移除主要异常值是常用方法。
从理论上,正态分布被作为最有名的概率分布,是因为如果有足够多的时间采样并对结果进行平均,许多分布将收敛于正态分布。这适用于二项分布、泊松分布以及任何可能遇到的其他分布。从技术上讲,任何一个分布的平均值和标准偏差都是有限的。 这被归结于“中心极限定理”中:
它是概率论中最重要的一类定理,有广泛的实际应用背景。在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的。中心极限定理就是从数学上证明了这一现象。最早的中心极限定理是讨论重点,伯努利试验中,事件A出现的次数渐近于正态分布的问题。 以下模拟之:
# https://github.com/sijichun/MathStatsCode/blob/master/notebook_python/LLN_CLT.ipynbfrom numpy import random as nprddef sampling(N): ## 产生一组样本,以0.5的概率为z+3,0.5的概率为z-3,其中z~N(0,1) d = nprd.rand(N)<0.5 z = nprd.randn(N) x = np.array([z[i]+3 if d[i] else z[i]-3 for i in range(N)]) return x N = [2,3,4,10,100,1000] # sample sizeM = 2000MEANS = []for n in N: mean_x = np.zeros(M) for i in range(M): x = sampling(n) mean_x[i] = np.mean(x)/np.sqrt(10/n) ## 标准化,因为var(x)=10 MEANS.append(mean_x)## 导入matplotlibimport matplotlib.pyplot as pltimport matplotlib.mlab as mlab## 使图形直接插入到jupyter中%matplotlib inline# 设定图像大小plt.rcParams['figure.figsize'] = (10.0, 8.0) x = sampling(1000) plt.xlabel('x') plt.ylabel('Density') plt.title('Histogram of Mixed Normal') plt.hist(x, bins=30, normed=1) ## histgramplt.show() ## 画图## 均值ax1 = plt.subplot(2,3,1) ax2 = plt.subplot(2,3,2) ax3 = plt.subplot(2,3,3) ax4 = plt.subplot(2,3,4) ax5 = plt.subplot(2,3,5) ax6 = plt.subplot(2,3,6)## normal densityx = np.linspace(-3,3,100) d = [1.0/np.sqrt(2*np.pi)*np.exp(-i**2/2) for i in x]def plot_density(ax,data,N): ax.hist(data, bins=30, normed=1) ## histgram ax.plot(x, d) ax.set_title(r'Histogram of $ar{x}$:N=%d' % N) plot_density(ax1,MEANS[0],N[0]) plot_density(ax2,MEANS[1],N[1]) plot_density(ax3,MEANS[2],N[2]) plot_density(ax4,MEANS[3],N[3]) plot_density(ax5,MEANS[4],N[4]) plot_density(ax6,MEANS[5],N[5]) plt.show() ## 画图
简单来说,中心极限定理讲的是,样本容量极大时,样本均值的抽样分布趋近于正态分布。这和样本所属的总体的分布的类型无关,样本所属总体的分布可以是正态分布,也可以不是。
0.1.B 多元正态分布
如果我们以显著的方式推广上述分布变量到更高维度,如正态分布,正态分布可以定义任意维度d。密度函数类似于一个山丘,它在分布的平均值处达到峰值,并且总体呈现为椭圆形。
应该注意到,椭圆体可以向任意方向伸展,不必沿着某一个轴伸展。
0.1.C 指数分布
指数分布在其模拟某些事件发生的时间或事件之间的时间长度时最有用。比方说,对于进入商店的人,每个时刻人们走进商店的概率是一个较小的固定值,并且每个时刻都是相互独立的。在这种情况下,事件之间的时间量将呈指数分布。 指数分布是事件的时间间隔的概率。
指数分布由其平均值 θ(事件之间的平均时间)进行参数化。有时会使用 λ=1/θ(事件发生的平均速率)对其进行参数化,其概率密度函数:
f(x) = \left \{\begin{array}{rcl}\frac{1}{\theta}e^{-x/\theta} & & {x\ge0}\\0 & & {other}\\\end{array} \right.
指数分布的公式可以从泊松分布推断出来,引用上例, 如果下一个婴儿要间隔时间 t ,就等同于 t 之内没有任何婴儿出生。
egin{align} P(X > t) &= P(N(t)=0) = rac{(lambda t)^0e^{-lambda t}}{0!}\ &= e^{-lambda t} end{align}
反过来,事件在时间 t 之内发生的概率,就是1减去上面的值。 P(X≤t)=1−P(X>t)=1−e−λt 接下来15分钟,会有婴儿出生的概率是52.76%
egin{align} P(X le 0.25 ) &= 1 - e^{-3 imes0.25}\ &pprox 0.5276 end{align}
接下来的15分钟到30分钟,会有婴儿出生的概率是24.92%
egin{align} P(0.25 le X le 0.5) &= P(X le 0.5) - P(X le 0.25)\ &= (1-e^{-3 imes0.5})-(1-e^{-3 imes0.25}) \ &= e^{-0.75} - e^{-1.5} \ &pprox 0.2492 end{align}
以下模拟之:
import numpy as npimport pandas as pd sample = np.random.exponential(10)print(sample) N = 10sample = []for _ in range(N): sample.append(np.random.exponential(1)) pd.value_counts(sample)""" 34.293011008718764 1.426454 1 0.205591 1 0.119978 1 0.404349 1 0.220207 1 0.463974 1 0.495403 1 0.301081 1 2.966221 1 0.009234 1 dtype: int64 """
在很多应用中,指数分布的关键属性是“无记忆”。无论等待事件发生的时间有多久,剩余的等待时间仍然遵循相同的指数分布。一个事件在下一个时刻是否发生,与之前已发生的其他时间无关。 指数分布的无记忆特性通常被认为是重尾分布与非重尾分布的分界线。如果已经等待了一个事件发生的时间为 x,那么期望等待的时间比刚开始的时间长还是短呢?指数随机变量不会有任何结果。相比之下,20岁的人可能倾向于再等20多年,但90岁的人可能不会。因此年龄并不是重尾的。街上随机的一个人不太可能是百万富翁,但是如果碰巧挑选到的人都至少有80万元,那么百万富翁的可能性就大很多。因此,净资产是重尾的。
0.1.D 对数正态分布
重尾分布是对数正态分布,对其理解和模拟很简单。同时,对数正态分布的平均值和标准差都是有限的。对于所有现实世界的现象都是如此。 该分布中有一个明显的峰值,且峰值大于0,峰值的左侧迅速下降,在 x=0时变为0.0,在右边逐渐变窄,会使其有规律地出现大的异常值。对数正态分布最好这样考虑,从正态( μ, σ2)中抽取一个 x值,则 ex是对数正态分布的。 以下模拟之:
import numpy as npimport pandas as pd sample = np.random.lognormal(1, 2)print(sample) N = 10sample = []for _ in range(N): sample.append(np.random.lognormal(1, 2)) pd.value_counts(sample)""" 18.761595456554964 0.232312 1 9.743775 1 18.472365 1 21.047856 1 61.887021 1 13.400393 1 37.689687 1 5.035124124 1 0.026245 1 0.156932 1 dtype: int64 """
0.1.E 熵
熵是一种衡量随机变量“随机性”的方法,概念来自信息论领域。直观地说,公平硬币的随机性要高于99%出现正面的硬币。同样,如果一个正态分布的标准差很小,那么它的概率质量将紧紧地围绕它的平均值分布,且它比更大标准差的分布随机性更差。 如果随机变量 X是离散的,熵即 H[X]=E[Surpise[X]]=−∑xpxln(px) 如果随机变量 X是连续的,熵即 H[X]=−∫f(x)ln(f(x))dx 我们很少直接计算熵,但概念无处不在。

