概率论的很多内容都在之前的笔记中详细介绍了,这里我们只给出一些需要经常用到的知识点,以及需要特别注意加深认识的部分。
Sample Spaces
样本空间记为 \(\Omega\) ,其中包含了样本 \(\omega\) ,每一个事件就是样本点的集合。事件发生的概率 probability \(\Pr(A)\) 满足性质:
- 非负性: \(P(A)\ge 0\)
- 规范性: \(P(\Omega) = 1\)
- 可列可加性:若 \(A_1,A_2,\cdots,A_n\) 两两互不相容,即 \(A_i\cap A_j=\empty\) ,则
样本空间当然可以是连续的,同时满足上面的性质。
随机变量 random variable \(X\) 是非常重要的概念,它是一个可测函数 \(X:\Lambda\to\Omega\) ,它将一个样本空间映到另一个样本空间。一般是映到 \(\Omega\sub\mathbb{R}\) ,为一个实数空间的子空间。我们不过多讨论可测函数的性质,如果有时间的话,会在实变函数或泛函分析的笔记中讨论。
古典概型中经常会见到用几何图形来说明概率关系的方法,同样的,样本空间既然是空间,自然也具有一定的几何特性。考虑两个随机变量构成的联合样本空间 joint sample space ,我们可以用平面点集来刻画事件。例如
这样一来,就可以用集合的交、并等关系来计算概率。
Conditional Probability and Independence
考虑两个事件 \(A,B\) ,我们定义 \(B\) 给定时 \(A\) 的条件概率 conditional probability 为 \(\Pr(A|B)\) ,之前已经介绍过
方便起见,像之前一样将 \(\Pr(A\cap B)\) 简写为 \(\Pr(AB)\) 。
称事件 \(A,B\) 独立 independent 当且仅当
等价的关于 \(B\) 的公式也是类似的,也可以写成
也就是说它们互相不影响。对于两个随机变量 \(X,Y\) ,如果任何两个它们的事件都有这样的关系,则称它们独立。
Density Functions
在离散的情况下,我们可以定义随机变量在某一点的概率为 \(\Pr(X=k)\) ,但是对于连续随机变量就会出现概率为 \(0\) 的问题。接下来就要讨论连续随机变量的概率密度函数 probability density functions (pdfs) 和累积密度函数 cumulative density functions (cdfs) ,它们是将求和关系变为积分后得到的。
考虑连续样本空间 \(\Omega\) 和随机变量 \(X\) ,概率密度函数记为 \(f_X\) ,它由事件 \(A\sub\Omega\) 来定义
即它在 \(A\) 上的积分是 \(A\) 的概率。一般情况下 \(f_X(\omega)\neq \Pr(X=\omega)\) ,这是由连续变量在单点为 \(0\) 导致的。
我们将 \(f_X\) 解释为似然函数 likelihood function ,它的值没有单位,但是可以与其它 \(\omega\) 处 \(f_X\) 的值比较可能性。
然后我们定义累积密度函数 \(F_X(t)\) ,它实际上就是分布函数,定义为
可以看出,如果 \(F_X\) 可导,那么就可以定义 \(f_X\) 为它关于 \(\omega\) 的导数。
Expected Value
期望值我们已经非常熟悉,对于离散随机变量,它是每一样本概率和样本值乘积的和
对于连续随机变量,就是积分形式
期望值具有线性性质
这意味着随机变量的线性组合总是可以拆开计算。
Variance
方差刻画了随机变量离开期望值的程度,定义为
上面右式是根据定义直接得到的,根据期望的线性性质就有
注意到方差的量纲与随机变量和期望不同,所以有时会讨论标准差 standard deviation \(\sigma_X=\sqrt{Var[X]}\) 。
Joint, Marginal, and Conditional Distributions
考虑两个随机变量 \(X,Y\) 它们的联合密度函数 joint pdf 有形式 \(f_{X,Y}:\Omega_X\times\Omega_Y\to[0,\infty]\) ,对于离散随机变量
边际密度函数 marginal pdf 定义为
就是固定一个随机变量,然后对另一个随机变量密度求和。
在连续情形下,一般会先定义分布函数
边际分布为
当分布函数可微,就可以定义密度函数
边际密度就是
称 \(X,Y\) 独立若 \(f_{X,Y}(x,y)=f_X(x)f_Y(y)\) 恒成立。
最后介绍给定 \(Y=y\) 下 \(X\) 的条件分布 conditional distribution 为
它是密度函数的商,自身也是密度函数。
Bayes\' Rule
贝叶斯法则是建立似然函数的关键,在这里起到至关重要的作用。给定事件 \(M,D\) ,贝叶斯法则说明
这实际上是条件概率的直接推论,不再赘述。我们更关注其本身的含义: \(D\) 给定时 \(M\) 的概率和 \(M\) 给定时 \(D\) 的概率。
为了加深理解,我们举一个例子:假设你购买了一辆汽车,你发现雨刮器坏了,此事件记为 \(W\) ;你知道汽车可能来自 \(A,B,C\) 三个工厂之一,并且有如下数据:你得知附近的汽车中来自各个工厂的概率分别为 \(\Pr(A),\Pr(B),\Pr(C)\) 。那么应该如何判断汽车最有可能来自哪家工厂呢?
显然,我们不能仅仅根据 \(\Pr(A),\Pr(B),\Pr(C)\) 来判断,因为不同工厂出现问题 \(W\) 的可能性不同。你调查得知,这几家工厂出现 \(W\) 事件的概率为
我们需要知道的实际上是 “已知 \(W\) 时它来自哪家工厂” ,因此应该计算
注意到 \(\Pr(W)\) 是公共因子,因此可以忽略,只要比较上面乘积的大小关系就可以了。
Model Given Data
在数据分析中,上面的 \(M\) 表示模型 model 而 \(D\) 表示数据 data ,那么 \(\Pr(M|D)\) 为得到数据集 \(D\) 后,认为它符合模型 \(M\) 的概率。一个最大后验估计 maximum a posteriori (MAP) 是使得 \(\Pr(M|D)\) 最大的模型 \(M\in\Omega_M\) 。也就是说它实际上是在给定 \(D\) 后,最有可能符合 \(D\) 的模型。类似于之前的方法,计算
由于 \(\Pr(D)\) 已经给定,并且一般认为不同的模型是等可能的,于是就只需要
它称为模型 \(M\) 的似然 likelihood ,只需要使 \(L(M)\) 达到最大。
那么什么是模型和数据呢?一般来说,模型通常是生成数据的简单方法。有如下几种:
- 模型 \(M\) 是 \(\mathbb{R}^d\) 中的点,而数据是 \(\mathbb{R}^d\) 中的点集,并且分布在 \(M\) 附近
- 线性回归 linear regression :模型 \(M\) 是 \(\mathbb{R}^2\) 中的线,数据是围绕在线 \(M\) 附近的点集
- 聚类 clustering :模型 \(M\) 是 \(\mathbb{R}^d\) 中的小点集,数据是 \(\mathbb{R}^d\) 中的大点集,并且分布在 \(M\) 附近
- 线性分类 linear classification :模型 \(M\) 是 \(\mathbb{R}^d\) 中的半空间,数据是标签点(标签为 \(+\) 或 \(-\) ),从而带有 \(+\) 的点大多在 \(M\) 中,而带有 \(-\) 的点大多不在 \(M\) 中
Log-likelihoods
计算似然的重要技巧是取后验的对数,因为对数单调递增,那么
并且能够将乘积关系转化为求和
这样就可以较为容易地操作。
同时,对数的底对于最大后验估计 MAP 没有影响,因为
它们是常数倍数关系,这对最大似然估计 maximum likelihood estimate (MLE) 也是相同的。
Gaussian MLE
假设数据集 \(D=\{x_1,\cdots,x_n\},\ x_i\in\mathbb{R}\) ,模型空间为 \(\Omega_M\) ,每一个 \(\mathbb{R}\) 中的点 \(M\) 都是一个模型。如果假设每一个数据点都会受到相互独立的高斯噪声 Gaussian noise ,也就是说每个点会围绕模型 \(M\) 波动,则 pdf 为
它是一个以 \(M\) 为期望, \(\sigma\) 为标准差的正态分布。于是
其中 \(\Pr(D|M)\) 就是每一数据点处概率的乘积,因为 \(D|M\) 表示 \(D\) 中元素分布在给定 \(M\) 附近,也就是要求每一元素都在 \(M\) 附近,它们的概率需要相乘,并且密度 \(g(x)\) 就是该点的概率(离散情形)。
应用对数就得到
我们要求极大似然,因此常数项可以忽略,就需要求和项最小。这是一个最小二乘问题,此时就有
也就是当 \(M\) 是 \(D\) 的期望时,达到最大估计。
Bayesian Inference
贝叶斯推断依赖贝叶斯法则的简单形式:
符号 \(\varpropto\) 表示成比例 proportional to ,也就是两端是常数倍数关系。
但是,为了推广至连续随机变量,就需要用 pdfs 替换
给定一个固定的 \(M\) ,有可能计算似然 \(f(D|M)\) ;为了计算 \(p(M|D)\) ,就还需要通过 \(D\) 估计可能的模型 \(M\) 的概率。
Average Height
假设估计大学生的身高 \(H\) ,构建随机身高数据集 \(D=\{x_1,\cdots,x_n\}\) 。测量可能有误差,并且这只是部分数据,因此这些数据不一定可靠。我们考虑先验 \(\pi(M)\) ,我们查阅资料,得知成年人的期望身高 \(E_h\) 和标准差 \(\sigma\) ,于是假设
其中用 \(\mu_M\) 表示模型点,估计概率满足在期望 \(E_h\) 附近的正态分布。
之前的例子中计算的结果有
其中 \(\mu_M\) 仍然为模型点,而 \(\sigma_1\) 是假定的噪声。根据
两边取对数得到
其中 \(C\) 为常数,这样我们需要找到 \(\mu_M\) 来让右边两项最大。
这里两项分别代表数据集和先验数据。在不改变结果的情况下,同乘 \(2\sigma^2\) 得到
也就是说,数据集和先验数据哪个更加重要取决于 \(\sigma/\sigma_1\) ,在先验标准差 \(\sigma\) 不变时,测量噪声 \(\sigma_1\) 越小,测量数据越多,数据集越有参考价值;这也符合我们的一般认知。
Weigthed Average
给定 \(x_1,\cdots,x_n\) 以及对应的权 weights \(w_1,\cdots,w_n\) ,则加权平均 weighted average 定义为
总的权 \(W = \sum_{i=1}^nw_i\) 一般会定为 \(1\) ,从而与平均值 \(\sum_{i=1}^n\frac{1}{n}=1\) 保持一致。
Naive Bayes Classifier
朴素贝叶斯分类器计算一个样本属于某一类的概率(后验概率),进而比较概率大小来决定样本的分类结果。分类器需要数据集作为已知样本集,还需要这些样本的分类结果,最后对新给出的样本集进行分类。
具体来说,假设已经得到样本集 \(D=\{x_1,\cdots,x_n\}\) ,每一个 \(x_i\) 都有 \(k\) 个特征,分别记为 \(a_i\) , 可能类别为 \(Y=\{y_1,\cdots,y_m\}\) ,根据每个 \(x_i\) 的特征,它会被分类到某一个 \(y_j\) 类中。
现在我们已经知道 \(D\) 分类的结果,分类器需要根据已经有的这些信息对新的样本 \(x=(a_1,\cdots,a_k)\) 进行分类。换句话说, \(y_j\) 就是一些模型,我们需要根据现有分类数据判断 \(x\) 最有可能符合哪一个模型。
Discrete Classifier
需要计算已知 \(x\) 时分类到 \(y_j\) 的概率 \(\Pr(y_j|x)\) ,然后比较其中最大的概率,选择对应的 \(y_j\) 作为分类结果。根据贝叶斯公式
与先前类似,其中 \(\Pr(x)\) 可以忽略,我们用 \(D\) 中分类到 \(y_j\) 的元素占 \(D\) 所有元素的比例来估计 \(y_j\) 出现的概率 \(\Pr(y_j)\) 。
于是重点就在于计算 \(\Pr(x|y_j)\) ,我们知道 \(x\) 有一些特征,那么
也就是 \(x\) 的每一个特征都出现在 \(y_j\) 中的概率,其中 \(\Pr(a_i|y_j)\) 是 \(a_i\) 出现在 \(y_j\) 分类中的比例。最终就得到
计算右边的最大值,然后选择对应的 \(y_j\) 作为分类结果即可。
以下面离散数据集的代码为例,首先给出已知数据
fea_dis = [[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]\',[1,2,2,1,1,1,2,2,3,3,3,2,2,3,3]\']; % 已经分类的数据集
gnd_dis = [-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]\'; % 对应的分类结果集
需要对 \((a_1,a_2)=(2,1)\) 进行分类,可以看出有 \(-1,1\) 两类,记为 \(y_1,y_2\)
target_dis = [2,1];
因此需要计算每个分类中不同特征出现的概率
用一个矩阵来存放上面的概率
% 记录概率 P(a_i|y_j)
P = zeros(2,2);
% 统计 1 和 -1 两类分别有多少元素
p_count1 = sum(gnd_dis == 1);
p_count2 = sum(gnd_dis == -1);
% x = (a1,a2) = (2,1)
% 统计 1 类中 2 和 1 出现的概率
P(1,1) = sum(fea_dis(:,1) == 2 & gnd_dis == 1) / p_count1;
P(1,2) = sum(fea_dis(:,2) == 1 & gnd_dis == 1) / p_count1;
% 统计 -1 类中 2 和 1 出现的概率
P(2,1) = sum(fea_dis(:,1) == 2 & gnd_dis == -1) / p_count2;
P(2,2) = sum(fea_dis(:,2) == 1 & gnd_dis == -1) / p_count2;
然后计算出似然估计
p1 = P(1,1) * P(1,2) * p_count1 / (p_count1 + p_count2);
p2 = P(2,1) * P(2,2) * p_count2 / (p_count1 + p_count2);
比较两个概率的大小决定分到哪一类即可。
Continuous Classifier
对于连续数据,通常是将其转化为离散数据集,包括两种方法
- 将特征取值范围分成几个较少的区间
- 假设每个类别中样本特征服从不同期望方差下的正态分布
第一种方法下,直接使用上面的方案即可;如果是第二种方法,我们假定 \(y_j\) 类中出现的特征 \(a_i\) 服从正态分布
这样就可令 \(\Pr(a_i|y_j) = g(a_i,\mu,\sigma)\) ,其中 \(\mu\) 和 \(\sigma^2\) 是 \(y_j\) 中出现的特征 \(a_i\) 的期望和方差。我们用平均值来近似期望,使用无偏方差
假定不同特征的协方差为 \(0\) ,也就是它们相互独立。
我们生成一个连续数据集
% 生成连续数据
mu = [0,2];
sigma = [1 0;0,1];
r1 = mvnrnd(mu,sigma,200);
target_r1 = mvnrnd(mu,sigma,10);
mu = [3,6];
sigma = [1 0;0,1];
r2 = mvnrnd(mu,sigma,200);
target_r2 = mvnrnd(mu,sigma,10);
% 数据集
fea_con = [r1;r2];
gnd_con = [ones(200,1);-1*ones(200,1)];
target_con = [target_r1;target_r2];
% 清除无用数据
clear mu sigma r1 r2 target_r1 target_r2
这里是利用二元正态分布生成了两组数据集,分别为 \(1,-1\) 类,然后将它们拼在一起,不过这不重要。
这次要对 \(10\) 个样本进行分类,还是按照之前的方法计算 \(\Pr(y_j)\) ,而 \(\Pr(a_i|y_j)\) 则采用上面的正态分布估计,就得到
% 统计 1 和 -1 两类分别有多少元素
p_count1 = sum(gnd_con == 1);
p_count2 = sum(gnd_con == -1);
% 获取 1 类和 -1 类的元素
y1 = fea_con(gnd_con == 1,:);
y2 = fea_con(gnd_con == -1,:);
% 计算平均值作为期望
mu1 = [mean(y1(:,1)) mean(y1(:,2))];
mu2 = [mean(y2(:,1)) mean(y2(:,2))];
% 计算方差
sigma1 = [(y1(:,1) - mu1(1))\' * (y1(:,1) - mu1(1)) / (p_count1 - 1) 0;
0 (y1(:,2) - mu1(2))\' * (y1(:,2) - mu1(2)) / (p_count1 - 1)];
sigma2 = [(y2(:,1) - mu2(1))\' * (y2(:,1) - mu2(1)) / (p_count2 - 1) 0;
0 (y2(:,2) - mu2(2))\' * (y2(:,2) - mu2(2)) / (p_count2 - 1)];
% 目标长度
n = length(target_con);
% 记录概率 P(a_i|y_j) 通过正态分布估计
P = zeros(2,2);
res = zeros(n,1);
% x = (a1,a2)
for i = 1:n
% 当前元素的两个特征
a1 = target_con(i,1);
a2 = target_con(i,2);
% 计算 1 类中 a1 a2 的概率
P(1,1) = 1 / sqrt(2*pi) / sigma1(1,1) * exp(-(a1-mu1(1))^2/(2 * sigma1(1,1)^2));
P(1,2) = 1 / sqrt(2*pi) / sigma1(2,2) * exp(-(a2-mu1(2))^2/(2 * sigma1(2,2)^2));
% 计算 -1 类中 a1 a2 的概率
P(2,1) = 1 / sqrt(2*pi) / sigma2(1,1) * exp(-(a1-mu2(1))^2/(2 * sigma2(1,1)^2));
P(2,2) = 1 / sqrt(2*pi) / sigma2(2,2) * exp(-(a2-mu2(2))^2/(2 * sigma2(2,2)^2));
% 计算条件概率
p1 = P(1,1) * P(1,2) * p_count1 / (p_count1 + p_count2);
p2 = P(2,1) * P(2,2) * p_count2 / (p_count1 + p_count2);
% 根据概率大小判断分类
if p1 > p2
res(i) = 1;
else
res(i) = -1;
end
end
由于只有两类,所以分类也较为简单,不过更多类的情况也是类似的。
Accuracy
只介绍简单的分类准确度指标 accuracy ,定义为分类正确的样本数与总样本数之比。
% 计算准确度
acc = sum(res == target_con_gnd) / n;