《8.3.2 前向分步算法与 AdaBoost》最小α公式如何通过简化得到的

server/2024/11/28 17:44:42/

本文是将文章《8.3.2 前向分步算法AdaBoost》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。


α m ∗ = 1 2 log ⁡ 1 − e m e m \alpha_m^* = \frac{1}{2} \log \frac{1 - e_m}{e_m} αm=21logem1em


我们从公式 ( 8.22 ) (8.22) (8.22) 开始,详细列出将 G m ∗ ( x ) G_m^*(x) Gm(x) 代入后并一步步化简的过程。

公式 ( 8.22 ) (8.22) (8.22)

首先,公式 ( 8.22 ) (8.22) (8.22) 的初始形式为:

∑ i = 1 N w m i exp ⁡ ( − y i α G ( x i ) ) = ( e α − e − α ) ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) + e − α ∑ i = 1 N w m i \sum_{i=1}^N w_{mi} \exp(-y_i \alpha G(x_i)) = (e^{\alpha} - e^{-\alpha}) \sum_{i=1}^N w_{mi} I(y_i \neq G(x_i)) + e^{-\alpha} \sum_{i=1}^N w_{mi} i=1Nwmiexp(yiαG(xi))=(eαeα)i=1NwmiI(yi=G(xi))+eαi=1Nwmi

其中:

  • G ( x ) G(x) G(x) 是一个弱分类器。
  • w m i w_{mi} wmi 是样本 x i x_i xi 的权重。
  • I ( y i ≠ G ( x i ) ) I(y_i \neq G(x_i)) I(yi=G(xi)) 是指示函数,当 y i ≠ G ( x i ) y_i \neq G(x_i) yi=G(xi) 时取 1,否则取 0。

1. 将 G m ∗ ( x ) G_m^*(x) Gm(x) 代入公式 ( 8.22 ) (8.22) (8.22)

已知 G m ∗ ( x ) G_m^*(x) Gm(x) 是在第 m m m 轮使分类误差最小的弱分类器,因此将 G ( x ) G(x) G(x) 替换为 G m ∗ ( x ) G_m^*(x) Gm(x),公式变为:

∑ i = 1 N w m i exp ⁡ ( − y i α G m ∗ ( x i ) ) = ( e α − e − α ) ∑ i = 1 N w m i I ( y i ≠ G m ∗ ( x i ) ) + e − α ∑ i = 1 N w m i \sum_{i=1}^N w_{mi} \exp(-y_i \alpha G_m^*(x_i)) = (e^{\alpha} - e^{-\alpha}) \sum_{i=1}^N w_{mi} I(y_i \neq G_m^*(x_i)) + e^{-\alpha} \sum_{i=1}^N w_{mi} i=1Nwmiexp(yiαGm(xi))=(eαeα)i=1NwmiI(yi=Gm(xi))+eαi=1Nwmi

接下来我们简化公式中的各项。

2. 定义分类误差率 e m e_m em

定义当前弱分类器 G m ∗ ( x ) G_m^*(x) Gm(x) 的加权分类误差率为:

e m = ∑ i = 1 N w m i I ( y i ≠ G m ∗ ( x i ) ) e_m = \sum_{i=1}^N w_{mi} I(y_i \neq G_m^*(x_i)) em=i=1NwmiI(yi=Gm(xi))

在这个定义下,公式可以重写为:

∑ i = 1 N w m i exp ⁡ ( − y i α G m ∗ ( x i ) ) = ( e α − e − α ) e m + e − α ∑ i = 1 N w m i \sum_{i=1}^N w_{mi} \exp(-y_i \alpha G_m^*(x_i)) = (e^{\alpha} - e^{-\alpha}) e_m + e^{-\alpha} \sum_{i=1}^N w_{mi} i=1Nwmiexp(yiαGm(xi))=(eαeα)em+eαi=1Nwmi

3. 求解总权重和

权重 w m i w_{mi} wmi 是在上一轮(即第 m − 1 m-1 m1 轮)归一化过的权重,因此满足:

∑ i = 1 N w m i = 1 \sum_{i=1}^N w_{mi} = 1 i=1Nwmi=1

于是公式可以进一步简化为:

∑ i = 1 N w m i exp ⁡ ( − y i α G m ∗ ( x i ) ) = ( e α − e − α ) e m + e − α \sum_{i=1}^N w_{mi} \exp(-y_i \alpha G_m^*(x_i)) = (e^{\alpha} - e^{-\alpha}) e_m + e^{-\alpha} i=1Nwmiexp(yiαGm(xi))=(eαeα)em+eα

4. 对 α \alpha α 求导,找到最优 α m \alpha_m αm

我们希望找到一个最优的 α \alpha α 值,使得上式的损失最小。为此,对 α \alpha α 求导并令其等于 0。

将公式记为:

f ( α ) = ( e α − e − α ) e m + e − α f(\alpha) = (e^{\alpha} - e^{-\alpha}) e_m + e^{-\alpha} f(α)=(eαeα)em+eα

f ( α ) f(\alpha) f(α) 关于 α \alpha α 求导,得到:

f ′ ( α ) = e α e m + e − α e m − e − α f'(\alpha) = e^{\alpha} e_m + e^{-\alpha} e_m - e^{-\alpha} f(α)=eαem+eαemeα

令导数等于 0:

e α e m + e − α e m − e − α = 0 e^{\alpha} e_m + e^{-\alpha} e_m - e^{-\alpha} = 0 eαem+eαemeα=0

移项得到:

e α e m = e − α ( 1 − e m ) e^{\alpha} e_m = e^{-\alpha} (1 - e_m) eαem=eα(1em)

两边同时乘以 e α e^{\alpha} eα 得:

e 2 α e m = 1 − e m e^{2\alpha} e_m = 1 - e_m e2αem=1em

解出 e α e^{\alpha} eα

e α = 1 − e m e m e^{\alpha} = \sqrt{\frac{1 - e_m}{e_m}} eα=em1em

取对数,得到:

α m = 1 2 log ⁡ 1 − e m e m \alpha_m = \frac{1}{2} \log \frac{1 - e_m}{e_m} αm=21logem1em

最终结果

我们得到了最优的 α m \alpha_m αm 值为:

α m = 1 2 log ⁡ 1 − e m e m \alpha_m = \frac{1}{2} \log \frac{1 - e_m}{e_m} αm=21logem1em

这个结果表明了在给定分类器 G m ∗ ( x ) G_m^*(x) Gm(x) 的情况下,权重 α m \alpha_m αm 的计算公式。


http://www.ppmy.cn/server/137688.html

相关文章

LeetCode23:合并K个升序链表

原题地址:. - 力扣(LeetCode) 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] …

【每日C/C++问题】

一、C/C中数组定义和初始化的方式有哪些? int arr[100]; // 定义了数组arr,并未对数组进行初始化int arr[100] {1, 2}; // 定义并初始化了数组arr前两个元素,其他元素为0int arr[3] {1, 2, 3}; // 定义并初始化了数组arr所有元素int arr[]…

SpringBoot集成ELK收集日志管理

ELK集成是没有代码侵入的,主要是吃服务器内存,只需要部署启动这三个服务,然后项目的资源日志配置指定日志输出到 logstash服务器就可以了。 1、好处就是开发人员不用依赖服务器来定位异常了,服务器一般需要借助VPN登录&#xff0…

我在命令行下学日语

同一个动作重复 300 遍,肌肉就会有记忆,重复 600 遍,脊柱就会有记忆,学完五十音图不熟练,经常遗忘或者要好几秒才想得起来一个怎么办?没关系,我做了个命令行下的小游戏 KanaQuiz 来帮助你记忆&a…

ubuntu启动慢,如何看启动耗时分布

ubuntu启动慢,如何看启动耗时分布 在Ubuntu系统中,如果您想检查启动过程中每个过程的耗时分布,可以使用systemd-analyze工具。这个工具可以帮助您诊断启动过程中哪些服务或步骤占用了较多时间。 查看总体启动时间: 要查看系统启动…

Angular中ChangeDetectorRef.detectChanges是如何实现的,对比vue种的nextTick有何不同

ChangeDetectorRef.detectChanges的介绍: ChangeDetectorRef.detectChanges() 是 Angular 中用于手动触发变更检测的方法。它的主要作用是立即检查组件的视图和数据绑定,更新界面以反映模型数据的变化。detectChanges() 是通过 Angular 的变更检测机制来…

Python基础保姆级讲解(3)

条件语句 1.if if condition: # 当条件为真时执行这里的代码,否则不执行这里 year1993 if year%40:print("year能被4整除")2.if-else if condition: # 当条件为真时执行这里的代码 else: # 如果前面的条件都为假,执行这里的代码 year1993 if yea…

优化低代码开发平台用户体验:功能树导航设计探讨

功能树的构建与应用在当今快速发展的软件开发环境中,低代码开发平台因其简化开发流程和提高开发效率而受到广泛关注。低代码开发平台中的导航功能通常以功能树的形式呈现,帮助用户快速找到所需的功能模块。功能树是一种层次结构,展示了各个功…