秒懂算法

2023-11-12

在本文中,我们会用概率的观点来看待机器学习模型,用简单的例子帮助大家理解判别式模型和生成式模型的区别。通过思考曲线拟合的问题,发现习以为常的损失函数和正则化项背后有着深刻的意义

01、快速理解判别式模型和生成式模型

从概率的角度来理解数据有着两个不同的角度,假设我们有5个数据点,每个数据都只有一个特征x和一个目标值y:

一种是条件概率的角度,它描述了目标值相对于数据的特征出现的概率,我们表示为:

这两种角度分别代表了两种不同的建模方法,条件概率是将数据特征与目标值直接联系在一起,对于每一个特征我们只需要计算P(y|x),我们将这样的模型叫作判别式模型(Discriminative Model),可以看到如果是利用判别式模型去预测新的数据x=0,它会给出y=0。联合概率是综合考虑了整个样本空间,对于每一个特征我们需要计算P(y,x),我们将这样的模型叫作生成式模型(Generative Model),如果去预测新的数据x=1,会比较y=1的概率是1/5,y=2的概率是2/5,选择概率较大的y=2。

定理1 (贝叶斯定理):贝叶斯定理(Bayes theorem)可以从全概率公式推导而来,但含义却更加丰富,简而言之,事件发生的条件可能性和依据此条件发生此事,概率是不一样的。我们分别用A和B表示事件,贝叶斯定理写作:

其中,p(A)表示先验,是统计量或者只是假设偏好;p(B|A)是似然函数,是在条件A下的B出现的概率;p(A|B)是后验概率,表示B的出现是因为A的概率,∫A′p(B|A′)P(A′)dA′为证据因子,对条件概率的积分表示将所有的事件发生的条件都考虑在内。

生成式模型和判别式模型往往都与贝叶斯定理相联系,见定理4。因为有P(x,y)=P(y|x)P(x),联合概率比条件概率还多考虑了数据特征的分布。贝叶斯定理中的后验概率随着我们的任务有着不同的含义,比如在朴素贝叶斯分类器中,事件A和B分别指类别和需要预测的样本,在线性回归或者线性分类算法中,事件A和B分别指条件分布的参数和训练样本。

02、极大似然估计和平方损失

回归问题中,我们可以将每一个样本x对应的目标值看作一个均值为ωx的连续分布,如图1所示,它只假设分布p(y|x)服从高斯分布,而不关心p(x),所以训练过程本质上是在对这个条件分布的参数做估计。

■ 图1每一个样本 x0 都对应着一个高斯分布,分布的均值作为真实值

以这样的视角来重新考虑目标值的分布会发现,每一个样本的目标值yi都服从高斯分布N(ωTxi,σ2),它的均值为ωTxi,假设样本是独立同分布的,那么目标值的分布就是所有样本分布的乘积,形式为:

定理2 (极大似然估计):给定分布的概率密度函数f,这个概率分布由参数θ控制,我们从分布中采样X1,X2,X3,…,Xn,似然函数就是样本关于该参数的条件概率:

最大化似然函数的意义就是在参数θ的所有的可能取值中,寻找一个使得采样最可能出现的θ,可能性最大,意味着似然函数也达到了最大值。

因为总的似然函数等于所有样本分布的乘积,大量的小的数连乘会造成数值下溢,所以我们将似然函数取对数,连乘就变为了对数求和:

最大化对数似然就是最大化多个高斯分布的对数和:

利用对数的性质,就可以将其拆开:

其中 ln ( σ √2π与 ω 无关,最大化对数似然,相当于最小化其负值,所以,

其中标准差σ独立于ω,不参与优化。这样,我们就以极大似然估计的方法得到了均方误差的表达式。极大似然估计是贯穿统计学习和深度学习的参数估计办法,我们会经常使用它来得到损失函数,因为极大似然估计可以获得参数估计的一致性。

03、最大后验估计和正则化

极大似然估计假设了条件分布,从频率学派的角度看来,这个分布的参数是确定好的,我们只需要找到这个参数。但从贝叶斯学派的角度看来,参数本身就是一个随机变量,我们需要找到的是这个参数的分布。如果我们考虑贝叶斯定理,将最大似然估计做进一步的扩展,我们最大化的不再是似然函数,而是似然函数与先验的乘积,也就得到了极大后验估计,见定理3。

其中,先验概率就表达了参数的分布,只有在这个分布之下,参数才有可能被考虑。所以最后的估计结果会使得参数向先验的方向移动,如果采用极大后验来得到损失函数,先验概率的存在则对应着损失函数的正则项。

定理3 (最大后验估计MAP):在最大似然估计的基础上,我们选择最大化似然函数和先验概率的乘积:

如果先验分布为均匀分布,先验项会在结果上变为一个常数,在此条件下,最大后验估计和极大似然估计给出的结果虽然一致,但是在论述上仍然有着本质的不同。

如图2所示,先假设参数的先验分布为均值为零的拉普拉斯分布:

其中,η为拉普拉斯分布的尺度参数。同样因为取对数,乘积变为了求和:

■ 图2 红线和绿线表示标准高斯分布和拉普拉斯分布

其中,d表示参数的个数,我们可以延续上述步骤化解得到:

最大化对数似然就是最小化其负值,同时省略其中的常数项,就会得到:

其中,σ 和 η 是常数,不参与优化。我们就利用最大后验估计得到了L1正则化的形式。

同理,我们将先验概率替换为均值为零的高斯分布,其方差由τ2所控制,继续上述的步骤会得到L2正则化:

我们会发现,正则化将权重系数缩减到零的操作恰恰对应了先验分布中概率密度最大的区域,我们将均值设为零,估计的参数会更偏好零。所以,我们可以自由的控制参数向我们期望的方向移动,只需要调节先验的均值。并且,先验分布的尺度参数(我们将均值叫作分布的位置参数)对应着正则化项系数,它越小,表示分布的尺度越小,精度越高,正则化项起到的作用也就越大。

04、贝叶斯线性估计

最大似然估计是点估计,在参数空间上得到一个点作为最后的结果,最大后验估计虽然添加了先验,但其估计的只是后验分布的众数,最后得到的仍然是一个点。单纯地采用极大似然估计会带来模型容量和过拟合的问题,采用最大后验来添加正则化项虽然可以防止过拟合,但却引入了额外的超参数,需要做交叉验证的重复训练来大致确定超参数的值,并且先验分布的不合理会在小数据集上带来致命的后果。

参数的整个分布包含着比单纯的一个点更多的信息,如果根据贝叶斯定理可以得到参数的后验分布,贝叶斯线性估计的第一步就是获得参数的后验分布。然而根据贝叶斯定理,后验分布需要计算整个参数空间的证据因子,这往往是一个高维积分,需要用一些数值模拟的技术来计算。但是我们可以采用高斯分布自共轭的性质,见定理4,就可以直接写出后验分布的封闭形式,进而简化了计算。

定理4 (共轭先验):在贝叶斯定理中,如果先验分布和后验分布属于同一类分布,则此时的先验分布和后验分布为一对共轭分布,此时的先验分布为似然函数的共轭先验:

讨论共轭分布,需要指明似然函数的形式。高斯分布在高斯的似然函数下为自共轭分布,也就是说,如果似然函数和先验分布均为高斯,那么后验分布也为高斯分布。

我们考虑参数的高斯先验分布和似然函数:

均值和标准差一旦确定,整个分布就确定了。如果我们设置先验的均值为零,将大大地简化问题,此时最大化后验分布的对数会得到L2正则化同样的结果:

我们将这样的形式叫作贝叶斯岭回归(Bayesian Ridge Regression)。

为了更充分地利用数据和预测分布,从数据中直接提取先验,我们会采取增量计算的方 式,将数据分批处理,此种增量计算的基本过程是:首先确定一个先验分布,利用少量的数据点去计算后验分布,然后将前一步计算而来的后验作为下一步的先验,接着导入部分数据点,再继续得到后验分布,再将此时的后验当作下一步的先验,直到计算完整个数据集。与一次性计算完全部的数据不同,增量计算的好处在于随时可以根据数据来调整先验分布的参数,在样本并不能很好地反映总体(这是经常发生的,我们把这种情况叫作数据的不一致性),或者数据量较少时,会有很不错的性能。

此时我们还并未真正接触到贝叶斯线性回归的威力。后验分布就是关于参数的条件分布,如果我们不使用最大化后验分布来得到损失函数,而是将得到的后验分布与似然函数相结合,就能最终实现对新样本的预测。为什么后验分布可以直接与似然函数相乘呢?因为贝叶斯的增量计算会将上一步的后验当作下一步的先验,当我们用来做新样本的预测,使用的先验分布就是训练完成后的后验分布。

假设新的样本为ynew,对于新样本的预测也呈现一个分布,为:

可以看出,预测分布成为了两个高斯分布的卷积,卷积的本质就是加权平均(卷积神经网络中的卷积操作概念本质上也是加权平均),在参数的所有可能位置上,后验分布被看作权重,似然函数给出的预测就被平均化。点估计只考虑了一个参数值,参数值的不恰当就会导致过拟合,而贝叶斯估计是在整个参数空间上取平均,使得最后的结果更加稳定。

最后我们来讨论预测分布的性质,见定理5,通过卷积两个高斯分布得到的方差为:

定理5 (高斯分布的卷积):两个高斯分布的卷积仍然是一个高斯分布,新的高斯分布的方差为两个高斯分布的方差之和。

可以证明,随着样本的增加,预测分布的方差会越来越小。在此章中,我们使用了一维变量假设分布,来使得问题尽可能地简单,实际应用中,我们会遇到多维分布,只需要将方差推广到协方差即可。

05、使用scikit-learn

在sklearn中我们通过BayesianRidge类可以很方便地实现贝叶斯岭回归,我们仍然使用 sklearn的diabetes数据集,选取BMI指数作为特征,为了尽可能地将模型变得复杂,我们使用多项式回归的办法将项数扩展为10,依次采用普通的线性回归和贝叶斯岭回归的办法,观察其在样本空间的曲线形式,同时为了详细验证贝叶斯和普通线性回归的性能差异,我们对这两种算法分别作10折的交叉验证,把10次交叉的均方误差的平均值作为性能指标,来观察两种算法的泛化能力。

1. import numpy as np
2. import matplotlib.pyplot as plt
3. import seaborn as sns
4. from sklearn.preprocessing import PolynomialFeatures as PF
5. from sklearn.linear_model import BayesianRidge as BR
6. from sklearn.linear_model import LinearRegression as LR
7. from sklearn import datasets
8. from sklearn.model_selection import cross_val_score
9. 
10. data=datasets.load_diabetes()
11. X=data['data'][:,2][:,np.newaxis]
12. y=data['target']
13. 
14. poly=PF(degree=10)
15. X_poly=poly.fit_transform(X)
16. 
17. Regressors=dict(ols=LR(),bayesian = BR())
18. 
19. sns.set(style='white')
20. plt.subplot(1,2,1)
21. plt.scatter(X,y,s=8,color='k',label='data')
22. for name,reg in Regressors.items():
23.     reg.fit(X_poly,y)
24.     y_pred=reg.predict(X_poly)
25.     plt.plot(X,y_pred,'.',markersize=5,label=name)
26. plt.legend()
27. plt.subplot(1,2,2)
28. cross_scores=[]
29. cross_names=[]
30. for name,reg in Regressors.items():
31.  score=cross_val_score(reg,X_poly,y,cv=10,scoring='neg_mean_squared_error')
32.     cross_scores.append(-score.mean())
33.     cross_names.append(name)
34. sns.barplot(cross_names,cross_scores)
35. plt.show()

 从图3可以看出,两种算法都通过多项式来增加特征,普通线性回归所得到的结果较为弯曲,表现出了一定的过拟合,而贝叶斯岭回归的结果却近似为一条直线,意味着拥有更好的泛化能力。因为多项式回归中模型的复杂度就取决于其项数,普通线性回归使用极大似然来估计参数,无法避免数据与模型的匹配问题,过于复杂的模型面对简单的数据,很容易产生过拟合。而贝叶斯方法的先验参数由训练数据所提供,相当于用训练数据本身来限制模型的复杂度,并且我们可以清晰地看到贝叶斯回归的泛化性能要优于普通的线性回归。

■图3(a)为两种算法在样本空间的行为,蓝色的线表示普通线性回归的结果,橙色的线表示贝叶斯岭回归的结果,(b)为10折交叉验证后的均方误差平均值对比,蓝色的直方为普通线性回归,橙色的直方为贝叶斯的结果

接下来,我们来验证贝叶斯岭回归的预测分布的方差是否与训练样本有关。我们生成100个数据点,服从正比关系:y=x,并对y添加小的高斯噪声,用贝叶斯岭回归做训练,然后用其来预测更多的数据,观察它在样本空间的方差:

1. import numpy as np
2. import matplotlib.pyplot as plt
3. import seaborn as sns
4. from sklearn.linear_model import BayesianRidge as BR
5. from sklearn.preprocessing import PolynomialFeatures as PF
6. 
7. np.random.seed(2019)
8. X = np.linspace(0,2,100)
9. y = X+np.random.randn(100)
10. 
11. br=BR()
12. br.fit(X[:,np.newaxis],y)
13. 
14. X_ = np.linspace(-50, 50, 1000)
15. y_mean, y_std = br.predict(X_[:,np.newaxis],return_std=True)
16. 
17. plt.figure()
18. plt.scatter(X,y,s=3,c='k')
19. plt.plot(X_, y_mean, 'r', lw=2, zorder=9)
20. plt.fill_between(X_, y_mean-1.96*y_std, y_mean + 1.96*y_std, \
21.          color='blue',alpha=0.3,label='95% CI')
22. plt.fill_between(X_, y_mean-1*y_std, y_mean + 1*y_std,\
23.          color='blue',alpha=0.5,label='68% CI')
24. plt.legend()
25. plt.show()

 从图4可以看出,只有经过训练数据以及与训练数据相近的点可以缩小预测分布的方差,远离训练数据的点在预测分布的方差在逐渐增大,表示预测分布的不确定性越来越高。侧面证明了样本的增多可以缩小预测分布的方差,但也证明了训练样本的多样化(在不同的x均有样本)与训练集的规模大小同样重要,因为多样化可以减小整体的不确定性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

秒懂算法 的相关文章

随机推荐

  • 利用python基于GBDT算法建立轨道交通客流预测模型,并使用网格搜索法进行参数调优...

    你可以使用Python来建立一个基于GBDT算法的轨道交通客流预测模型 为了得到最佳的预测效果 你可以使用网格搜索法来调整模型的参数 网格搜索法是一种通过对参数的不同取值进行试验来选择最优参数的方法
  • 机器学习笔记Machine Learning 之SVD (Singular Value Decomposition) 奇异值分解

    一 特征值和特征向量 A x x Ax lambda x Ax x A 是一个 n n 矩阵 x 是一个 n 维向量
  • webpack的四大核心概念

    webpack中文文档 https doc webpack china org concepts 一 Entry 入口 1 单个入口 简写 语法 语法 entry string Array
  • 3.9 使用Java的文档注释

    Java支持三种形式的注释 前两种是 和 第三种方式被称为文档注释 它以 开始 以 标志结束 文档注释提供将程序信息嵌入程序的功能 开发者可以使用javadoc工具将信息取出 然后转换为HTML文件 文档注释提供了编写程序文档的便利方式 j
  • 简洁直观的飞行器的坐标系与旋转矩阵推导

    Part1 定义5个坐标系 惯性坐标系 载具坐标系 载具1坐标系 载具2坐标系 机体坐标系 总结 载具坐标系与惯性坐标系的关系是平移关系 原点位置不同 载具坐标系绕Z旋转 psi 得到载具1坐标系 载具1坐标系绕Y旋转 theta
  • python爬虫———多线程threading模块爬取抖音用户信息

    爬虫背景 由于原来的数据库中有1 5亿左右的用户id 但是其中有1 2亿的用户资料是不完整的 没有粉丝数量 点赞数量等 算是无用数据 现在老板要求将这些没有资料的用户更新信息 咋办 刚开始的想法是使用主从模式 scrapy爬取 但是写着写着
  • window下安装mysql5.7

    一 配置环境 1 将安装包解压 本文中解压至G mysql5 7 23目录下 2 此电脑 gt 右击 gt 属性 gt 高级系统设置 gt 环境变量 在系统变量 gt 找到Path gt 编辑 将mysql的安装路径添加上去即可 即添加 G
  • 开发了一个抠图/去背景应用

    jr们早上好 iPhone 的 iOS 16有个很酷的功能 长按照片就能把其中的拍摄主体提取出来 抠图过程比一般的抠图App方便 精细度也更高 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img KIlpLyow 1
  • linux系统下搜索文件,Linux系统下搜索文件的方法

    我们知道在Linux中要搜索一个文件的话并是像在Windows中去直接在搜索栏中输入文件名称那么简单 那么对于初学者来说我们该怎么在Linux环境中去搜索文件呢 下面将为初学者带来一个简单的一个演示 操作起来相对比较简单易懂 感兴趣的朋友们
  • 精通软件性能测试与LoadRunner最佳实战 连载七

    9 1 基于不同用户群的性能测试 随着互联网的蓬勃发展 软件的性能测试已经越来越受到软件开发商 用户的重视 如 一个网站前期由于用户较少 随着使用用户的逐步增长 以及宣传力度的加强 软件的使用者可能会成几倍 几十倍甚至几百倍数量级的增长 如
  • 【优化算法】多目标蝗虫优化算法(MOGOA)

    一 简介 1 GOA数学模型 2 GOA迭代模型 3 GOA算法的基本流程 4 GOA缺点 二 源代码 clc clear close all Change these details with respect to your proble
  • windows常用系统库

    ws2 32 lib 如果没有链接 会报如下错 error LNK2019 无法解析的外部符号 imp closesocket 4 该符号在函数 wmain 中被引用 error LNK2019 无法解析的外部符号 imp recv 16
  • 2022.9.26小记 视频播放页

    1 判断浏览器类型 主要是否是微信 window navigator userAgent 1 定义 该属性包含了浏览器类型 版本 操作系统类型 浏览器引擎类型等信息 这个属性可以用来判断浏览器类型 2 使用 2 判断是否苹果ios系统 fu
  • C++前置声明的理解

    知识补充 在C C 中引入一个头文件时 在编译器预处理的时候会将引入头文件的地方简单替换成头文件的内容 这样做的后果是很容易引起头文件的重复引用 所以我们在编写头文件是一般有以下规定来防止头文件被重复包含 MyWidget h ifndef
  • Linux系统之源码编译部署Redis数据库

    Linux系统之源码编译部署Redis数据库 一 Redis数据库介绍 1 Redis简介 2 Redis特点 二 检查本地系统版本 三 下载Redis软件包 1 下载软件 2 查看redis安装包 四 安装redis前环境准备工作 1 解
  • 修改oracle数据库用户名及密码的方法

    一 修改前准备工作 使用ssh工具以root身份连接服务器 然后切换到oracle用户 su oracle 回车 使用sqlplus连接数据库 sqlplus nolog 回车 以管理员身份登录sys用户 conn sys sys as s
  • VMware vSphere中三种磁盘模式:精简置备/厚置备置零/厚置备延迟置零

    在VMware vSphere中 不管是以前的5 1版本 或者是现在的6 5版本 创建虚拟机时 在创建磁盘时 都会让选择磁盘的置备类型 如下图所示 分为 Thick ProvisionedLazy Zeroed 厚置备延迟置零 Thick
  • c语言第九章 结构体和共用体.ppt,第九章 结构体与共用体

    C程序设计实验报告 实验项目 第九章 结构体与共用体 姓名 许鑫琪 实验地点 514 教室 实验时间 6月26日 一 本章要点 对本章知识点进行归纳 含个人学习心得 实验练习 9 3 1 结构体变量的应用 9 3 2 结构提数组的应用 9
  • Unity进阶--声音管理器学习笔记

    文章目录 声音管理器 using System Collections using System Collections Generic using UnityEngine public class AudioManager MyrSing
  • 秒懂算法

    在本文中 我们会用概率的观点来看待机器学习模型 用简单的例子帮助大家理解判别式模型和生成式模型的区别 通过思考曲线拟合的问题 发现习以为常的损失函数和正则化项背后有着深刻的意义 01 快速理解判别式模型和生成式模型 从概率的角度来理解数据有