从零开始理解AdaBoost算法:前向分布算法(四)【数学推导】

2024-06-11 10:28

本文主要是介绍从零开始理解AdaBoost算法:前向分布算法(四)【数学推导】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理解 AdaBoost 算法的原理

在理解 AdaBoost 算法原理的过程中,两个关键问题需要注意:

  1. 权重是如何由分类误差决定的。
  2. 如何调整前一轮错误和正确的样本的权值。

优化问题

AdaBoost 解决的是二分类问题,数据集表示为:
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } T = \{(x_1, y_1), (x_2, y_2), \ldots, (x_N, y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}
其中, y i ∈ { − 1 , + 1 } y_i \in \{-1, +1\} yi{1,+1}

模型

AdaBoost 使用的是加法模型:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^{M} \alpha_m G_m(x) f(x)=m=1MαmGm(x)

化成递推式
f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m(x) = f_{m-1}(x) + \alpha_m G_m(x) fm(x)=fm1(x)+αmGm(x)

最终分类器为:
G ( x ) = sign [ f ( x ) ] G(x) = \text{sign}[f(x)] G(x)=sign[f(x)]
sign 函数如下所示:

  • f ( x ) ≥ 0 f(x) \ge 0 f(x)0 G ( x ) = 1 G(x) = 1 G(x)=1
  • f ( x ) < 0 f(x) < 0 f(x)<0 G ( x ) = − 1 G(x) = -1 G(x)=1
    在这里插入图片描述

损失函数

使用的是指数损失函数:
L ( y , f ( x ) ) = exp ⁡ [ − y f ( x ) ] L(y , f(x)) = \exp[-y f(x)] L(y,f(x))=exp[yf(x)]
在这里插入图片描述

G ( x ) G(x) G(x) 分类正确时, f ( x ) f(x) f(x) y y y 同号, − y f ( x ) < 0 -y f(x) < 0 yf(x)<0 L ( y , f ( x ) ) ≤ 1 L(y , f(x)) \le 1 L(y,f(x))1
G ( x ) G(x) G(x) 分类错误时, f ( x ) f(x) f(x) y y y 异号, − y f ( x ) > 0 -y f(x) > 0 yf(x)>0 L ( y , f ( x ) ) > 1 L(y , f(x)) > 1 L(y,f(x))>1

因此,指数函数的图像说明了分类正确时损失较小,分类错误时损失较大。

第一个巧思:损失函数视为权值

这个特性适合作为 AdaBoost 算法中调整权值的方法:对于 G m ( x ) G_m(x) Gm(x)如何提高前一轮错误的权值,降低正确的权值
w ˉ m i = exp ⁡ [ − y i f m − 1 ( x i ) ] \bar{w}_{m i}=\exp \left[-y_{i} f_{m-1}\left(x_{i}\right)\right] wˉmi=exp[yifm1(xi)]

单个样本的损失函数

L ( y , f m ( x ) ) = exp ⁡ [ − y f m ( x ) ] L(y , f_m(x)) = \exp[-y f_m(x)] L(y,fm(x))=exp[yfm(x)]
带入加法模型 f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^{M} \alpha_m G_m(x) f(x)=m=1MαmGm(x) 得到,
L ( y , f m ( x ) ) = exp ⁡ [ − y ∑ m = 1 M α m G m ( x ) ] L(y , f_m(x)) = \exp[-y \sum_{m=1}^{M} \alpha_m G_m(x)] L(y,fm(x))=exp[ym=1MαmGm(x)]
展开后得到,
L ( y , f m ( x ) ) = exp ⁡ [ − y ( f m − 1 ( x ) + α m G m ( x ) ) ] L(y , f_m(x)) = \exp[-y ( f_{m-1}(x) + \alpha_m G_m(x))] L(y,fm(x))=exp[y(fm1(x)+αmGm(x))]

总体损失函数

将所有样本放进去:
∑ i = 1 N exp ⁡ [ − y i ( f m − 1 ( x i ) + α G m ( x i ) ) ] \sum_{i = 1}^{N} \exp[-y_i ( f_{m-1}(x_i) + \alpha G_m(x_i))] i=1Nexp[yi(fm1(xi)+αGm(xi))]

前向分布算法

理解损失函数后,需要使用前向分布算法对其进行优化:
( β m , γ m ) = arg ⁡ min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m, \gamma_m) = \arg\min_{\beta,\gamma} \sum_{i=1}^{N} L(y_i, f_{m-1}(x_i) + \beta b(x_i;\gamma)) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))

在第 m 轮时,
( α m , γ m ) = arg ⁡ min ⁡ α , γ ∑ i = 1 N exp ⁡ [ − y i ( f m − 1 ( x i ) + α G m ( x i ) ) ] (\alpha_m, \gamma_m) = \arg\min_{\alpha,\gamma} \sum_{i = 1}^{N} \exp[-y_i ( f_{m-1}(x_i) + \alpha G_m(x_i))] (αm,γm)=argα,γmini=1Nexp[yi(fm1(xi)+αGm(xi))]

式子变换

使用指数运算法则 e a + b = e a ∗ e b e^{a+b} = e^a * e^b ea+b=eaeb 进行变换,得到:
( α m , γ m ) = arg ⁡ min ⁡ α , γ ∑ i = 1 N exp ⁡ [ − y i ( f m − 1 ( x i ) ) ] exp ⁡ [ − y i α G m ( x i ) ] (\alpha_m, \gamma_m) = \arg\min_{\alpha,\gamma} \sum_{i = 1}^{N} \exp[-y_i ( f_{m-1}(x_i))] \exp[-y_i \alpha G_m(x_i)] (αm,γm)=argα,γmini=1Nexp[yi(fm1(xi))]exp[yiαGm(xi)]

exp ⁡ [ − y i ( f m − 1 ( x i ) ) ] \exp[-y_i ( f_{m-1}(x_i))] exp[yi(fm1(xi))] 视为权值:
( α m , γ m ) = arg ⁡ min ⁡ α , γ ∑ i = 1 N w ˉ m i exp ⁡ [ − y i α G m ( x i ) ] (\alpha_m, \gamma_m) = \arg\min_{\alpha,\gamma} \sum_{i = 1}^{N} \bar{w}_{m i} \exp[-y_i \alpha G_m(x_i)] (αm,γm)=argα,γmini=1Nwˉmiexp[yiαGm(xi)]

继续分析式子, G m ( x i ) G_m(x_i) Gm(xi) 有两个取值可能:

  • G m ( x i ) = y i G_m(x_i) = y_i Gm(xi)=yi
  • G m ( x i ) ≠ y i G_m(x_i) \ne y_i Gm(xi)=yi

进一步展开,划分为两类:
( α m , γ m ) = arg ⁡ min ⁡ α , γ ( ∑ y i = G ( x i ) w ˉ m i exp ⁡ ( − α ) + ∑ y i ≠ G ( x i ) w ˉ m i exp ⁡ ( α ) ) (\alpha_m, \gamma_m) = \arg\min_{\alpha,\gamma} (\sum_{y_i = G(x_i)} \bar{w}_{m i} \exp(-\alpha) + \sum_{y_i \ne G(x_i)} \bar{w}_{m i} \exp(\alpha)) (αm,γm)=argα,γmin(yi=G(xi)wˉmiexp(α)+yi=G(xi)wˉmiexp(α))

化简得到,
( α m , γ m ) = arg ⁡ min ⁡ α , γ ( exp ⁡ ( − α ) ∑ y i = G ( x i ) w ˉ m i + exp ⁡ ( α ) ∑ y i ≠ G ( x i ) w ˉ m i ) (\alpha_m, \gamma_m) = \arg\min_{\alpha,\gamma} (\exp(-\alpha) \sum_{y_i = G(x_i)} \bar{w}_{m i} + \exp(\alpha) \sum_{y_i \ne G(x_i)} \bar{w}_{m i}) (αm,γm)=argα,γmin(exp(α)yi=G(xi)wˉmi+exp(α)yi=G(xi)wˉmi)

求解

优化 G m ( x ) G_m(x) Gm(x)

当分类误差率最小时,得到最优的 (G_m(x)):
G m ∗ ( x ) = arg ⁡ min ⁡ G ∑ i = 1 N w ˉ m i I ( y i ≠ G ( x i ) ) G_m^*(x) = \arg\min_{G} \sum_{i = 1}^{N} \bar{w}_{m i} I (y_i \ne G(x_i)) Gm(x)=argGmini=1NwˉmiI(yi=G(xi))
其中 I I I 函数在条件 y i ≠ G ( x i ) y_i \ne G(x_i) yi=G(xi) 成立时为 1。

  1. G m ∗ ( x ) G_m^*(x) Gm(x): 表示在第 (m) 轮迭代中找到的最优分类器。
  2. arg ⁡ min ⁡ G \arg\min_{G} argminG: 表示找到使目标函数达到最小值的 G G G
  3. ∑ i = 1 N w ˉ m i I ( y i ≠ G ( x i ) ) \sum_{i = 1}^{N} \bar{w}_{m i} I (y_i \ne G(x_i)) i=1NwˉmiI(yi=G(xi)): 表示加权分类误差率的总和。

公式的目标是通过选择合适的分类器 G ( x ) G(x) G(x) 来最小化加权分类误差率。其中,加权分类误差率由权重 w ˉ m i \bar{w}_{m i} wˉmi 和指标函数 I ( y i ≠ G ( x i ) ) I(y_i \ne G(x_i)) I(yi=G(xi)) 决定。

具体步骤
  1. 权重 w ˉ m i \bar{w}_{m i} wˉmi: 每个样本 x i x_i xi 在第 m m m 轮迭代中的权重,表示该样本的重要性。权重越大,分类器 (G) 对该样本分类错误的代价越高。
  2. 指标函数 I ( y i ≠ G ( x i ) ) I(y_i \ne G(x_i)) I(yi=G(xi)): 如果 y i y_i yi(实际标签)不等于 G ( x i ) G(x_i) G(xi)(分类器的预测标签),则 I I I 函数的值为 1,否则为 0。换句话说, I ( y i ≠ G ( x i ) ) I(y_i \ne G(x_i)) I(yi=G(xi)) 表示分类错误的样本数。
  3. 最小化加权分类误差率: 通过调整分类器 G ( x ) G(x) G(x),使得加权分类误差率(即权重和分类错误样本数的乘积的总和)最小化。

因此,这个公式表示在所有可能的分类器 G ( x ) G(x) G(x) 中,找到一个分类器 G m ∗ ( x ) G_m^*(x) Gm(x),使得在加权数据集上的分类错误最少。

示例扩展

为了更好地理解这个公式,可以考虑一个简单的例子:

假设我们有一个包含 5 个样本的数据集,每个样本的初始权重 w ˉ 1 i \bar{w}_{1i} wˉ1i 均为 0.2(即每个样本权重相等)。在第一轮迭代中,我们要找到一个分类器 G 1 ( x ) G_1(x) G1(x),使得加权分类误差率最小。

假设我们有以下数据集:

  • 样本 x 1 , x 2 , x 3 , x 4 , x 5 x_1, x_2, x_3, x_4, x_5 x1,x2,x3,x4,x5
  • 标签 y 1 = 1 , y 2 = − 1 , y 3 = 1 , y 4 = − 1 , y 5 = 1 y_1 = 1, y_2 = -1, y_3 = 1, y_4 = -1, y_5 = 1 y1=1,y2=1,y3=1,y4=1,y5=1

假设一个分类器 G ( x ) G(x) G(x) 预测 y i y_i yi y ^ i \hat{y}_i y^i。我们需要计算加权分类误差率:
∑ i = 1 5 w ˉ 1 i I ( y i ≠ G ( x i ) ) \sum_{i = 1}^{5} \bar{w}_{1i} I(y_i \ne G(x_i)) i=15wˉ1iI(yi=G(xi))

假设分类器 G 1 ( x ) G_1(x) G1(x) 的预测结果如下:

  • y ^ 1 = 1 , y ^ 2 = 1 , y ^ 3 = − 1 , y ^ 4 = − 1 , y ^ 5 = 1 \hat{y}_1 = 1, \hat{y}_2 = 1, \hat{y}_3 = -1, \hat{y}_4 = -1, \hat{y}_5 = 1 y^1=1,y^2=1,y^3=1,y^4=1,y^5=1

根据公式,分类误差率计算为:
w ˉ 11 ⋅ 0 + w ˉ 12 ⋅ 1 + w ˉ 13 ⋅ 1 + w ˉ 14 ⋅ 0 + w ˉ 15 ⋅ 0 \bar{w}_{11} \cdot 0 + \bar{w}_{12} \cdot 1 + \bar{w}_{13} \cdot 1 + \bar{w}_{14} \cdot 0 + \bar{w}_{15} \cdot 0 wˉ110+wˉ121+wˉ131+wˉ140+wˉ150
即:
0.2 ⋅ 0 + 0.2 ⋅ 1 + 0.2 ⋅ 1 + 0.2 ⋅ 0 + 0.2 ⋅ 0 = 0.4 0.2 \cdot 0 + 0.2 \cdot 1 + 0.2 \cdot 1 + 0.2 \cdot 0 + 0.2 \cdot 0 = 0.4 0.20+0.21+0.21+0.20+0.20=0.4

我们通过选择不同的分类器 G ( x ) G(x) G(x),使加权分类误差率最小化。例如,如果选择另一个分类器 G 2 ( x ) G_2(x) G2(x) 的预测结果如下:

  • y ^ 1 = 1 , y ^ 2 = − 1 , y ^ 3 = 1 , y ^ 4 = − 1 , y ^ 5 = 1 \hat{y}_1 = 1, \hat{y}_2 = -1, \hat{y}_3 = 1, \hat{y}_4 = -1, \hat{y}_5 = 1 y^1=1,y^2=1,y^3=1,y^4=1,y^5=1

计算误差率:
w ˉ 11 ⋅ 0 + w ˉ 12 ⋅ 0 + w ˉ 13 ⋅ 0 + w ˉ 14 ⋅ 0 + w ˉ 15 ⋅ 0 = 0 \bar{w}_{11} \cdot 0 + \bar{w}_{12} \cdot 0 + \bar{w}_{13} \cdot 0 + \bar{w}_{14} \cdot 0 + \bar{w}_{15} \cdot 0 = 0 wˉ110+wˉ120+wˉ130+wˉ140+wˉ150=0

在这种情况下,分类器 G 2 ( x ) G_2(x) G2(x) 使加权分类误差率为 0,因此 G 2 ( x ) G_2(x) G2(x) G 1 ( x ) G_1(x) G1(x) 更优。

第二个巧思:优化 α m \alpha_m αm

α m \alpha_m αm G m ( x ) G_m(x) Gm(x) 的分类误差率决定:
arg ⁡ min ⁡ α m ( exp ⁡ ( − α ) ∑ i = 1 N w ˉ m i + ( exp ⁡ ( α ) − exp ⁡ ( − α ) ) ∑ y i ≠ G ( x i ) w ˉ m i ) \arg\min_{\alpha_m} (\exp(-\alpha) \sum_{i = 1}^N \bar{w}_{m i} + (\exp(\alpha) - \exp(-\alpha)) \sum_{y_i \ne G(x_i)} \bar{w}_{m i}) argαmmin(exp(α)i=1Nwˉmi+(exp(α)exp(α))yi=G(xi)wˉmi)

求导
∂ ( e − α m ∑ i = 1 N w ˉ m i + ( e α m − e − α m ) ∑ y i ≠ G ( x i ) w ˉ m i ) ∂ α m = − e − α m ∑ i = 1 N w ˉ m i + e α m ∑ y i ≠ G ( x i ) w ˉ m i + e − α m ∑ y i ≠ G ( x i ) w ˉ m i ) \frac{\partial (\ e^{-\alpha_m} \sum_{i = 1}^N \bar{w}_{m i} + (e^{\alpha_m} - e^{-\alpha_m} ) \sum_{y_i \ne G(x_i)} \bar{w}_{m i} \ )}{\partial \alpha_m} = -e^{-\alpha_m} \sum_{i = 1}^N \bar{w}_{m i} + e^{\alpha_m} \sum_{y_i \ne G(x_i)} \bar{w}_{m i} + e^{-\alpha_m} \sum_{y_i \ne G(x_i)} \bar{w}_{m i} ) αm( eαmi=1Nwˉmi+(eαmeαm)yi=G(xi)wˉmi )=eαmi=1Nwˉmi+eαmyi=G(xi)wˉmi+eαmyi=G(xi)wˉmi)

合并同类项得到,
= − e − α m ( ∑ i = 1 N w ˉ m i − ∑ y i ≠ G ( x i ) w ˉ m i ) + e α m ∑ y i ≠ G ( x i ) w ˉ m i = -e^{-\alpha_m} ( \sum_{i = 1}^N \bar{w}_{m i} - \sum_{y_i \ne G(x_i)} \bar{w}_{m i} ) + e^{\alpha_m} \sum_{y_i \ne G(x_i)} \bar{w}_{m i} =eαm(i=1Nwˉmiyi=G(xi)wˉmi)+eαmyi=G(xi)wˉmi
第一个式子中的 ∑ i = 1 N w ˉ m i − ∑ y i ≠ G ( x i ) w ˉ m i \sum_{i = 1}^N \bar{w}_{m i} - \sum_{y_i \ne G(x_i)} \bar{w}_{m i} i=1Nwˉmiyi=G(xi)wˉmi意味着,全样本减去错误分类的样本,最后得到的就是分类正确的样本,因此。
= − e − α m ∑ y i = G ( x i ) w ˉ m i + e α m ∑ y i ≠ G ( x i ) w ˉ m i = -e^{-\alpha_m} \sum_{y_i = G(x_i)} \bar{w}_{m i} + e^{\alpha_m} \sum_{y_i \ne G(x_i)} \bar{w}_{m i} =eαmyi=G(xi)wˉmi+eαmyi=G(xi)wˉmi

导数为0
令求导结果为0,得到,
e α m ∑ y i ≠ G ( x i ) w ˉ m i = e − α m ∑ y i = G ( x i ) w ˉ m i e^{\alpha_m} \sum_{y_i \ne G(x_i)} \bar{w}_{m i} = e^{-\alpha_m} \sum_{y_i = G(x_i)} \bar{w}_{m i} eαmyi=G(xi)wˉmi=eαmyi=G(xi)wˉmi

化简并求解,得到:
α m = 1 2 ln ⁡ ∑ y i = G ( x i ) w ˉ m i ∑ y i ≠ G ( x i ) w ˉ m i \alpha_m = \frac{1}{2} \ln \frac{\sum_{y_i = G(x_i)} \bar{w}_{m i}}{\sum_{y_i \ne G(x_i)} \bar{w}_{m i}} αm=21lnyi=G(xi)wˉmiyi=G(xi)wˉmi

进一步,分子分母同除 所有样本的权值之和 ∑ i = 1 N w ˉ m i \sum_{i = 1}^{N} \bar{w}_{m i} i=1Nwˉmi ,得到;
α m = 1 2 ln ⁡ ∑ i = 1 N w ˉ m i ∑ i = 1 N w ˉ m i − ∑ y i ≠ G ( x i ) w ˉ m i ∑ i = 1 N w ˉ m i ∑ y i ≠ G ( x i ) w ˉ m i ∑ i = 1 N w ˉ m i \alpha_m = \frac{1}{2} \ln \frac{ \frac{\sum_{i = 1}^{N} \bar{w}_{m i}}{\sum_{i = 1}^{N} \bar{w}_{m i}} - \frac{\sum_{y_i \ne G(x_i)} \bar{w}_{m i} }{\sum_{i = 1}^{N} \bar{w}_{m i}} }{ \frac{\sum_{y_i \ne G(x_i)} \bar{w}_{m i} }{\sum_{i = 1}^{N} \bar{w}_{m i}}} αm=21lni=1Nwˉmiyi=G(xi)wˉmii=1Nwˉmii=1Nwˉmii=1Nwˉmiyi=G(xi)wˉmi

其中 ∑ y i ≠ G ( x i ) w ˉ m i ∑ i = 1 N w ˉ m i \frac{\sum_{y_i \ne G(x_i)} \bar{w}_{m i} }{\sum_{i = 1}^{N} \bar{w}_{m i}} i=1Nwˉmiyi=G(xi)wˉmi为分类错误的点的权值之和 除以 所有样本的权值——分类误差率 e m e_m em,最终得到
1 2 l n 1 − e m e m \frac{1}{2} ln\frac{1-e_m}{e_m} 21lnem1em

因此,
α m = 1 2 l n 1 − e m e m \alpha_m = \frac{1}{2} ln\frac{1-e_m}{e_m} αm=21lnem1em

满足我们的要求:分类误差率越大, α m \alpha_m αm越小;

前向更新 f m ( x ) f_m(x) fm(x)

f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m(x) = f_{m-1}(x) + \alpha_m G_m(x) fm(x)=fm1(x)+αmGm(x)
在前一步的基础上,加上当前的训练的权重

更新训练数据权值 w ˉ m + 1 , i \bar{w}_{m+1,i} wˉm+1,i

前面我们说过,我们是使用指数损失函数来替代权值的,所以我们直接带入即可求得;

根据原始公式
w ˉ m i = exp ⁡ [ − y i f m − 1 ( x i ) ] \bar{w}_{m i}=\exp \left[-y_{i} f_{m-1}\left(x_{i}\right)\right] wˉmi=exp[yifm1(xi)]

我们有,
w ˉ m + 1 , i = exp ⁡ [ − y i f m ( x i ) ] \bar{w}_{m+1, i}=\exp \left[-y_{i} f_{m}\left(x_{i}\right)\right] wˉm+1,i=exp[yifm(xi)]

带入 f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m(x) = f_{m-1}(x) + \alpha_m G_m(x) fm(x)=fm1(x)+αmGm(x),得到

w ˉ m + 1 , i = exp ⁡ − y i ( f m − 1 ( x i ) + α m G m ( x i ) ) \bar{w}_{m+1, i}=\exp -y_{i} ( f_{m-1}(x_i) + \alpha_m G_m(x_i) ) wˉm+1,i=expyi(fm1(xi)+αmGm(xi))

展开得到,
w ˉ m + 1 , i = exp ⁡ [ − y i f m − 1 ( x i ) ] ∗ exp ⁡ − y i α m G m ( x i ) \bar{w}_{m+1, i}=\exp [-y_{i} f_{m-1}(x_i)] * \exp -y_{i} \alpha_m G_m(x_i) wˉm+1,i=exp[yifm1(xi)]expyiαmGm(xi)

带入原始式子 w ˉ m i = exp ⁡ [ − y i f m − 1 ( x i ) ] \bar{w}_{m i}=\exp \left[-y_{i} f_{m-1}\left(x_{i}\right)\right] wˉmi=exp[yifm1(xi)] ,我们得到
w ˉ m + 1 , i = w ˉ m i ∗ [ exp ⁡ − y i α m G m ( x i ) ] \bar{w}_{m+1, i}=\bar{w}_{m i} * [ \exp -y_{i} \alpha_m G_m(x_i) ] wˉm+1,i=wˉmi[expyiαmGm(xi)]

参考链接:6.【Adaboost】算法原理解析_哔哩哔哩_bilibili

这篇关于从零开始理解AdaBoost算法:前向分布算法(四)【数学推导】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050901

相关文章

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。