Bayes入门

本文详细解读了贝叶斯方法的核心概念,包括后验概率、先验概率和似然概率的定义与应用,以及如何利用Bayes公式进行模型比较。文章还探讨了贝叶斯方法与信息论的关系,并介绍了其在简化模型选择过程中的奥卡姆剃刀原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bayes是machine learning的大部头,一直没敢涉及,但是躲是躲不开的,就趁当下小学一番。
主要参考了数学之美番外篇:平凡而又神奇的贝叶斯方法

notation

h=hypothesis,假设
D=data,观测值

Bayes公式

P(h|D)=P(h)P(D|h)P(D)

P(h|D)P(h)P(D|h)

说明:
- P(h|D) 叫后验概率,怎么理解后验呢?后验也就是逆概,即拿到或看到数据结果之后,推断产生该结果来源的条件概率。
- P(h) 叫先验概率

在贝叶斯统计中,某一不确定量p的先验概率分布是在考虑”观测数据”前,能表达p不确定性的概率分布。它旨在描述这个不确定量的不确定程度,而不是这个不确定量的随机性。这个不确定量可以是一个参数,或者是一个隐含变量(英语:latent variable)。在使用贝叶斯定理时,我们通过将先验概率与似然函数相乘,随后标准化,来得到后验概率分布,也就是给出某数据,该不确定量的条件分布。先验概率通常是主观的猜测,为了使计算后验概率方便,有时候会选择共轭先验。如果后验概率和先验概率是同一族的,则认为它们是共轭分布,这个先验概率就是对应于似然函数的共轭先验。

  • P(D|h) 叫似然概率,对应的似然函数是 L(h|D)

似然函数是一种关于统计模型中的参数的函数,表示模型参数中的似然性。似然性则是用于在已知某些观测所得到的结果时,对有关事物的性质的参数进行估计。在这种意义上,似然函数可以理解为条件概率的逆反。

  • Bayes公式的抽象解释:对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小(先验概率,Prior )”和“这个猜测生成我们观测到的数据的可能性大小”(似然,Likelihood )的乘积。

model comparison and 贝叶斯奥卡姆剃刀(Bayesian Occam’s Razor)

  • 我们通过: P(h|D)P(h)P(D|h) 来比较哪个模型最为靠谱。前面提到,光靠 P(D | h) (即“似然”)是不够的,有时候还需要引入 P(h) 这个先验概率。奥卡姆剃刀就是说 P(h) 较大的模型有较大的优势,而最大似然则是说最符合观测数据的(即 P(D | h) 最大的)最有优势。整个模型比较就是这两方力量的拉锯。
  • 贝叶斯奥卡姆剃刀(Bayesian Occam’s Razor),因为这个剃刀工作在贝叶斯公式的似然(P(D | h) )上,而不是模型本身( P(h) )的先验概率上,后者是传统的奥卡姆剃刀。

与信息论的关联

我们知道: P(h|D)P(h)P(D|h) ,两边都同时取对数:

logP(h|D)logP(h)+logP(D|h)

1. 相对熵(或KL散度)的含义:衡量两个随机分布之间的距离。因此, logP(h|D) 可以理解为 D(h||D) ,度量真实分布为D而假定分布为h的无效性。
2. 编码的角度: logP(h)+logP(D|h) 则可以解释为模型(或者称“假设”、“猜测”)h 的编码长度加上在该模型下数据 D 的编码长度。使这个和最小的模型就是最佳模型。

bayes还有很多后续的内容,待后续研究补充

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 行列式是线性代数的核心概念,在求解线性方程组、分析矩阵特性以及几何计算中都极为关键。本教程将讲解如何用C++实现行列式的计算,重点在于如何输出分数形式的结果。 行列式定义如下:对于n阶方阵A=(a_ij),其行列式由主对角线元素的乘积,按行或列的奇偶性赋予正负号后求和得到,记作det(A)。例如,2×2矩阵的行列式为det(A)=a11×a22-a12×a21,而更高阶矩阵的行列式可通过Laplace展开或Sarrus规则递归计算。 在C++中实现行列式计算时,首先需定义矩阵类或结构体,用二维数组存储矩阵元素,并实现初始化、加法、乘法、转置等操作。为支持分数形式输出,需引入分数类,包含分子和分母两个整数,并提供与整数、浮点数的转换以及加、减、乘、除等运算。C++中可借助std::pair表示分数,或自定义结构体并重载运算符。 计算行列式的函数实现上,3×3及以下矩阵可直接按定义计算,更大矩阵可采用Laplace展开或高斯 - 约旦消元法。Laplace展开是沿某行或列展开,将矩阵分解为多个小矩阵的行列式乘积,再递归计算。在处理分数输出时,需注意避免无限循环和除零错误,如在分数运算前先约简,确保分子分母互质,且所有计算基于整数进行,最后再转为浮点数,以避免浮点数误差。 为提升代码可读性和可维护性,建议采用面向对象编程,将矩阵类和分数类封装,每个类有明确功能和接口,便于后续扩展如矩阵求逆、计算特征值等功能。 总结C++实现行列式计算的关键步骤:一是定义矩阵类和分数类;二是实现矩阵基本操作;三是设计行列式计算函数;四是用分数类处理精确计算;五是编写测试用例验证程序正确性。通过这些步骤,可构建一个高效准确的行列式计算程序,支持分数形式计算,为C++编程和线性代数应用奠定基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值