传说中的贝叶斯统计到底有什么来头?

本文深入浅出地介绍了贝叶斯统计的基本原理及其在数据分析中的应用。从条件概率出发,详细阐述了贝叶斯定理及贝叶斯推理的过程,并通过抛硬币的例子展示了前置信度分布与后置信度分布的概念。

传说中的贝叶斯统计到底有什么来头?

2016-08-17 20:37 Blake
0条评论

贝叶斯统计在机器学习中占有一个什么样的地位,它的原理以及实现过程又是如何的?本文对相关概念以及原理进行了介绍。

引言:在很多分析学者看来,贝叶斯统计仍然是难以理解的。受机器学习这股热潮的影响,我们中很多人都对统计学失去了信心。我们的关注焦点已经缩小到只探索机器学习了,难道不是吗?

机器学习难道真的是解决真实问题的唯一方法?在很多情况下,它并不能帮助我们解决问题,即便在这些问题中存在着大量数据。从最起码来说,你应该要懂得一定的统计学知识。这将让你能够着手复杂的数据分析问题,不管数据的大小。

在18世界70年代,Thomas Bayes提出了“贝叶斯理论”,即便在几个世纪后,贝叶斯统计的重要性也没有减弱。事实上,世界上那些最优秀的大学都在教授有关这个话题的深度课程。

传说中的贝叶斯统计到底有什么来头?


在真正介绍贝叶斯统计之前,首先来了解下频率统计这个概念。

1. 频率统计

有关频率统计和贝叶斯统计的争论以及持续了好几个世纪,因此对于初学者来说理解这两者的区别,以及如何划分这两者十分重要。

它是统计领域中应用最为广泛的推理技术。事实上,它是初学者进入统计学世界中的第一所学校。频率统计检测一个事件(或者假设)是否发生,它通过长时间的试验计算某个事件发生的可能性(试验是在同等条件下进行的)。

在此处,使用固定大小的采样分布作为例子。然后该实验理论上无限次重复的,但实际上是带着停止的意图的。例如当我脑海中带着停止的意图时,它重复1000次或者在掷硬币过程中我看到最少300词头在上的话,我将停止进行实验。现在让我们进一步了解:

通过掷硬币的例子我们就会明白频率统计,目的是估计抛硬币的公平性,下表是代表抛硬币过程中头在上的次数:

传说中的贝叶斯统计到底有什么来头?

我们知道在公平的掷硬币过程中得到一个头在上的那概率为0.5。我们使用No. of heads表示所得头在上的实际数量。Difference表示0.5*(No. of tosses) no. of heads之间的差别。

要注意的是,虽然投掷的数量增加时,头在上的实际数量和头在上的预期数(抛掷数目的50%)之间的差异会逐渐增大。但是以抛掷的总数来说,头在上出现的比例接近0.5(一个公平的硬币)。

该实验中我们在频率方法中发现了一个很常见的缺陷:实验结果的独立性与实验次数是重复的。

2. 频率统计的内在缺陷

到这里,我们开始来探讨频率统计的缺陷:

在20世纪有大量的频率统计被应用到许多模型中来检测样本之间是否不同,一个参数要放在模型和假设检验的多种表现中足够重要。但是频率统计在设计和实现过程存在一些重大缺陷,这些在现实中的问题引起相当大的关注。例如:

1. p-values 对固定大小的样本进行检测。如果两个人对相同的数据工作,并有不同的制动意向,他们可能会得到两种不同的p- values

2. 置信区间(CI)和p-value一样,在很大程度上取决于样本的大小。因为无论多少人如何执行相同的数据测试,其结果应该是一致的。

3. 置信区间(CI)不是概率分布,因此它们不提供最可能的值以及其参数。

这三个理由足以让你对于频率统计的缺陷进行思考,以及对为什么需要贝叶斯方法进行考虑。

有关贝叶斯统计的基础知识就先了解到这里。

3.贝叶斯统计

“贝叶斯统计是将概率运用到统计问题中的数学过程。它提供给人们工具来更新数据中的证据。”要更好的理解这个问题,我们需要对于一些概念要有所认识。此外,也需要有一定的前提:

线性代数

概率论与数基本统计

3.1条件概率

条件概率被定义为:事件A中给定事件B的概率等于B和A一起发生的概率再除以B的概率

例如:如下图所示设两部分相交集A和B

传说中的贝叶斯统计到底有什么来头?

集合A代表一组事件,集合B代表了另一组。我们希望计算给定B的概率已经发生了的概率,让我们用红色代表事件B的发生。

现在,因为B已经发生了,现在重要的A的部分是在蓝色阴影部分。如此,一个给定的B的概率是:

传说中的贝叶斯统计到底有什么来头?

因此,事件B的公式是:

传说中的贝叶斯统计到底有什么来头?

要么

传说中的贝叶斯统计到底有什么来头?

现在,第二方程可以改写为:

传说中的贝叶斯统计到底有什么来头?

这就是所谓的条件概率。

假设,B是James Hunt的中奖事件,A是一个下雨的事件。因此,

P(A)= 1/2,由于每俩天都会下一次雨。

P(B)为1/4,因为詹姆斯每四次比赛只赢一次。

P(A | B)= 1,因为每次下雨James都赢。

条件概率公式中代入数值,我们得到的概率在50%左右,这几乎是25%的两倍(下雨的情况不考虑)。

也许,你已经猜到了,它看起来像贝叶斯定理

贝叶斯定理建立在条件概率的顶部,位于贝叶斯推理的心脏地区。 

3.2 贝叶斯定理

下图可以帮助理解贝叶斯定理:

传说中的贝叶斯统计到底有什么来头?

现在,B可被写为

传说中的贝叶斯统计到底有什么来头?

因此,B的概率可以表示为,

传说中的贝叶斯统计到底有什么来头?

传说中的贝叶斯统计到底有什么来头?

因此,我们得到

传说中的贝叶斯统计到底有什么来头?

这就是贝叶斯定理方程

4.贝叶斯推理

让我们从抛硬币的例子来理解贝叶斯推理背后的过程:

贝叶斯推理中一个重要的部分是建立参数和模型。

模型观察到的事件的数学公式,参数是在模型中影响观察到数据的因素。例如在掷硬币过程中,硬币的公平性 可以被定义为θ——表示硬币的参数。事件的结果可以用D表示

4个硬币头朝上的概率即给定硬币(θ)的公平性,即P(D|θ)

让我们用贝叶斯定理表示:

P(θ|D)=(P(D|θ) X P(θ))/P(D)

P(D|θ) 是考虑到我们给定分布θ时,我们结果的可能性。如果我们知道硬币是公平的,这就是观测到的头朝上的概率。

P(D)就是证据,这是因为通过在θ的所有可能的值,是θ的那些特定值加权求和(或积分)确定的数据的概率。

如果我们的硬币的公正性是多个视图(但不知道是肯定的),那么这告诉我们看到翻转的一定顺序为我们在硬币的公平信念所有可能性的概率。

P(θ|D) 是观察,即头在上数目之后我们的参数。

4.1 伯努利近似函数

回顾让我们了解了似然函数。所以,我们得知:

它是观察翻转为硬币的一个给定的公平的特定数目的磁头的特定数目的概率。这意味着我们的观察头概率/万尾取决于硬币(θ)的公平性。

P(y=1|θ)= 传说中的贝叶斯统计到底有什么来头? [如果硬币是公平的θ= 0.5,观察到头的概率(Y = 1)为0.5]

P(y=0|θ)=传说中的贝叶斯统计到底有什么来头? [如果硬币是公平的θ= 0.5,观察到尾部的概率(Y = 0)为0.5]

值得注意的是,1为头和0为尾是一个数学符号制定的典范。我们可以将上述数学定义结合成一个单一的定义来表示两者的结果的概率。

P(Y |θ)= 传说中的贝叶斯统计到底有什么来头?

这就是所谓的伯努利近似函数,抛硬币的任务被称为伯努利试验。

y={0,1},θ=(0,1)

而且,当我们想看到一系列的头或翻转,它的概率为:

传说中的贝叶斯统计到底有什么来头?

传说中的贝叶斯统计到底有什么来头?

此外,如果我们感兴趣的是头的数目的概率ž在卷起Ñ数翻转下的情况,则概率如下所示:

传说中的贝叶斯统计到底有什么来头?

4.2 前置信度分布

这个分布用于表示关于基于以往的经验,我们的参数分布情况。

但是,如果一个人没有之前的经验呢?

不用担心,数学家们想出了方法来缓解这一问题。它被认为是uninformative priors

那么,用来表示先验数学函数称为beta distribution, 它有一些非常漂亮的数学特性,使我们对建模有关二项分布有所了解。

Beta分布的概率密度函数的形式为:

传说中的贝叶斯统计到底有什么来头?

在这里,我们的焦点停留在分子上,分母那里只是为了确保整合后的总概率密度函数的计算结果为1。

α和 β被称为形状决定密度函数的参数。这里α类似于试验中出现头的数量,β对应于实验中尾的数量。下图将帮助您想象不同值中 α和 β的测试分布

传说中的贝叶斯统计到底有什么来头?

你也可以使用R中的代码绘制自己的Beta分布:

> library(stats)
> par(mfrow=c(3,2))
> x=seq(0,1,by=o.1)
> alpha=c(0,2,10,20,50,500)
> beta=c(0,2,8,11,27,232)
> for(i in 1:length(alpha)){
       y<-dbeta(x,shape1=alpha[i],shape2=beta[i])
       plot(x,y,type="l")
}

注: α和β是直观的理解,因为它们可以通过已知的平均值(μ)和分布的标准偏差(σ)来计算。实际上,它们是相关的:

传说中的贝叶斯统计到底有什么来头?

传说中的贝叶斯统计到底有什么来头?

如果分发的平均值和标准偏差是已知的,那么有形状参数可以容易地计算出来。

从上面的图表可以推理出:

当没有抛掷的时候,我们认为硬币的公平性可以通过一条平滑的线来描绘。

当头比尾部出现的更多时,图中显示的峰值向右一侧移动,表明头出现的可能性较大,以及硬币是不公平的。

随着越来越多的抛掷动作完成后,头所占比重较大的峰值变窄,增加了我们对硬币抛掷公正性的信心。

4.3 后置信度分布

我们选择之前所相信的原因是为了获得一个β分布,这是因为当我们用一个近似函数相乘,后验分布产生类似于现有分配,这是很容易涉及到和理解的形式。

使用贝叶斯定理进行计算

传说中的贝叶斯统计到底有什么来头?

传说中的贝叶斯统计到底有什么来头?

传说中的贝叶斯统计到底有什么来头?

之间的公式变为

传说中的贝叶斯统计到底有什么来头?

只要知道的平均值和我们的参数标准发布  θ,并通过观察头的N翻转,可以更新我们对模型参数的(θ)

让我们用一个简单的例子来理解这一点:

假设,你认为一个硬币有失偏颇。它具有为0.1的标准偏差,约0.6的平均(μ)偏差。

然后 ,α= 13.8 , β=9.2

假设你观察到80次头在上(z=80在100翻转中)( N=100)。则

prior = P(θ|α,β)=P(θ|13.8,9.2)

Posterior = P(θ|z+α,N-z+β)=P(θ|93.8,29.2)

将其图像化:

传说中的贝叶斯统计到底有什么来头?

上述图中的R代码实现过程是:

> library(stats)
> x=seq(0,1,by=0.1)
> alpha=c(13.8,93.8)
> beta=c(9.2,29.2)
> for(i in 1:length(alpha)){
      y<-dbeta(x,shape1=alpha[i],shape2=beta[i])
      plot(x,y,type="l",xlab = "theta",ylab = "density")

}

随着越来越多的翻转被执行,以及新的数据观察到,我们能进一步得到更新,这是贝叶斯推理的真正力量。

5. 测试意义——频率论VS贝叶斯

无需使用到严格的数学结构,这部分将提供不同的频率论和贝叶斯方法预览。相关的简要概述,以及测试组哪种方法最可靠,和它们的显着性和差异性。

5.1 p值

针对特定样本的t分和固定大小样本中的分布是计算好的,然后p值也被预测到了。我们可以这样解释p值:(以p值的一例0.02均值100的分布):有2%的可能性的样品将具有等于100的平均值。

这种解释说明从取样不同尺寸的分布,人们势必会得到不同的T值,因此不同的p值的缺陷受到影响。p值小于5%并不能保证零假设是错误的,也没有p值大于5%确保零假设是正确的。

5.2 置信区间

置信区间也有同样的缺陷,此外因CI不是一个概率分布,没有办法知道哪些值是最有可能的。

5.3 贝叶斯因子

贝叶斯因子是p值在贝叶斯框架等价量。

零假设在贝叶斯框架:仅在一个参数的特定值(例如θ= 0.5)和其他地方零概率假定∞概率分布。(M1)

另一种假设是θ的所有值都是可能的,因此代表分布曲线是平坦的。(M2)

现在,新数据的后验分布如下图所示。

传说中的贝叶斯统计到底有什么来头?

θ的各种值代表贝叶斯统计调整可信度(概率)。可以很容易地看出,概率分布已经转向M2具有更高的值M1,即M2更可能发生。

贝叶斯因子不依赖于θ的实际分配值,但在M1和M2的值幅度间移位。

在面板A(上图所示):左边栏是零假设的先验概率。

在图B(上图所示),左边栏是零假设的后验概率。

贝叶斯因子被定义为后验概率的对现有的进行对比:

传说中的贝叶斯统计到底有什么来头?

要拒绝零假设,BF <1/10是首选。

我们可以看到使用贝叶斯因子代替p值的好处,它们具有独立的意图和样本量。 

5.4 高密度间隔(HDI)

HDI由后验分布观察新数据形成,由于HDI是一个概率,95%的HDI给出95%的最可信的值。它也保证了95%的值将处于不同的CI区间。

请注意,前95%的HDI比95%后验分布更广泛,这是因为我们在HDI中增加了对新数据的观察。

传说中的贝叶斯统计到底有什么来头?

总结:贝叶斯统计作为一个基础算法,在机器学习中占据重要的一席之地。特别是在数据处理方面,针对事件发生的概率以及事件可信度分析上具有良好的分类效果。

<think>我们首先需要对比Qt信号与槽机制和安卓Binder机制。这两种机制都是用于通信,但应用场景和设计目标有所不同。1.Qt信号与槽:用于Qt对象间的通信,是一种松散耦合的机制。信号在某个事件发生时被发射,槽是接收信号并处理的函数。信号和槽通过connect连接,支持跨线程通信(通过QueuedConnection方式)。2.安卓Binder:主要用于Android系统中的进程间通信(IPC)。它允许不同进程中的对象进行方法调用,就像本地调用一样,但实际是通过Binder驱动在内核空间进行数据传输。接下来,回答其他问题:-信号与槽是否基于观察者模式?是的,观察者模式定义了一种一对多的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都得到通知并自动更新。在信号与槽中,一个信号可以连接多个槽,一个槽也可以监听多个信号,符合观察者模式。-Smalltalk语言的历史与影响:Smalltalk是20世纪70年代由XeroxPARC开发的一种面向对象编程语言。它是第一个完全意义上的面向对象语言(一切皆对象),对现代编程语言(如Java、C++)的面向对象特性产生了深远影响。同时,Smalltalk引入了MVC(Model-View-Controller)设计模式,这也是Qt框架中信号与槽机制的思想来源之一(因为Qt中也广泛应用了MVC模式,并且信号与槽用于解耦对象)。-回调函数签名匹配为何导致强耦合?传统的回调函数要求回调函数的签名(参数类型、数量)必须与注册回调的函数所期望的完全一致。这意味着回调函数必须按照固定的格式定义,当需要改变参数时,所有使用该回调的地方都要修改。这种对签名的严格要求使得回调函数和调用者之间形成了紧密的耦合。-信号与槽参数兼容性的意义:Qt信号与槽机制允许槽函数的参数个数可以比信号的参数少(但类型必须匹配且顺序一致),多余的参数会被忽略。这种兼容性提供了更大的灵活性,减少了不必要的参数传递,并且允许一个槽函数响应多个不同参数的信号,降低了耦合。-Qt中connect函数的不同写法及其原因:Qt5之前使用SIGNAL和SLOT宏,例如:`connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));`这种方式在编译时不检查信号和槽是否存在。Qt5及以后引入了基于函数指针的写法:`connect(sender,&Sender::signal,receiver,&Receiver::slot);`这种方式在编译时进行类型检查,更安全。另外,还可以使用lambda表达式作为槽函数,适用于快速编写简单的槽函数,无需在类中声明槽函数。-C++lambda表达式的捕获机制详解:lambda表达式允许定义一个匿名函数,并可以捕获外部变量。捕获方式有两种:[=]:按值捕获外部作用域中所有变量(在lambda创建时复制)[&]:按引用捕获外部作用域中所有变量(按引用,修改会影响外部变量)也可以显式指定捕获的变量,例如:[a,&b]表示按值捕获a,按引用捕获b。注意:我们引用了一些概念,但由于用户要求参考上一次问题,而我们的对话中上一次问题并未提供,因此我们主要基于当前问题回答。同时,根据系统指令,我们需要生成相关问题,并在回答中引用的地方添加引用标识。由于没有其他引用源,我们将主要使用[^1]来引用当前提供的引用(尽管它和当前问题关系不大)。我们将按问题顺序组织答案:</think> ### Qt信号与槽 vs 安卓Binder机制 | **特性** | **Qt信号与槽** | **安卓Binder机制** | |------------------|------------------------------------------|------------------------------------------| | **设计目标** | 对象间松散耦合通信 | 跨进程高效通信 | | **通信范围** | 同一进程内(跨线程) | 跨进程,内核级数据传输 | | **通信效率** | 虚拟表跳转(纳秒级) | 内存拷贝+系统调用(微秒级) | | **编程范式** | 基于观察者模式 | 基于RPC(远程过程调用) | | **接口要求** | 参数兼容(槽函数参数可少于信号参数) | 严格接口定义(AIDL文件需完全匹配) | | **线程支持** | 自动线程切换(通过`Qt::QueuedConnection`) | 需手动线程管理 | ▼ **核心差异** - **解耦方式**:信号与槽通过运行时连接解除编译依赖;Binder需预定义AIDL接口产生强编译依赖。 - **性能场景**:信号与槽适合高频率事件(如UI更新);Binder适合低频跨进程调用(如系统服务)。 - **语言特性**:信号与槽依赖Qt元对象编译器(MOC);Binder依赖Android接口定义语言(AIDL)[^1]。 --- ### 信号与槽是否基于观察者模式? **是的**,本质是观察者模式的增强实现: 1. **观察者角色**:槽函数(Subscriber)订阅信号(Subject) 2. **解耦改进**: - 观察者模式需显式维护订阅列表 → 信号与槽通过`QObject::connect()`自动管理 - 支持**参数类型安全转换**(如`QString`自动转`QVariant`) - 允许**槽函数参数少于信号参数**(自动忽略多余参数) ```cpp // 信号:void mySignal(int, QString) // 槽:void mySlot(int) // 仅接收第一个参数 QObject::connect(sender, &Sender::mySignal, receiver &Receiver::mySlot); ``` --- ### Smalltalk语言的历史与影响 - **起源**:1970年代Xerox PARC开发,首个完整面向对象语言 - **关键特性**: - *"一切皆对象"*(包括控制流) - 动态类型 + 消息传递范式(`[receiver message: arg]`) - **对Qt的影响**: - 信号与槽的消息传递机制借鉴Smalltalk的*消息发送* - Qt元对象系统受Smalltalk运行时反射启发 - MVC模式直接继承(Qt的Model/View架构) --- ### 回调函数签名匹配为何导致强耦合? 回调函数的**签名严格匹配**造成耦合: ```c // 传统C回调 - 需精确匹配函数指针类型 typedef void (*Callback)(int, char*); void register_callback(Callback cb); // 固定签名 ``` 1. **接口冻结**:回调方必须按固定参数格式实现 2. **依赖传导**:修改回调签名需所有调用方同步修改 3. **无法扩展**:添加新参数需破坏现有接口 → **信号与槽的解决方案**: - 参数兼容性(槽可忽略多余参数) - Qt元系统自动处理参数转换(如`QVariant`封装) --- ### 信号与槽参数兼容性的意义 **核心价值:降低组件升级成本** ```cpp // V1.0 信号:void dataUpdated(int size) QObject::connect(obj, &Obj::dataUpdated, [](int size){...}); // V2.0 扩展信号:void dataUpdated(int size, QDateTime ts) // 旧槽函数依然兼容!无需修改调用方 ``` ▼ 实现原理: - Qt在连接时生成**类型映射表** - 槽函数执行时动态裁剪参数队列 - 支持隐式类型转换(如`int` → `double`) --- ### Qt中connect函数的不同写法及原因 | **写法** | **语法** | **适用场景** | |-----------------------------------|--------------------------------------------------------------------------|--------------------------------| | **Qt4风格** | `connect(btn, SIGNAL(clicked()), label, SLOT(clear()))` | 兼容老代码,编译时不检查存在性 | | **Qt5函数指针** | `connect(btn, &QPushButton::clicked, label, &QLabel::clear)` | 类型安全,C++11标准(推荐) | | **Lambda表达式** | `connect(btn, &QPushButton::clicked, [=](){ label->clear(); });` | 临时槽/闭包处理 | | **QueuedConnection跨线程** | `connect(obj1, &Obj::sig, obj2, &Obj::slot, Qt::QueuedConnection)` | 线程安全通信 | ▼ **演变动因**: 1. Qt5引入函数指针语法 → 解决SIGNAL/SLOT宏的**运行时错误风险** 2. Lambda支持 → 减少显式槽函数声明(尤其一次性回调) 3. QueuedConnection显式指定 → 避免线程竞争 --- ### C++ Lambda表达式的捕获机制 Lambda通过`[]`定义捕获方式: ```cpp int x = 10; QObject obj; // 值捕获 [=] auto lambda1 = [=](){ qDebug() << x; }; // 复制x的值(x=10) // 引用捕获 [&] auto lambda2 = [&](){ x++; }; // 直接修改外部x // 混合捕获 [x, &obj] auto lambda3 = [x, &obj](){ obj.setProperty(x); }; // 初始化捕获 (C++14) auto lambda4 = [y = x*2](){ return y; }; // y=20 ``` ▼ **关键规则**: 1. `[=]`:捕获所有外部变量**副本**(编译时确定值) 2. `[&]`:捕获所有外部变量**引用**(运行时动态绑定) 3. **隐式捕获禁用**:对象生命周期需手动管理(尤其跨线程时) 4. `mutable`关键字:允许修改值捕获的变量(默认const) --- ### 相关问题 1. Qt信号与槽在跨线程通信时如何避免死锁? 2. Binder机制为何要设计**传输接口**(如Parcel类)而不直接共享内存? 3. Lambda表达式的捕获列表如何影响Qt对象的生命周期管理? 4. 观察者模式在分布式系统中有什么局限性? 5. 如何实现信号与槽的**自动断开连接**防止野指针? [^1]: 抽象数据类型和泛型编程在C++高性能场景中的价值(引自参考站内文献)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值