作者归档:feiguyun

3.4 随机变量的分布函数

概率分布用来描述随机变量(含随机向量)在每一个可能状态的可能性大小。概率分布有不同方式,这取决于随机变量是离散的还是连续的。
对于随机变量X,其概率分布通常记为P(X=x),或X\sim P(x),表示X服从概率分布P(x)。概率分布描述了取单点值的可能性或概率,但在实际应用中,我们并不关心取某一值的概率,如对离散型随机变量,我们可能关心多个值的概率累加,对连续型随机变量来说,关心在某一段或某一区间的概率等。特别是对连续型随机变量,它在某点的概率都是0。因此,我们通常比较关心随机变量落在某一区间的概率,为此,引入分布函数的概念。
定义:设X是一个随机变量,x_k是任意实数值,函数:
F(x_k)=P(X\leq x_k)\tag{3.7}
称为随机变量X的分布函数。
由(3.7)式不难发现,对任意的实数x_1,x_2(x_1<x_2),有:
P(x_1<X\le x_2)=P(X\le x_2)-P(X\le x_1)=F(x_2)-F(x_1)\tag{3.8}
成立。式(3.8)表明,若随机变量X的分布函数已知,那么可以求出X落在任意一区间[x_1,x_2]的概率。
如果将X看成是数轴上的随机点的坐标,那么,分布函数F(x)在x处的函数值就表示X落在区间(-\infty,x)上的概率。
分布函数是一个普通函数,为此,我们可以利用数学分析的方法研究随机变量。

3.4.1 分布函数的性质

设F(x)是随机变量X的分布函数,则F(x)有如下性质:
1、非降性
F(x)是一个不减函数,
对任意x_1<x_2,F(x_2)-F(x_1 )=p(x_1<X) 即:F(x_1 )\le F(x_2 )
2、有界性
\begin{aligned}0\le F(x) &\le1 \\F(-\infty)&=0\\F(\infty)&=1 \end{aligned}
3、F(x+0)=F(x),即分布函数是右连续的。

3.4.2 离散型随机变量的分布函数

设离散型随机变量X的分布律为
p(X=x_i )=p_i, i=1,2,\cdots
由概率的可列可加性得X的分布函数为
F(x)=p(X\le x)=\sum_{x_i\le x}p(X=x_i)
可简写为:
F(x)=\sum_{x_i\le x}p_i

3.4.3 连续型随机变量的分布函数

1、定义
设X为连续型随机变量,其密度函数为f(x),则有:

3.3 连续型随机变量及分布

如果X由全部实数或者由一部分区间组成,如:
X={x| a≤x≤b},其中a<b,它们都为实数。
则称 X为连续随机变量,连续随机变量的取值是不可数及无穷尽的。

3.3.1 连续型随机变量及分布概述

与离散型随机变量不同,连续型随机变量采用概率密度函数来描述变量的概率分布。如果一个函数f(x)是密度函数,满足以下三个性质,我们就称f(x)为概率密度函数。
(1)f(x)\geq 0,注意这里不要求f(x)\leq 1
(2)\int_{-\infty}^{\infty}f(x)dx=1
(3)对于任意实数x_1x_2,且x_1\leq x_2,有:
P(x_1\lt X\leq x_2)=\int_{x_1}^{x_2}f(x)dx \tag{3.3}
第(2)个性质表明,概率密度函数f(x)与x轴形成的区域的面积等于1,第(3)个性质表明,连续随机变量在区间[x_1,x_2]的概率等于密度函数在区间[x_1,x_2]上的积分,也即是与X轴在[x_1,x_2]内形成的区域的面积,如图3-3所示。
图3-3 概率密度函数
对连续型随机变量在任意一点的概率处处为0。
假设有任意小的实数\Delta x,由于\{X=x\}\subset\{x-\Delta x<X\leq x\},由式(4.1)分布函数的定义可得:
0\leq P(X=x)\leq P(x-\Delta x<X\leq x)=F(x)-F(x-\Delta x)\tag{3.4}
\Delta x\rightarrow 0,由夹逼准则,式(3.4)可求得:
 P(X=x)=0 \tag{3.5}
式(3.5)表明,对于连续型随机变量,它在任意一点的取值的概率都为0。因此,在连续型随机变量中,当讨论区间的概率定义时,一般对开区间和闭区间不加区分,即:
P(x_1\leq X\leq x_2)=P(x_1<X\leq x_2)=P(x_1\leq X<x_2)=P(x_1<X<x_2)成立。

3.3.2 均匀分布

若连续型随机变量X具有概率密度

3.3.3 指数分布

若连续型随机变量X的概率密度为
f(x)=\begin{cases}\frac{1}{\theta}e^{\frac{-x}{\theta}},&x>0\\0,&x\leq 0)\end{cases}
其中\theta >0为常数,则称X服从参数为θ的指数分布。

3.3.4 正态分布

若连续型随机变量X的密度函数为:
其中\mu是平均值,\sigma是标准差(何为平均值、标准差后续我们会介绍)。这个连续分布被称之为正态分布,或者高斯分布。其密度函数的曲线呈对称钟形,因此又被称之为钟形曲线,正态分布是一种理想分布,记为X\sim N(\mu,{\sigma}^2)

正态分布如何用Python实现呢?同样,我们可以借助其scipy库中stats来实现,非常方便。

sigmal系统与正态分布如图3-4所示。

图3-4 sigmal系统与正态分布
正态分布的取值可以从负无穷到正无穷。这里我们为便于可视化,只取把X数据定义在[-6,6]之间,用stats.norm.pdf得到正态分布的概率密度函数。另外从图形可以看出,上面两图的均值\mu都是0,只是标准差(\sigma)不同,这就导致图像的离散程度不同,标准差大的更分散,个中原因,我们在介绍随机变量的数字特征时将进一步说明。

3.2离散型随机变量及分布

如果随机变量X的取值是有限的或者是可数无穷尽的值,如:
X={x_1,x_2,x_3,\cdots,x_n}
则称 X为离散随机变量。

3.2.1 离散型随机变量及分布概述

x_1,x_2,x_3,\cdots,x_n是随机变量X的所有可能取值,对每个取值x_i,X = x_i是其样本空间S上的一个事件,为描述随机变量X,还需知道这些事件发生的可能性(概率)。
设离散型随机变量X的所有可能取值为x_i (i=1,2,\cdots,n)
P(X = x_i) = P_i,i= 1,2,\cdots,n
称之为X的概率分布或分布律,也称概率函数。
常用表格形式来表示X的概率分布:

由概率的定义,P_i (i = 1,2,\cdots)必然满足:
(1) P_i\geq 0 i=1,2,\cdots,n
(2) \sum_{i=1}^n p_i =1
例1:某篮球运动员投中篮圈的概率是0.8,求他两次独立投篮投中次数X的概率分布。
解 X可取0,1,2为值,记A_i={第i次投中篮圈},i=1,2,则P(A_1) = P(A_2) = 0.8
由此不难得到下列各情况的概率:
投了两次没一次投中,即:
P(X=0)=P(\overline{A_1 A_2 })=P(\overline{A_1})P(\overline{A_2})=0.2\times 0.2=0.04
投了两次只投中一次,即:
P(X=1)=P(\overline{A_1}A_2\cup A_1 \overline{A_2})=P(\overline{A_1}A_2)+P(A_1 \overline{A_2})=0.2\times 0.8+0.8\times02=0.32
投了两次两次都投中,即:
P(X=2)=P(A_1 A_2)=P(A_1)P(A_2)=0.8\times 0.8=0.64

P(X=0)+P(X=1)+P(X=2)=0.04+0.32+0.64=1
于是随机变量X的概率分布可表示为:

若已知一个离散型随机变量X的概率分布:

则由概率的可列可加性,可得随机变量X的累加值为:
F(x)=P(X\leq x)=\sum_{x_k\leq x}P(X=x_k)\tag{3.2}
例如,设X的概率分布由例1给出,则
F(2)=P(X\leq 2)=P(X=0)+P(X=l)=0.04+0.32=0.36

3.2.2 伯努利分布

伯努利分布又称为二点分布或0-1分布,服从伯努利分布的随机变量X取值为0或1两种情况,且它的分布列为P(X=1)=p,P(X = 0) = l − P其中(0 < P < 1),则称X服从参数为p的伯努利分布,记作X\sim B(1, p)。其概率函数可统一写成:
p(X=x)=p^x (1-p)^{1-x}
其中x\in {0,1}
X服从伯努利分布,记为X\sim B(P)
随机变量X的期望:

\frac{1}{2}时,伯努利分布为离散型平均分布。
伯努利分布在机器学习中经常看到,如逻辑回归模型拟合的就是这种模型。

3.2.3二项分布

二项分布是重要的离散概率分布之一,由瑞士数学家雅各布·伯努利(Jokab Bernoulli)提出。一般用二项分布来计算概率的前提是,每次抽出样品后再放回去,并且只能有两种试验结果,比如黑球或红球,正品或次品等。二项分布指出,假设某样品在随机一次试验出现的概率为p,那么在n次试验中出现k次的概率为:
P(X=k)=\binom{n}{k}p^k{(1-p)}^{n-k}
假设随机变量X满足二项分布,且知道n,p,k等参数,我们如何求出各种情况的概率值呢?方法比较多,这里介绍一种比较简单的方法,利用scipy库的统计接口stats即可,具体如下:

运行后的二项分布图如图3-2所示。

图3-2 二项分布图

3.2.4多项分布

多项分布是伯努利分布的推广,假设随机向量X的取值有k种情况,即可表示为: X=i,i\in {1,2,\cdots,k},则有:
p(X=i)=p_i,i=1,2,\cdots,k
随机变量X有k种情况,在实际使用时,往往把k种情况用度热编码来表示,如X=1,可表示为[1,0,0,\cdots,0],X=2,可表示为[0,1,0,0,\cdots,0]。这里用[y_1,y_2,\cdots,y_k]表示独热编码。
这样多项分布可表示为:
p(X=i)=p_1^{y_1} p_2^{y_2}\cdots p_k^{y_k}=p_1^0 p_2^0\cdots p_i^1\cdots p_k^0=p_i
多项分布在机器学习中应用非常广泛,如softmax回归模拟的就是多项分布,神经网络多分类的模型也是拟合多项分布。

3.2.5泊松(Poisson)分布

若随机变量X所有可能取值为0,1,2,\cdots,它取各个值的概率为:
P(X=k)=\frac{{\lambda}^k}{k!} e^{-\lambda}, (k=0,1,2,\cdots)
这里介绍了离散型随机变量的分布情况,如果X是连续型随机变量,其分布函数通常通过密度函数来描述,具体请看下一节。

第3章 随机变量及其分布

3.1 从随机事件到随机变量

随机试验中,每一个可能的结果,在试验中发生与否,都带有随机性,所以称为随机事件。而所有可能结果构成的全体,称为样本空间。为了更好分析处理这些随机事件,人们就想到了把随机事件数量化,数量化的载体就是随机变量,随机变量一般用大写字母表示,如X,Y,Z,W等,随机变量的取值一般用小写字母表示,如x,y,x_i等,图3-1说明随机事件与随机变量的对应关系示意图。

图3-1 随机事件\Rightarrow数量化\Rightarrow随机变量过程示意图
随机变量(random variable)表示随机试验各种结果的实值单值函数。随机事件不论与数量是否直接有关,都可以数量化,即都能用数量化的方式表达。 例如投掷硬币的正反面,掷骰子的点数,某一时间内公共汽车站等车乘客人数,灯泡的寿命等等,都可用随机变量表示。
例1:将一枚硬币抛掷三次,观察出现正面和方面的情况,样本空间是
\Omega={正正正,正正反,正反正,反正正,正反反,反正反,反反正,反反反}
以X记三次投掷得到正面的总数,那么,对于样本空间Ω中的每一个样本点\omega,如式(3.1)所示,X都有一个数与之对应,X就是把随机事件数量化的随机变量,X与随机事件的关系为:

随机变量的取值随试验的结果而定,而试验的各个结果出现有一定概率,因而随机变量的取值有一定概率,例如,本例中的X取值为2,记成X=2,对应样本点的集合A={正正反,正反正,反正正},这是一个事件,当且仅当A发生时有X=2。我们称概率p(A)=p{正正反,正反正,反正正}为X=2的概率,记为p(X=2)=\frac{3}{8}。类似地有

对于一个随机变量,不仅要说明它能够取什么值,更需要关心取这些值的概率(分布函数),这也是随机变量与一般变量的本质区别。
引入随机变量,就可利用数学分析的方法对随机试验的结果进行分析研究了。

第2章 随机事件与概率

2.1 随机事件

随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫作随机事件(简称事件)。
随机事件通常用大写英文字母A、B、C等表示。随机试验中的每一个可能出现的试验结果称为这个试验的一个样本点,记作\omega_i。全体样本点组成的集合称为这个试验的样本空间,记作\Omega.即\Omega={\omega_1,\omega_2,\cdots,\omega_n,\cdots}。仅含一个样本点的随机事件称为基本事件,某些样本点组成的集合称为随机事件(random event),简称为事件。
整个样本空间\omega_i也是个事件,它一定会发生,称为必然事件。空集\emptyset也是个事件,它不可能发生,称为不可能事件。
例如,投骰子,记整数i表示“投掷结果为i”这个样本点,那么样本空间\Omega={1,2,3,4,5,6},事件A={1,3,5} 表示“投掷的结果为奇数”

2.2 事件与集合

随机事件是用集合定义的,这里我们不区分事件和集合,对事件可以做集合的各种运算。
事件A和B的交集,表示事件A和B同时发生,由事件A与事件B的公共样本点组成记,记为A\cup B或AB,如图2-2(a)所示。
事件A和B的并集,由事件A与事件B所有样本点组成,记为A\cup B或A+B,如图2-2(b)所示。
差事件,即事件A发生且事件B不发生,是由属于事件A但不属于事件B的样本点组成,记作A-B,如图2-2(c)所示。

图2-2 随机事件之间的关系
互斥事件(互不相容事件)事件A与事件B,事件A与事件B不能同时发生,事件A与事件B没有公共的样本点,记为AB=\emptyset
事件A的对立事件,事件A不发生,事件A的对立事件是由不属于事件A的样本点组成,记作\bar A
事件满足如下运算:
在随机事件中,有许多事件,而这些事件之中又有联系,分析事件之间的关系,可以帮助我们更加深刻地认识随机事件;给出的事件的运算及运算规律,有助于我们分析更复杂事件。
(1)交换律
A\cup B=B\cup A,AB=BA
(2)结合律
(A\cup B)\cup C=A\cup (B\cup C),A(BC)=(AB)C
(3)分配律
A\cup(BC)=(A\cup B)(A\cup C) 如图2-3(a)
A(B\cup C)=(AB)\cup(AC) 如图2-3(b)
图2-3 随机事件的分配律
(4)摩根律
\overline{A\cup B}=\overline A\cap\overline B
\overline{A\cap B}=\overline A\cup\overline B
可推广到n个事件。

2.3 随机事件的概率

既然事件可用集合来表示,那么事件的关系和运算自然应当按照集合论中集合之间的关系和集合的运算来处理。接下来给出这些关系和运算在概率论中的提法,并根据“事件发生”的含义,用概率来度量随机事件发生的可能性。
随机事件A的概率记为p(A),表示此事件发生的可能性,其值满足:
0\le p(A)\le 1
概率值越大则事件越可能发生。概率为0意味着这个事件不可能发生(不可能事件),概率为1意味着这个事件必然发生(必然事件)。
一般情况下,假设样本空间Ω为有限集,其中每个样本点发生的概率是相等的(这也是古典概型的重要假设),因此事件A发生的概率是该集合的基本事件数(或简称为基数)与整个样本空间基数的比值:
p(A)=\frac{|A|}{|\Omega|}\tag{2.1}
例2:在掷骰子试验中,看朝上面的点数,则有样本空间为\Omega={1, 2, 3, 4, 5, 6}
求事件A={点数为奇数},B={点数为小于4的奇数},事件C={点数为偶数}的概率、
解:事件A包括的基本样本点为{1,3,5},B事件包括的基本样本点为{1,3},C事件包括的基本样本点为{2,4,6}
所以|A|=3,|B|=2, |C|=3而|\Omega|=6
从而的:
事件A的概率p(A)=\frac{|A|}{|\Omega|}=\frac{3}{6}=\frac{1}{2}
事件B的概率p(B)=\frac{|B|}{|\Omega|}=\frac{2}{6}=\frac{1}{2}
事件C的概率p(C)=\frac{|C|}{|\Omega|}=\frac{3}{6}=\frac{1}{2}
对应集合的交运算就是两个事件同时发生的概率,记为p(A\cap B)或p(A,B),其概率为:
p(A\cap B)=\frac{|A\cap B|}{|\Omega|}
对应集合的并运算就是两个事件至少有一个发生的概率,其概率为:
p(A\cup B)=\frac{|A\cup B|}{|\Omega|}
因为|A\cup B|=|A|+|B|-|A\cap B|
所以

所以

前面介绍的概率均针对有限或无限可数的样本空间,与之相对的还有无限不可数样本空间,这类概率称为几何型概率。几何型概率定义在无限不可数数据集上,根据测度值(如长度、面积、体积等)的定义。事件A发生的概率为A所在区域的测度值与样本空间\Omega测度值的比值,即

几何概型与古典概型类似,也要求样本空间有一种均匀性。
例3:在区间[-1,1]上随机取一个数x,求使cos \frac{\pi x}{2}的值基于0和\frac{1}{2}之间A事件的概率。
解:由图2-4可知,

图2-4 y=cosx函数曲线
满足条件的x需在以下范围即可:

2.4 条件概率

生活中很多事件是有因果关系或前后关系,这节介绍的条件概率就是研究随机事件间的前后依赖关系。条件概率是指事件A在另外一个事件B已经发生条件下发生概率。条件概率表示为:P(A|B),读作“在B发生的条件下A发生的概率”。如果P(B)>0,条件概率可按下列公式计算:
p(A|B)=\frac{P(A,B)}{P(B)}\tag{2.2}
在古典概型中,在已知B发生时,认为B集合中的那些样本点数为|B| ,而其中同时也在A集合中的样本点有|A\cap B|个,故p(A|B)=\frac{|A\cap B|}{|B|}=\frac{|A\cap B|/|\Omega|}{|B|/|\Omega|}=\frac{P(A,B)}{(P(B)}
在几何概型中,条件概率的解释则更为直观,如图2-5所示

题图2-5 条件概率模型
已知B发生时,样本空间中只剩下了B中的那些样本点(图中有色区域),此时A发生的概率就是(A,B)的面积(阴影部分)比上B的面积,即
p(A|B)=\frac{P(A,B)}{P(B)}
例3:投掷一次骰子,该骰子一共有6个面,分别为1,2,3,4,5,6。
问:已知向上的点数是偶数,那么该点数大于4的概率是多少?
解:这是一个条件概率问题,设B={向上的点数为偶数}={2,4,6}、A={点数大于4}={5,6}
根据式(2.2)可得:

2.5 事件的独立性

事件的独立性指的就是互不影响事件,或一个事件的发生不影响另一个事件的发生。利用独立性可以简化概率的计算。
如果p(A|B)=p(A),或p(B|A)=p(B),则称随机事件A和B独立。
如果随机事件A和B独立,根据式(2.3)可得:
p(A,B)=p(A)P(B) (2.5)
对式(2.5)推广到n个随机事件,如果A_1,A_2,\cdots,A_n互相独立,则对所有可能组合
1\leq i\leq j\leq k\leq\cdots\leq n,都有
p(A_i,A_j)=p(A_i )p(A_j)
p(A_i,A_j,A_k )=p(A_i)p(A_j)p(A_k)
\vdots
p(A_i,A_j,\cdots,A_n)=\prod_{i=1}^n p(A_i)
【说明】
(1)互相独立非两两独立,相互独立的条件强于两两独立。
(2)两个随机事件独立与两个随机事件不相容的区别,后者是两个事件不可能同时发生,即p(A,B)=0。

2.6 全概率公式

式(2.6)称为全概率公式,图2-6能更直观说明全概率公式的含义。

图2-6 全概率模型示意图
p(A,B_1 )=p(A|B_1)p(B_1)是图2-6阴影部分的概率,对所有的i求和,就得到A的概率。全概率公式的应用之一,如果事件A的概率很难算,可以试着构造完备事件组,如果每个B_i的概率容易算,并且在B_i发生的条件下p(A|B_i)也容易算,那么就可以通过全概率公式计算出A的概率。
例5:假设有10人抽签,其中有且仅有1个人会中签,每个人依次抽签,则事件A={第2个人中签}的概率是多少?
解:直接求第2人中签的概率不是很好求,此时可以使用全概率公式来简化这个问题,很明显,第2人是否中签,与第1人是否中签有一定关系。考虑第1人的中签情况,问题就简单了,思路也更清晰了。
设B={第1个人中签},则\overline B={第1人没中签},事件B和\overline B构成一个完备事件组。根据全概率公式可得:
p(A)=p(A|B)P(B)+P(A|\overline B)P(\overline B)
p(A|B)=0,P(B)=\frac{1}{10},p(A|\overline B)=\frac{1}{9},P(\overline B)=\frac{9}{10}
代入上式可得:
p(A)=0\times\frac{1}{10}+\frac{1}{9}\times\frac{9}{10}=\frac{1}{10}
用类似的方法可推出:所有人的中签概率都是\frac{1}{10},所以从数学上来说,抽签顺序并不会影响中签概率,大家机会均等。

2.7 贝叶斯定理

贝叶斯定理是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关。在有些关于概率的解释中,贝叶斯定理(贝叶斯公式)能够告知我们如何利用新证据修改已有的看法。这个名称来自于托马斯·贝叶斯。
通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的;然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述。贝叶斯公式的一个用途在于通过已知的三个概率函数推出第四个。
贝叶斯公式为:


在贝叶斯定理中,每项都有约定俗成的名称:
P(B|A)是已知A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率。
P(B)是B的先验概率(或边缘概率)。之所以称为"先验"是因为它不考虑任何A方面的因素。
P(A|B)是已知B发生后A的条件概率,也称为似然(likelihood)函数,也由于得自B的取值而被称作A的后验概率。
P(A)是A的先验概率或边缘概率。
其中P(A)的计算,通常使用全概率公式,设\Omega=B_1+B_2+\cdots(其中B_i,B_j 两两互斥),则
 A=A \cap \Omega = \sum_i A B_i
从而有:
P(A)=\sum_iP(AB_i) =\sum_iP(A|B_i )P(B_i)
对任意B_j,贝叶斯公式又可表示为:
P(B_j|A)=\frac{P(B_j )P(A|B_j)}{\sum_iP(A|B_i )P(B_i)} \tag{2.8}
例6:利用贝叶斯定理进行分类--简单实例
假设某医院早上收了六个门诊病人,如下表

现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上脑震荡的概率有多大?
4、简单入手
根据式(贝叶斯公式)可得:
P(感冒|(打喷嚏,建筑工人))
= P((打喷嚏,建筑工人)|感冒) x P(感冒)
/ P(打喷嚏,建筑工人)

假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了:

P(感冒|(打喷嚏,建筑工人))
= P((打喷嚏|感冒)xP(建筑工人)|感冒) x P(感冒)
/ P(打喷嚏) xP(建筑工人)
由此可得:
P(感冒|(打喷嚏,建筑工人))
= \frac{0.66 \times 0.33 \times 0.5}{0.5 \times 0.33}
= 0.66
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。
这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。

5、Python实现

打印结果
第7个人患感冒的概率0.667
第7个人患过敏的概率0.000
第7个人患脑震荡的概率0.000

2.8 条件独立

前面我们介绍了条件概率和事件的独立性,两者结合可以给出条件独立的概念。给定三个随机事件A,B,C,如果满足:
p(A|B,C)=p(A|C)
则称A和B关于C条件独立。与之等价的一个判断条件是:
p(A,B|C)=p(A|C)p(B|C)
该定义可以推广到n个事件的情况:
p(A_1,A_2,\cdots,A_n|B)=\prod_{i=1}^n p(A_i|B)
A和B关于C条件独立,可记为:A\perp B|C这里垂直符表示独立。条件独立的概念在朴素贝叶斯分类器、概率图模型中经常使用。

第1章 概率统计概述

1.1概率与统计的异同

概率(probabilty)和统计(statistics)看似两个相近的概念,其实研究的问题刚好相反。
概率研究的问题是,已知一个模型和参数,怎么去预测这个模型产生的结果的特性(例如均值、方差、协方差等)。
统计研究的问题则相反。统计是,有一堆数据,要利用这堆数据去预测模型和参数。
总之,概率是已知模型和参数,推数据。统计是已知数据,推模型和参数。
显然,本文解释的最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率(Maximum a posteriori estimation, 简称MAP)都是统计领域的问题。它们都是用来推测参数的方法。

1.2概率论的知识体系

图1-1 概率论的知识体系

1.3概率统计在机器学习中的应用

概率研究对象不是预先知道或确定的事情,而是预先不确定或随机的事件,研究这些不确定或随机事件背后的规律或规则。或许有人会说,这些不确定或随机事件有啥好研究?他们本来就不确定或随机的,飘忽不定、不可捉摸。表面上看似如此,有句话说得好:偶然中有必然,必然中有偶然。就拿我们比较熟悉微积分来说吧,如果单看有限的几步,很多问题都显得杂乱无章,毫无规律可言,而且还很难处理,但是一旦加上一个无穷大(∞)这个“照妖镜”,其背后规律立显,原来难处理的也好处理了。如大数定律、各种分布等带给我们这样的认识。
机器学习、深度学习与概率、信息论有哪些内在关联呢?
(1)被建模系统内在的随机性。例如一个假想的纸牌游戏,在这个游戏中我们假设纸牌被真正混洗成了随机顺序。
(2不完全观测。即使是确定的系统,当我们不能观测到所有驱动系统行为的所有变量或因素时,该系统也会呈现随机性。
(3)不完全建模。假设我们制作了一个机器人,它可以准确观察周围每一个对象的位置。在对这些对象将来的位置进行预测时,如果机器人采用的是离散化的空间,那么离散化的方法将使得机器人无法确定对象们的精确位置:因为每个对象都可能处于它被观测到的离散单元的任何一个角落。也就是说,当不完全建模时,我们不能明确的确定结果,这个时候的不确定,就需要借助概率来处理。
由此看来,概率、信息论很重要,机器学习、深度学习确实很需要它们。后续我们可以看到很多实例,见证概率、信息论在机器学习、深度学习中是如何发挥它们作用的。

第7章带约束的优化问题

带约束条件的最优化问题,约束条件一般分为两种,一种是等式约束;另一种是不等式约束。对于第一种等式约束的优化问题,可以直接利用拉格朗日乘子法去获得最优解;对于不等式约束的优化问题,可以转化为Karush–Kuhn–Tucker conditions(KKT条件)下应用拉格朗日乘数法求解。两种情况都应用拉格朗日乘数法,给出优化问题的必要条件。

7.1 拉格朗日乘数法

拉格朗日乘数法(又称为拉格朗日乘子法),就是求函数f(x_1,x_2,\cdots,x_n)在等式约束函数h(x_1,x_2,\cdots,x_n)=0或不等式约束函数g(x_1,x_2,\cdots,x_n)\le 0的约束条件下的极值的方法。其主要思想是引入一个新的参数λ(即拉格朗日乘子),将约束条件函数与原函数联系到一起,配成与变量数量相等的等式方程,从而求出原函数极值的必要条件。
假设向量x= (x_1,x_2,\cdots,x_n),目标函数为f(x),等式约束函数为h(x),不等式约束函数为g(x)
求等式约束条件下的极值问题:
\underset{\rm x}{min}f(\rm{x})
s.t.h(\rm x)
利用拉格朗日乘数法构造拉格朗日乘子函数:
L(\rm x,u)=f(\rm x)+uh(\rm x) \tag{7.1}
其中参数u称为拉格朗日乘子。利用拉格朗日乘数法把有约束的极值问题,转换为无约束的极值问题。对拉格朗日乘子函数的所有自变量(x及参数u)求导,并令其为0,就可得到函数的候选极值点。
\nabla_{\rm x} L(\rm x,u)=\nabla_{\rm x} f(\rm x)+u\nabla_{\rm x} h(\rm x)=0 \tag{7.2}
 \nabla_u L(\rm x,u)=h(\rm x)=0 \tag{7.3}
由式(7.2)可知,在极值点目标函数的梯度是约束函数梯度的倍数,即这两个梯度是平行的关系,如图7-1所示。如果有多个等式约束函数,目标函数的梯度是约束函数梯度的线性组合。

图7-1 f(x)的等高线与约束函数h(x)等高线在切点的梯度互相平行
【说明】f(x)的梯度是等高线的法向量。以二维空间为例,假设而为函数f(x,y)
根据微分定义:
f(x+\Delta x,y+\Delta y)\approx f(x,y)+\frac{\partial f}{\partial x}\Delta x+\frac{\partial f}{\partial y}\Delta y=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})\left(\begin{matrix}\Delta x\\ \Delta y\end{matrix}\right)
(\Delta x,\Delta y)表示函数f(x)等高线的方向,当\Delta x \longrightarrow 0,\Delta y \longrightarrow 0时,(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})\left(\begin{matrix}\Delta x\\ \Delta y\end{matrix}\right)\longrightarrow 0
即等高线的方向与f(x)的梯度互相垂直。
例1:利用拉格朗日乘数法求如下极值问题
\underset{x,y}{min}(x^2+y^2)
s.t. xy-3=0
(1)构建拉格朗日乘子函数
L(x,y,u)=x^2+y^2+u(xy-3)
对自变量及乘子变量求导,并令其为0,可得如下方程组:
\frac{\partial L}{\partial x}=2x+uy=0
\frac{\partial L}{\partial y}=2y+ux=0
\frac{\partial L}{\partial u}=xy-3=0
解得:
u=-2,x=\sqrt 3,y=\sqrt 3x=-\sqrt 3,y=-\sqrt 3
目标函数(x^2+y^2)的海塞矩阵为:
\left(\begin{matrix}{\frac{\partial^2 f}{\partial x^2}}&{\frac{\partial^2 f}{\partial x{\partial y}}}\\{\frac{\partial^2 f}{\partial y{\partial x}}}&{\frac{\partial^2 f}{\partial y^2}}\end{matrix}\right)=\left(\begin{matrix}{2}&0 \\ {0}&2\end{matrix}\right)
为正定矩阵,故目标函数是凸函数,有极小值。极值点与等高线之间的位置见图7-2所示

图7-2 极值点的位置示意图
实现图72-的python代码:

求不等式约束条件下的极值问题:
前面介绍了等式约束的极值问题,通常面对更多的是不等式条件约束的情况,对这种情况,其取得极值的必要条件为KKT条件(非充分条件,如果优化问题为优化问题,则是充分条件)。
\underset{\rm x}{min}f(\rm{x})
s.t. g(\rm x)\leq 0
利用拉格朗日乘数法构造拉格朗日乘子函数:
L(\rm x,\lambda)=f(\rm x)+\lambda g(\rm x)
其中参数\lambda称为拉格朗日乘子,g(\rm x)\leq 0
对不等式约束,极值点与不等式构成的区域有2种情况,如图7-3所示。
(1)极值点在g(x)<0区域内,如图7-3(a),这就是没有限制条件下的极值点,不等式约束不起作用,可以直接最小化目标函数,求得极值点x^*,由此可得:
\nabla_{x^*} f(x^*)=0,\lambda=0,g(x^* )<0

图7-3  极值点在约束区域的位置

(2)极值点在g(x)=0上,如图7-3(b)所示。 这种情况,约束条件起作用,所以\lambda \neq 0,g(x)=0。这样问题就相当于等式约束问题,由此可得极值点满足: \nablaf(x^* )=-\lambda\nabla g(x^*) 由图7-1可知,梯度\nabla f(x)与梯度\nabla g(x)平行且方向相反,为此需要\lambda > 0,即有:
g(x^* )=0,\lambda > 0
综合以上两种情况,就得到在不等式约束的条件下,获取极值点的必要条件为:
\lambda \geq 0,\lambda g(x^*)=0,g(x^* )\leq 0
这实际上就是KKT条件的核心内容。
接下来简单介绍KKT条件的完整信息。

例2:求下例问题的极值

目标函数为凸函数,解得最小值为:x=y=1
目标函数最优点的位置如图7-4所示。

图7-4 目标函数与约束函数等高线及最优点位置

7.2 KKT条件

KKT条件是求带等式、不等式约束问题极值的一阶必要条件,是拉格朗日乘数法的推广,对于如下的优化问题:

【说明】KKT条件只是取得极值的必要条件,而非充分条件。如果是一个凸优化问题,KKT条件是取得极值的充分必要条件。

第6章改进梯度下降法

优化器在机器学习、深度学习中往往起着举足轻重的作用,同一个模型,因选择不同的优化器,性能有可能相差很大,甚至导致一些模型无法训练。所以,了解各种优化器的基本原理非常必要。本节重点介绍各种优化器或算法的主要原理,及各自的优点或不足。
梯度下降法的最大优点就是沿下降最快的方向迭代。但不足之处也不少。梯度下降法对学习率表敏感,而且迭代过程中始终不变,这是一个可以改进的地方;另外,梯度越到极值点就越小,或在比较平滑的地方梯度也很小,以至于趋近于0,这是可改进的另一个地点。接下来就这些改进进行说明。这些改进涉及一个重要概念指数加权平均,所以,先介绍这个概念的来源及其优点等。

6.1 指数加权平均法

表1常用平均法比较

【说明】

①F_(t-1)表示前期预测值
②F_t表示当前预测值
③x_t当前实际值
④α权重参数

指数加权平均法可参考:
https://zhuanlan.zhihu.com/p/32335746

6.2传统梯度优化的不足

传统梯度更新算法为最常见、最简单的一种参数更新策略。其基本思想是:先设定一个学习率λ,参数沿梯度的反方向移动。假设基于损失函数L(f(x,θ),y),其中θ需更新的参数,梯度为g,则其更新策略的伪代码如下所示:
这种梯度更新算法简洁,当学习率取值恰当时,可以收敛到全面最优点(凸函数)或局部最优点(非凸函数)。
但其不足也很明显,对超参数学习率比较敏感(过小导致收敛速度过慢,过大又越过极值点),如图6-1的右图所示。在比较平坦的区域,因梯度接近于0,易导致提前终止训练,如图6-1的左图所示,要选中一个恰当的学习速率往往要花费不少时间。
图6-1学习速率对梯度的影响
学习率除了敏感,有时还会因其在迭代过程中保持不变,很容易造成算法被卡在鞍点的位置,如图6-2所示。

图6-2算法卡在鞍点示意图
另外,在较平坦的区域,因梯度接近于0,优化算法往往因误判,还未到达极值点,就提前结束迭代,如图6-3所示。

图6-3在较平坦区域,梯度接近于0,优化算法因误判而提前终止迭代
传统梯度优化方面的这些不足,在深度学习中会更加明显。为此,人们自然想到如何克服这些不足的问题。从本小节前文更新策略的伪代码可知,影响优化的主要因素有:
•优化梯度方向
•优化学习率
•参数的初始值
•优化训练数据集的大小
所以很多优化方法大多从这些方面入手,数据集优化方面采用批量随机梯度下降方法,从梯度方向优化方面有动量更新策略;有些从学习率入手,这涉及自适应问题;还有从两方面同时入手等方法,接下来将介绍这些方法。

6.3 动量算法

动量(momentum)是模拟物理里动量的概念,具有物理上惯性的含义,一个物体在运动时具有惯性,把这个思想运用到梯度下降计算中,可以增加算法的收敛速度和稳定性,具体实现如图6-4所示。
图6-4动量算法示意图
由图6-4所示,可知动量算法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成。
含动量的随机梯度下降法,其算法伪代码如下:
其中parameters是模型参数,假设模型为model,则parameters指model. parameters()。
具体使用动量算法时,动量项的计算公式如下:
v_k=\alpha v_{k-1}-\lambda \hat g(\theta_k)\tag{6.1}
其中\lambda为学习率,\alpha为动态因子(一般取值为0.9)。如果按时间展开,则第k次迭代使用了从1到k次迭代的所有负梯度值,且负梯度按动量系数\alpha指数级衰减,相当于使用了移动指数加权平均,具体展开过程如下:
由此可知,当在比较平缓处,但\alpha=0.5,0.9 时,将是分别是梯度下降法的2倍、10倍。
使用动量算法,不但可加速迭代速度,还可能跨过局部最优找到全局最优,如图6-5所示。
图6-5 使用动量算法的潜在优势
每个参数的实际更新差值取决于最近一段时间内梯度的指数加权平均值。
当某个参数在最近一段时间内的梯度方向振幅较大时,其真实的参数更新幅度变小,增加稳定性;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变
大,起到加速作用。
我们以求解函数f(x_1,x_2)=0.05x_1^2+2x_1^2极值为例,使用梯度下降法和动量算法分别进行迭代求解,具体迭代过程如图6-6、图6-7所示(图实现代码请参考本书第5章代码部分)。
图6-6 梯度下降法的迭代轨迹 图6-7 使用动量项的迭代轨迹
从图6-6 可以看出,不使用动量算法的SGD学习速度比较慢,振幅比较大;图6-7 可以看出,使用动量算法的SGD,振幅较小,而且较快到达极值点。
批量随机梯度下降法PyTorch代码实现:

6.4 Nesterov动量算法

既然每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那为什么不先按照历史梯度往前走那么一小步,按照前面一小步位置的“超前梯度”来做梯度合并呢?如此一来,可以先往前走一步,在靠前一点的位置(如图6-8中的C点)看到梯度,然后按照那个位置再来修正这一步的梯度方向,如图6-8所示。

图6-8 Nesterov下降法示意图
这就得到动量算法的一种改进算法,称为NAG(Nesterov Accelerated Gradient)算法,也称Nesterov动量算法。这种预更新方法能防止大幅振荡,不会错过最小值,并对参数更新更加敏感。如图6-9所示。
图6-9 Nesterov加速梯度下降法
NAG下降法的算法伪代码如下:
NAG算法的PyTorch实现如下:

NAG动量法和经典动量法的差别就在B点和C点梯度的不同。动量法,更多关注梯度下降方法的优化,如果能从方向和学习率同时优化,效果或许更理想。事实也确实如此,而且这些优化在深度学习中显得尤为重要。接下来我们介绍几种自适应优化算法,这些算法同时从梯度方向及学习率进行优化,效果非常好。

6.5 AdaGrad算法

传统梯度下降算法对学习率这个超参数非常敏感,难以驾驭;对参数空间的某些方向也没有很好的方法。这些不足在深度学习中,因高维空间、多层神经网络等因素,常会出现平坦、鞍点、悬崖等问题,因此,传统梯度下降法在深度学习中显得力不从心。还好现在已有很多解决这些问题的有效方法。上节介绍的动量算法在一定程度缓解对参数空间某些方向的问题,但需要新增一个参数,而且对学习率的控制还不很理想。为了更好驾驭这个超参数,人们想出来多种自适应优化算法,使用自适应优化算法,学习率不再是一个固定不变值,它会根据不同情况自动调整来适用情况。这些算法使深度学习向前迈出一大步!这节我们将介绍几种自适应优化算法。
AdaGrad算法是通过参数来调整合适的学习率λ,能独立地自动调整模型参数的学习率,对稀疏参数进行大幅更新和对频繁参数进行小幅更新,如图6-10所示。因此,Adagrad方法非常适合处理稀疏数据。AdaGrad算法在某些深度学习模型上效果不错。但还有些不足,可能因其累积梯度平方导致学习率过早或过量的减少所致。
图6-10 AdaGrad 算法迭代过程示意图
AdaGrad算法伪代码如下:
由上面算法的伪代码可知:
•随着迭代时间越长,累积梯度r越大,从而学习速率\frac{\lambda}{\delta+\sqrt{r}}随着时间就减小,在接近 目标值时,不会因为学习速率过大而越过极值点。
•不同参数之间学习速率不同,因此,与前面固定学习速率相比,不容易在鞍点卡住。
•如果梯度累积参数r比较小,则学习速率会比较大,所以参数迭代的步长就会比较大。相反,如果梯度累积参数比较大,则学习速率会比较小,所以迭代的步长会比较小。
AdaGrad算法的PyTorch实现代码:

6.6 RMSProp算法

RMSProp算法修改AdaGrad,为的是在非凸背景下的效果更好,在凸函数可能振幅较大,如图6-11所示。对梯度平方和累计越来越大的问题,RMSProp指数加权的移动平均代替梯度平方和。RMSProp为使用移动平均,引入了一个新的超参数ρ,用来控制移动平均的长度范围。
图6-11 RMSProp迭代过程示意图
RMSProp算法伪代码如下:
RMSProp算法在实践中已被证明是一种有效且实用的深度神经网络优化算法,在深度学习中得到广泛应用。
RMSProp算法PyTorch实现代码如下:

6.7 Adam算法

Adam(Adaptive Moment Estimation,自适应矩估计)算法本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳,如图6-12所示。
图6-12 Adam算法迭代过程示意图
Adam算法是另一种学习速率自适应的深度神经网络方法,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习速率。Adam算法伪代码如下:

Adam算法的PyTorch实现如下。

6.8 Yogi算法

Adam算法综合了动量算法及自适应算法的优点,是深度学习常用的算法,但也存在一些问题:即使在凸环境下,当 r的第二力矩估计值爆炸时,它可能无法收敛。为此可通过改进r和优化参数初始化等方法来解决。 其中通过改进r是一种有效方法,即把r\longleftarrow \rho_2 r +(1-\rho_2) \hat g^2(等价于r\longleftarrow r +(1-\rho_2)(\hat g^2-r)\hat g^2-r改为\hat g^2\odot sgn(\hat g^2-r),这就是Yogi更新。
Yogi算法的PyTorch代码如下:

前文介绍了深度学习的正则化方法,它是深度学习核心之一;优化算法也是深度学习的核心之一。优化算法很多,如随机梯度下降法、自适应优化算法等,那么具体使用时该如何选择呢?
RMSprop、Nesterov、Adadelta和Adam被认为是自适应优化算法,因为它们会自动更新学习率。而使用SGD时,必须手动选择学习率和动量参数,通常会随着时间的推移而降低学习率,下图是这些优化算法之间的关系:
图6-13 改进梯度下降法之间的关系
有时可以考虑综合使用这些优化算法,如采用先用Adam,然后用SGD优化方法,这个想法,实际上由于在训练的早期阶段SGD对参数调整和初始化非常敏感。因此,我们可以通过先使用Adam优化算法进行训练,这将大大节省训练时间,且不必担心初始化和参数调整,一旦用Adam训练获得较好的参数后,我们可以切换到SGD +动量优化,以达到最佳性能。采用这种方法有时能达到很好效果,如图6-14所示,迭代次数超过150后,用SGD效果好于Adam。

图6-14迭代次数与测试误差间的对应关系
注意算法比较:
图6-15 多种改进算法运行效果比较
从图6-15可知,SGD迭代一定次数后,收敛很慢;Momentum要好于SGD,但Adma下降最快,而且性能也最好。

6.9 权重初始化

在机器学习中,如何初始化权重非常重要,如果初始化不当,将直接导致无法收敛。比例如果把权重初始化为0或全为一样的值,多一个多维矩阵,如一个mxn的权重参数w,在误差反向传播时,所以的权重都会进行相同的更新,通过多次迭代后,可能更新为相同的值,这就严重偏离了源数据分布。所以为防止权重均一化,必须随机生成初始值(一般使随机初始化的数据满足正态分布)。
是否我们就一概为把权重参数都随机生成就成了呢?在实际操作时,我们还需要进一步分析,权重参数的正向传播和反向传播过程中,还受激活函数的影响。一般来说,对对称型的激活函数,如果sigmoid、softmax、tanh等,对随机生成的满足正态分布的数据,还需要考虑前一层的网络节点数(假设前一层的网络层输出节点数为n),如下图所示。使正态分布的标准差除以√(n+m) ,以使数据呈现更稳定和更有代表性,这种初始化方法称为Xavier初始化。
图6-16 权重初始化的输入节点、输出节点数
对于非对称的激活函数(如ReLU、Leak-ReLU等),因这些激活函数本身偏置(如ReLU激活函数把小于0的都置为0),为使数据更有广度、还需要对标准差惩罚力度减少一点,一般使参数初始化的范围比原来扩大一倍,这种初始化方法称为Kaiming_He初始化。以下是各种初始化小结:
【说明】其中m、n分别表示权重矩阵W的输入、输出节点数,详细含义请参考上图。
如果对卷积核参数的初始化,PyTorch中缺省采用Kaiming_He初始化中均匀分布。大家可从conv.py源码中找到:
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
偏置的初始化源码为:
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
(1)PyTorch代码实现:
•Xavier初始化:
torch.nn.init.xavier_normal_(tensor, gain=1)
torch.nn.init.xavier_uniform_(tensor, gain=1)
•Kaiming_He初始化:
torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
(2)NumPy实现
np.random.uniform(-r,r)
np.random.randn(n,m)*σ