Boosted Trees 介绍

news2024/10/7 4:28:36

Boosted Trees 介绍

文章目录

  • Boosted Trees 介绍
    • 监督学习要素
      • 模型和参数
      • 目标函数:训练损失 + 正则化
      • 为什么介绍一般原则?
    • 决策树集成
    • Tree Boosting
      • Additive Training
      • Model Complexity
      • The Structure Score
      • Learn the tree structure
    • 关于 XGBoost 的最后话语

官方地址原文介绍:https://github.com/dmlc/xgboost.git

Boosted Trees 是一种机器学习算法,它使用多棵决策树来提高模型的预测准确性。Boosted Trees 的主要思想是将多棵树组合起来,以提高模型的泛化能力和鲁棒性。Boosted Trees 是一种通用的机器学习算法,可以使用不同的损失函数和优化算法来实现。随机森林通过构建多个相互独立的决策树来形成一个强学习器。提升树通过逐步构建多个决策树,每棵新树尝试修正前一棵树的错误预测。

XGBoost 是一种具体的 Boosted Trees 算法实现,它是由 Tianqi Chen 等人在 2014 年开发的。XGBoost 是一个开源的机器学习库,提供了一个高效、可扩展的 Boosted Trees 实现。XGBoost 使用了许多技术来提高模型的性能,例如二阶梯度优化、列抽样、并行计算等。

XGBoost 代表“Extreme Gradient Boosting”,其中“Gradient Boosting”一词源自 Friedman 的论文 Greedy Function Approximation: A Gradient Boosting Machine。XGBoost 是一个优化的分布式梯度提升库,旨在高效、灵活和便携。 它在 Gradient Boosting 框架下实现机器学习算法。 XGBoost 提供了并行树提升(也称为 GBDT、GBM),可以快速准确地解决许多数据科学问题。 相同的代码在主要分布式环境(Kubernetes、Hadoop、SGE、Dask、Spark、PySpark)上运行,可以解决超过数十亿个示例的问题。

梯度提升树已经存在了一段时间,有很多相关的材料。本教程将使用监督学习的元素,以自包含和原则的方式解释提升树。我们认为这种解释更加清晰、正式,并激发了 XGBoost 中使用的模型公式。

监督学习要素

XGBoost 用于监督学习问题,其中我们使用训练数据(具有多个特征) x i x_i xi 来预测目标变量 y i y_i yi。在了解树之前,让我们先回顾一下监督学习中的基本要素。

模型和参数

监督学习中的模型通常指的是通过输入 x i x_i xi 进行预测 y i y_i yi 的数学结构。一个常见的例子是线性模型,其中预测值表示为 y ^ i = ∑ j θ j x i j \hat{y}_i = \sum_j \theta_j x_{ij} y^i=jθjxij,即加权输入特征的线性组合。预测值可以根据任务(即回归或分类)有不同的解释。例如,它可以通过逻辑变换得到逻辑回归中正类的概率,也可以在我们想要对输出进行排序时用作排名分数。

参数是我们需要从数据中学习的未确定部分。在线性回归问题中,参数是系数 θ \theta θ。通常我们会用 θ \theta θ 来表示参数(模型中有许多参数,我们在此的定义是宽松的)。

目标函数:训练损失 + 正则化

通过对 y i y_i yi 的合理选择,我们可以表示各种任务,例如回归、分类和排序。训练模型的任务是找到最适合训练数据 x i x_i xi 和标签 y i y_i yi 的最佳参数 θ \theta θ。为了训练模型,我们需要定义目标函数来衡量模型对训练数据的拟合程度。

目标函数的一个显著特征是它由两部分组成:训练损失正则化项

obj ( θ ) = L ( θ ) + Ω ( θ ) \text{obj}(\theta) = L(\theta) + \Omega(\theta) obj(θ)=L(θ)+Ω(θ)

其中 L L L 是训练损失函数,而 Ω \Omega Ω 是正则化项。训练损失衡量我们的模型相对于训练数据的预测能力。常用的 L L L均方误差,其公式为

L ( θ ) = ∑ i ( y i − y ^ i ) 2 L(\theta) = \sum_i (y_i-\hat{y}_i)^2 L(θ)=i(yiy^i)2

另一个常用的损失函数是用于逻辑回归的逻辑损失:

L ( θ ) = ∑ i [ y i ln ⁡ ( 1 + e − y ^ i ) + ( 1 − y i ) ln ⁡ ( 1 + e y ^ i ) ] L(\theta) = \sum_i[ y_i\ln (1+e^{-\hat{y}_i}) + (1-y_i)\ln (1+e^{\hat{y}_i})] L(θ)=i[yiln(1+ey^i)+(1yi)ln(1+ey^i)]

正则化项是人们通常忘记添加的部分。正则化项控制模型的复杂度,帮助我们避免过拟合。这个听起来有点抽象,所以让我们考虑以下图中的问题。你被要求根据图中左上角的数据点拟合一个阶跃函数。你认为哪种解决方案是最好的拟合?

step functions to fit data points, illustrating bias-variance tradeoff

正确答案用红色标记。请考虑这在视觉上是否是一个合理的拟合。一般原则是我们既想要一个简单具有预测性的模型。两者之间的权衡在机器学习中也被称为偏差-方差权衡

为什么介绍一般原则?

上面介绍的要素构成了监督学习的基本要素,它们是机器学习工具包的自然构件。例如,你应该能够描述梯度提升树和随机森林之间的差异和共同点。以正式化的方式理解这个过程也有助于我们理解我们在学习的目标以及诸如剪枝和平滑等启发式方法背后的原因。

决策树集成

现在我们已经介绍了监督学习的要素,让我们开始了解真实的树模型。首先,让我们了解 XGBoost 的模型选择:决策树集成。树集成模型由一组分类和回归树(CART)组成。以下是一个 CART 的简单示例,用于分类某人是否会喜欢假想的计算机游戏 X。

a toy example for CART

我们将一个家庭的成员分类到不同的叶子上,并在相应的叶子上赋予他们分数。CART 与决策树有点不同,决策树的叶子仅包含决策值。在 CART 中,每个叶子都关联一个实际分数,这为我们提供了超越分类的更丰富的解释。这也允许我们在优化时使用一种有原则的、统一的方法,如我们将在本教程后面部分看到的。

通常,单棵树不够强大,无法在实际中使用。实际使用的是集成模型,它将多棵树的预测结果相加。

a toy example for tree ensemble, consisting of two CARTs

这是一个由两棵树组成的树集成的示例。每棵树的预测分数相加得到最终分数。如果你看看这个示例,一个重要的事实是这两棵树试图互补。数学上,我们可以将模型写成以下形式

y ^ i = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y}_i = \sum_{k=1}^K f_k(x_i), f_k \in \mathcal{F} y^i=k=1Kfk(xi),fkF

其中 K K K 是树的数量, f k f_k fk 是函数空间 F \mathcal{F} F 中的一个函数, F \mathcal{F} F 是所有可能的 CART 的集合。要优化的目标函数为

obj ( θ ) = ∑ i n l ( y i , y ^ i ) + ∑ k = 1 K ω ( f k ) \text{obj}(\theta) = \sum_i^n l(y_i, \hat{y}_i) + \sum_{k=1}^K \omega(f_k) obj(θ)=inl(yi,y^i)+k=1Kω(fk)

其中 ω ( f k ) \omega(f_k) ω(fk) 是树 f k f_k fk 的复杂度,稍后将详细定义。

现在来个有趣的问题:随机森林使用的模型是什么?树集成!所以随机森林和提升树实际上是相同的模型;区别在于我们如何训练它们。这意味着,如果你为树集成写了一个预测服务,你只需写一个,它应该同时适用于随机森林和梯度提升树。(请参见 Treelite 了解实际示例。)这就是监督学习要素如此重要的一个例子。
树提升

Tree Boosting

现在我们介绍了模型,让我们来讨论训练:我们应该如何学习这些树?答案是,和所有监督学习模型一样:定义目标函数并优化它

以下是目标函数(记住它总是包含训练损失和正则化):
obj = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ i = 1 t ω ( f i ) \text{obj} = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t)}) + \sum_{i=1}^t\omega(f_i) obj=i=1nl(yi,y^i(t))+i=1tω(fi)

Additive Training

我们首先要问的问题是:树的参数是什么?你会发现我们需要学习的是那些函数 f i f_i fi,每个函数都包含树的结构和叶子的分数。学习树结构比传统优化问题难得多,在传统优化问题中你可以简单地取梯度。一次学习所有的树是不可能的。相反,我们使用加法策略:固定我们已经学到的东西,每次添加一棵新树。我们将步骤 t t t 的预测值写为 y ^ i ( t ) \hat{y}_i^{(t)} y^i(t)。然后我们有

y ^ i ( 0 ) = 0 y ^ i ( 1 ) = f 1 ( x i ) = y ^ i ( 0 ) + f 1 ( x i ) y ^ i ( 2 ) = f 1 ( x i ) + f 2 ( x i ) = y ^ i ( 1 ) + f 2 ( x i ) … y ^ i ( t ) = ∑ k = 1 t f k ( x i ) = y ^ i ( t − 1 ) + f t ( x i ) \begin{align*} \hat{y}_i^{(0)} &= 0\\ \hat{y}_i^{(1)} &= f_1(x_i) = \hat{y}_i^{(0)} + f_1(x_i)\\ \hat{y}_i^{(2)} &= f_1(x_i) + f_2(x_i)= \hat{y}_i^{(1)} + f_2(x_i)\\ &\dots\\ \hat{y}_i^{(t)} &= \sum_{k=1}^t f_k(x_i)= \hat{y}_i^{(t-1)} + f_t(x_i) \end{align*} y^i(0)y^i(1)y^i(2)y^i(t)=0=f1(xi)=y^i(0)+f1(xi)=f1(xi)+f2(xi)=y^i(1)+f2(xi)=k=1tfk(xi)=y^i(t1)+ft(xi)

我们还需要问:每一步我们需要哪棵树?每一步添加的树 f t ( x ) f_t(x) ft(x)都是为了优化当前的目标函数。
obj ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ i = 1 t ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ω ( f t ) + c o n s t a n t \begin{align*} \text{obj}^{(t)} & = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t)}) + \sum_{i=1}^t\omega(f_i) \\ & = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \omega(f_t) + \mathrm{constant} \end{align*} obj(t)=i=1nl(yi,y^i(t))+i=1tω(fi)=i=1nl(yi,y^i(t1)+ft(xi))+ω(ft)+constant
如果我们考虑使用均方误差(MSE)作为损失函数,则目标变为
obj ( t ) = ∑ i = 1 n ( y i − ( y ^ i ( t − 1 ) + f t ( x i ) ) ) 2 + ∑ i = 1 t ω ( f i ) = ∑ i = 1 n [ 2 ( y ^ i ( t − 1 ) − y i ) f t ( x i ) + f t ( x i ) 2 ] + ω ( f t ) + c o n s t a n t \begin{align*} \text{obj}^{(t)} & = \sum_{i=1}^n (y_i - (\hat{y}_i^{(t-1)} + f_t(x_i)))^2 + \sum_{i=1}^t\omega(f_i) \\ & = \sum_{i=1}^n [2(\hat{y}_i^{(t-1)} - y_i)f_t(x_i) + f_t(x_i)^2] + \omega(f_t) + \mathrm{constant} \end{align*} obj(t)=i=1n(yi(y^i(t1)+ft(xi)))2+i=1tω(fi)=i=1n[2(y^i(t1)yi)ft(xi)+ft(xi)2]+ω(ft)+constant
MSE 的形式很友好,有一个一阶项(通常称为残差)和一个二阶项。对于其他感兴趣的损失(例如逻辑损失),不容易得到如此好的形式。因此在一般情况下,我们对损失函数进行二阶泰勒展开

泰勒公式:
f ( x + Δ x ) ≃ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x)\simeq f(x)+f'(x)\Delta x+\frac12f''(x)\Delta x^2 f(x+Δx)f(x)+f(x)Δx+21f′′(x)Δx2
损失函数进行二阶泰勒展开
obj ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ω ( f t ) + c o n s t a n t ≃ ∑ i = 1 n [ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + ω ( f t ) + c o n s t a n t \begin{align*} \text{obj}^{(t)} & = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \omega(f_t) + \mathrm{constant}\\ & \simeq \sum_{i=1}^n [l(y_i, \hat{y}_i^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \omega(f_t) + \mathrm{constant} \end{align*} obj(t)=i=1nl(yi,y^i(t1)+ft(xi))+ω(ft)+constanti=1n[l(yi,y^i(t1))+gift(xi)+21hift2(xi)]+ω(ft)+constant
其中 g i g_i gi h i h_i hi 定义为
g i = ∂ y ^ i ( t − 1 ) l ( y i , y ^ i ( t − 1 ) ) h i = ∂ y ^ i ( t − 1 ) 2 l ( y i , y ^ i ( t − 1 ) ) \begin{align*} g_i &= \partial_{\hat{y}_i^{(t-1)}} l(y_i, \hat{y}_i^{(t-1)})\\ h_i &= \partial_{\hat{y}_i^{(t-1)}}^2 l(y_i, \hat{y}_i^{(t-1)}) \end{align*} gihi=y^i(t1)l(yi,y^i(t1))=y^i(t1)2l(yi,y^i(t1))
在我们移除所有常数后,步骤 t t t​ 的具体目标变为
∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + ω ( f t ) \sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \omega(f_t) i=1n[gift(xi)+21hift2(xi)]+ω(ft)
这成为我们新树的优化目标。这个定义的一个重要优点是目标函数的值仅依赖于 g i g_i gi h i h_i hi。这就是 XGBoost 支持自定义损失函数的方式。我们可以使用完全相同的求解器,通过以 g i g_i gi h i h_i hi 作为输入,来优化包括逻辑回归和对偶排名在内的每个损失函数!

Model Complexity

我们已经介绍了训练步骤,但等等,还有一个重要的事情,正则化项!我们需要定义树 ω ( f ) \omega(f) ω(f) 的复杂度。为此,让我们首先将树 f ( x ) f(x) f(x) 的定义细化为

f t ( x ) = w q ( x ) , w ∈ R T , q : R d → { 1 , 2 , ⋯   , T } f_t(x) = w_{q(x)}, w \in R^T, q:R^d\rightarrow \{1,2,\cdots,T\} ft(x)=wq(x),wRT,q:Rd{1,2,,T}

这里 w w w 是叶子上的分数向量, q q q 是将每个数据点分配到相应叶子的函数, T T T 是叶子的数量。在 XGBoost 中,我们将复杂度定义为
ω ( f ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2 ω(f)=γT+21λj=1Twj2
当然,有不止一种定义复杂度的方法,但这种方法在实践中效果很好。正则化是大多数树包处理得不太仔细的部分,或简单忽略。这是因为传统的树学习处理仅强调提高纯度,而复杂度控制留给了启发式方法。通过正式定义,我们可以更好地了解我们在学习什么,并获得在实际中表现良好的模型。

The Structure Score

这里是推导的神奇部分。在重新定义树模型后,我们可以用 t t t​-th 树的目标值表示为:
obj ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T \begin{align*} \text{obj}^{(t)} &\approx \sum_{i=1}^n [g_i w_{q(x_i)} + \frac{1}{2} h_i w_{q(x_i)}^2] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2\\ &= \sum^T_{j=1} [(\sum_{i\in I_j} g_i) w_j + \frac{1}{2} (\sum_{i\in I_j} h_i + \lambda) w_j^2 ] + \gamma T \end{align*} obj(t)i=1n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2=j=1T[(iIjgi)wj+21(iIjhi+λ)wj2]+γT
其中 I j = { i ∣ q ( x i ) = j } I_j = \{i|q(x_i)=j\} Ij={iq(xi)=j} 是分配到第 j j j 叶子的数据点的索引集。注意,在第二行中,我们更改了求和的索引,因为所有相同叶子上的数据点得到相同的分数。我们可以通过定义 G j = ∑ i ∈ I j g i G_j = \sum_{i\in I_j} g_i Gj=iIjgi H j = ∑ i ∈ I j h i H_j = \sum_{i\in I_j} h_i Hj=iIjhi 进一步压缩表达式:
obj ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T \text{obj}^{(t)} = \sum^T_{j=1} [G_jw_j + \frac{1}{2} (H_j+\lambda) w_j^2] +\gamma T obj(t)=j=1T[Gjwj+21(Hj+λ)wj2]+γT
在这个方程中, w j w_j wj 彼此独立,形式为 G j w j + 1 2 ( H j + λ ) w j 2 G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2 Gjwj+21(Hj+λ)wj2 是二次的,并且给定结构 q ( x ) q(x) q(x) 的最佳 w j w_j wj (二次函数求导,令导数等于0)和我们可以获得的最佳目标减小值为:
w j ∗ = − G j H j + λ o b j ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \begin{aligned}w_{j}^{*}&=-\frac{G_j}{H_j+\lambda}\\\mathrm{obj}^{*}&=-\frac12\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T\end{aligned} wjobj=Hj+λGj=21j=1THj+λGj2+γT
最后一个等式衡量树结构 q ( x ) q(x) q(x)的好坏。

如果所有这些听起来有点复杂,让我们看看图片,看看如何计算分数。基本上,对于给定的树结构,我们将统计 g i g_i gi h i h_i hi推送到它们所属的叶节点上,将统计数据相加,然后使用公式计算树的好坏。这分数类似于决策树中的杂质度量,但它还考虑了模型的复杂度。

Learn the tree structure

现在我们有了一种方法来衡量一棵树的好坏,在实际中,由于枚举所有可能的树结构是不可能的,我们采用的是逐步添加的方法:每次仅添加一个分裂。具体来说,我们试图将一个叶子节点分成两个叶子节点,并计算其增益(Gain)。公式如下:

Gain = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ \text{Gain} = \frac{1}{2} \left[\frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L + G_R)^2}{H_L + H_R + \lambda}\right] - \gamma Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ
此公式可以分解为以下部分:

  1. 新左叶子的得分。

  2. 新右叶子的得分。

  3. 原叶子的得分。

  4. 新增叶子的正则化项。

我们可以得出一个重要结论:如果增益小于 γ \gamma γ,我们最好不要添加该分裂。这就是树模型中的剪枝技术的核心理念。通过使用监督学习的原则,我们能够自然地理解这些技术的有效性。

对于连续值数据,我们通常希望寻找最佳分裂点。为了有效地实现这一点,我们将所有实例按某一特征值排序,如下图所示。

选择最佳分裂的示意图

从左到右扫描就足以计算所有可能分裂方案的结构得分,从而高效地找到最佳分裂点。

[!NOTE]

注意:加法树学习的局限性

由于枚举所有可能的树结构是不可能的,我们采用逐步添加的方法,即每次仅添加一个分裂。这种方法在大多数情况下效果良好,但在某些极端情况下可能会失败,因为我们每次只考虑一个特征维度。有关示例,请参见 Can Gradient Boosting Learn Simple Arithmetic?。

关于 XGBoost 的最后话语

现在你已经了解了什么是提升树,你可能会问,XGBoost 的介绍在哪里?XGBoost 是一个受本教程中介绍的正式原理所激发的工具!更重要的是,它是在系统优化机器学习原理方面经过深思熟虑开发的。这个库的目标是将机器的计算极限推向极致,提供一个可扩展可移植准确的库。确保你尝试一下,最重要的是,为社区贡献你的智慧(代码、示例、教程)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1873835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨…

某麦网自动刷新抢票脚本——手机端(高级版)

某麦网自动刷新抢票脚本——电脑端 小白操作-抵制黄牛–需要更好用更高级关注获取 如何用Python自动抢大麦网演出票? 在数字化时代,购票已经成为我们生活的一部分,无论是音乐会、话剧、体育赛事还是各种展览,抢票几乎成了一项“…

【隐私计算】对SIMD编码的粗浅理解

首先需要知道,同态加密是在多项式上进行的,基于RLEW的整体流程如下: 将单个数编码到一个N阶(N项)多项式中,多项式系数的利用率极低。而在神经网络中,我们需要计算的东西往往是一个很大的矩阵/te…

使用 nvm 管理 Node 版本及 pnpm 安装

文章目录 GithubWindows 环境Mac/Linux 使用脚本进行安装或更新Mac/Linux 环境变量nvm 常用命令npm 常用命令npm 安装 pnpmNode 历史版本 Github https://github.com/nvm-sh/nvm Windows 环境 https://nvm.uihtm.com/nvm.html Mac/Linux 使用脚本进行安装或更新 curl -o- …

可用的微信小程序抓包方式(Charles + bp)

扫码领资料 获网安教程 前言 接到对公司小程序进行渗透的任务,尝试了网上几种对小程序抓包的方式(BurpProxifier、Burp安卓模拟器等)都无法完成抓包,可能已经失效,结合不同的文章尝试了bpCharles,成功抓包…

支持内嵌H5页面,谈谈微信小程序的应用场景

目录 一、微信小程序介绍二、什么是内嵌H5页面三、小程序内嵌H5页面的如何交互四、微信小程序的应用场景 一、微信小程序介绍 微信小程序是一种基于微信平台的轻量级应用,它无需下载安装,用户只需通过微信扫一扫或搜索即可快速打开使用。与传统的APP相比…

新火种AI|苹果要将苹果智能做成AI时代的APP Store?

作者:一号 编辑:美美 苹果还是想要自己做AI时代的“APP Store”。 自从去年开始落了队,苹果现在AI上开始高歌猛进。今年WWDC上展示的AI产品和与OpenAI的合作只是开始。有消息称,苹果正与Meta等AI巨头展开深入合作,这…

二、安装虚拟机

本篇来源:山海同行 本篇地址:https://shanhaigo.cn/courseDetail/1805875642621952000 本篇资源:以整理到-山海同行 一、官网下载centos7 1. 进入CentOS 官方网站 官方网站:https://www.centos.org/download/ 2. 选择iso 点击下…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯,每次项目的数据库都是在线上创建,Navicat 连接线上数据库进行处理,最近有一个项目需要二次升级,发现老项目部署的服务器到期了,完蛋,数据库咩了!!!…

IP地址查询和代理服务器:双重保护隐私

随着网络应用的日益普及,我们的个人信息和数据安全面临前所未有的挑战。在此背景下,IP地址查询和代理服务器成为保护个人隐私和网络安全的两大关键工具。本文将从IP地址查询的原理和应用出发,深入剖析代理服务器在网络隐私保护中的作用&#…

一个分析电路图的好助手

GPT。 最进分析电路图的时候发现GPT支持读取图片功能: 还别说,分析的很有道理。 此外,它还可以分析芯片的引脚功能,辅助电路分析: AB胶:粘的非常牢固,需要A和B两种胶混合使用。

vue+go实现web端连接Linux终端

vuego实现web端连接Linux终端 实现效果 实现逻辑1——vue 依赖包 "xterm": "^5.3.0","xterm-addon-attach": "^0.9.0","xterm-addon-fit": "^0.8.0"样式和代码逻辑 <template><a-modalv-model:visib…

《分析模式》漫谈08-单继承不是“唯一继承”

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》第2章这一段&#xff1a; 划线处的single inheritance&#xff0c;2004中译本的翻译&#xff1a; 翻译为“单继承”&#xff0c;是正确的。 2020中译本的翻译&#xff1a…

【人工智能】—XGBoost、CatBoost、LightGBM算法构建信用卡欺骗识别模型

引言 在金融领域&#xff0c;信用卡欺诈行为一直是银行和金融机构面临的一大挑战。随着电子商务的快速发展&#xff0c;信用卡欺诈事件的数量和复杂性都在不断增加。据统计&#xff0c;全球每年因信用卡欺诈造成的损失高达数十亿美元。因此&#xff0c;开发有效的欺诈检测系统…

i-Health

技术栈&#xff1a;HTMLCSSJavascriptPHP

同步模式之保护性暂停模式

1. Guarded Suspension&#xff1a;一个线程需要等待另一个线程的执行结果 2. 理解 一个线程需要将结果传递给另一个线程&#xff0c;将这两个线程关联到到同一个 GuardedObject 如果需要源源不断地传递结果&#xff0c;需要使用消息队列&#xff08;生产者-消费者模型&…

SpringBoot(二)SpringBoot多环境配置

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot&#xff08;一&#xff09;创建一个简单的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多环境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…

met和set的特性及区别

1、关联式容器 在c初阶阶段&#xff0c;我们已经接触了STL的部分容器&#xff0c;比如&#xff1a;vector,list,deque&#xff0c;forward_list等。 这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的就是数据本身。 而关联式容器…

[论文阅读笔记32] Object-Centric Multiple Object Tracking (ICCV2023)

最近Object centric learning比较火, 其借助了心理学的概念, 旨在将注意力集中在图像或视频中的独立对象&#xff08;objects&#xff09;上&#xff0c;而不是整个图像。这个方法与传统的基于像素或区域的方法有所不同&#xff0c;它试图通过识别和分离图像中的各个对象来进行…

详细的介绍匀加速运动的物理方程是如何转化为卡尔曼滤波的状态空间模型的

详细的介绍匀加速运动的物理方程是如何转化为卡尔曼滤波的状态空间模型的 flyfish 加速度是描述物体速度变化快慢的物理量&#xff0c;定义为速度对时间的变化率。数学上&#xff0c;它表示为&#xff1a; a Δ v Δ t a \frac{\Delta v}{\Delta t} aΔtΔv​ 其中&#xf…