【机器学习导引】ch3-线性模型-2

news2024/11/25 11:55:47

优化理论:梯度下降(Gradient Descent)

  1. 梯度下降法的基本思路
    梯度下降法是一种优化算法,目的是找到函数 f ( x ) f(x) f(x) 的最小值。图中提到“如果能找到一个序列 x 0 , x 1 , x 2 , … x_0, x_1, x_2, \dots x0,x1,x2, ” ,使得每一步都满足: f ( x t + 1 ) < f ( x t ) f(x_{t+1}) < f(x_t) f(xt+1)<f(xt)
    这意味着每一步更新 x x x 的时候,函数 f ( x ) f(x) f(x) 的值都在下降,也就是朝着局部最小点的方向移动。
  2. 局部极小点问题
    当你每一步都保证 f ( x t + 1 ) < f ( x t ) f(x_{t+1}) < f(x_t) f(xt+1)<f(xt) ,最终会收敛到一个点,这个点就是局部极小点。
    为什么呢?
    这是因为梯度下降法的原理是沿着函数下降最快的方向(即负梯度方向)进行移动,而负梯度的方向是函数值减少最快的方向。因此,经过多次迭代,函数值会越来越小,最终到达一个局部极小点。这时,梯度接近 0 0 0,意味着不再有下降的空间,也就不能再继续下降了。
  3. 如果 f ( x ) f(x) f(x) 是凸函数,局部极小点就是全局最小点为什么呢?
    这是凸函数的一个重要性质:对于凸函数,局部极小点和全局极小点是重合的。换句话说,如果函数是凸的,那它只有一个最小值,且该最小值一定是全局最小值。梯度下降法在凸函数上的应用就显得特别有效,因为它能够确保找到的局部极小点就是全局最小点。

总结一下:

  • 如果每次更新都让函数值下降,你会找到一个局部极小点。
  • 如果函数是凸的,这个局部极小点就是全局最小点。

梯度下降法的核心就是通过不断迭代,使得目标函数的值逐渐减小,直到找到最小值或者停滞在某个点(即梯度为 0 0 0)。

1. 方向选择

  • 对于一元函数 f ( x ) f(x) f(x) 来说,变量 x x x 的变化有两个方向:
    • 向右(即 Δ x > 0 \Delta x > 0 Δx>0
    • 向左(即 Δ x < 0 \Delta x < 0 Δx<0

2. 泰勒展开式

  • 泰勒展开是用来近似函数的一种方法。对于函数 f ( x ) f(x) f(x) ,它可以展开为:

    f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x + f ( 2 ) ( x ) 2 ! Δ x 2 + ⋯ + o ( Δ x n ) f(x + \Delta x) = f(x) + f'(x) \Delta x + \frac{f^{(2)}(x)}{2!} \Delta x^2 + \dots + o(\Delta x^n) f(x+Δx)=f(x)+f(x)Δx+2!f(2)(x)Δx2++o(Δxn)

    其中 f ′ ( x ) f'(x) f(x) f ( x ) f(x) f(x) 的一阶导数, f ( 2 ) ( x ) f^{(2)}(x) f(2)(x) 是二阶导数,依此类推。

  • Δ x \Delta x Δx 足够小时,泰勒展开式可以简化为:

    f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x f(x + \Delta x) \approx f(x) + f'(x) \Delta x f(x+Δx)f(x)+f(x)Δx

3. 如何让函数值下降?

  • 梯度下降的目标是让 f ( x + Δ x ) < f ( x ) f(x + \Delta x) < f(x) f(x+Δx)<f(x) ,即在每一步迭代中,让函数值下降。
  • 要实现这一点,需要保证 f ′ ( x ) Δ x < 0 f'(x) \Delta x < 0 f(x)Δx<0 ,也就是说,导数 f ′ ( x ) f'(x) f(x) Δ x \Delta x Δx 的乘积必须为负值。
    • 如果 f ′ ( x ) > 0 f'(x) > 0 f(x)>0 ,我们选择 Δ x < 0 \Delta x < 0 Δx<0
    • 如果 f ′ ( x ) < 0 f'(x) < 0 f(x)<0 ,我们选择 Δ x > 0 \Delta x > 0 Δx>0
  • f ( x ) f(x) f(x) 为多元函数时,梯度 ∇ f ( x ) \nabla f(x) f(x) 替代一元函数的导数,梯度的方向是函数增长最快的方向。因此,我们需要沿着梯度的相反方向移动,使得函数值下降。

4. 如何选择步长?

  • 我们定义 Δ x = − η ∇ f ( x ) \Delta x = -\eta \nabla f(x) Δx=ηf(x) ,其中 η \eta η 为步长,表示每次更新时移动的距离。步长 η \eta η 必须是一个较小的正数。

  • 这样,更新的方向就是沿着梯度的反方向,即函数值减少的方向。通过这个公式,可以保证每次迭代后函数值都会下降:

    Δ x ∇ f ( x ) = − η ( ∇ f ( x ) ) 2 < 0 \Delta x \nabla f(x) = -\eta (\nabla f(x))^2 < 0 Δxf(x)=η(f(x))2<0

5. 梯度下降的更新公式

  • 通过这个思路,最终的梯度下降法的更新公式就是:

    x t + 1 = x t − η ∇ f ( x t ) x_{t+1} = x_t - \eta \nabla f(x_t) xt+1=xtηf(xt)

    这表示在每次迭代时,用当前点的梯度乘以一个步长 η \eta η ,然后从当前点 x t x_t xt 减去这个值,得到下一个点 x t + 1 x_{t+1} xt+1

总结

  • 梯度下降的核心思想是通过沿着梯度的反方向移动,使得每一步迭代后的函数值都比前一步的值更小。
  • 使用泰勒展开式可以解释为什么小步移动能够使函数值下降。
  • 选择合适的步长 η \eta η 能够控制更新的幅度,确保算法稳定收敛。

算法原理

1. 线性回归模型的输出

图中提到,线性回归模型的输出可以表示为:

z = w T x + b z = w^T x + b z=wTx+b

其中:

  • z z z 是线性模型的输出值
  • w T w^T wT 是权重向量
  • x x x 是输入特征向量
  • b b b 是偏置

这个公式表示的是一个简单的线性组合。对于分类任务,我们希望输出值 y y y 0 0 0 1 1 1

2. 单位阶跃函数(Unit-Step Function)

理想情况下,我们希望通过线性回归的输出值 z z z 来决定 y y y 的取值。如果 z > 0 z > 0 z>0 ,那么 y = 1 y = 1 y=1 ,表示属于某一类;如果 z < 0 z < 0 z<0 ,那么 y = 0 y = 0 y=0 ,表示属于另一类。这就是 单位阶跃函数 的定义:

y = { 1 , z > 0 0.5 , z = 0 0 , z < 0 y = \begin{cases} 1, & z > 0 \\ 0.5, & z = 0 \\ 0, & z < 0 \end{cases} y= 1,0.5,0,z>0z=0z<0

但是,阶跃函数的性质不太好,因为它在 z = 0 z = 0 z=0不可微分,且在其他点上也是非连续的,这对模型的训练不利。

3. 替代函数——对数几率函数(Logistic Function)

为了克服单位阶跃函数的缺点,常用的替代函数是 对数几率函数(Logistic Function),也称为 S型函数(Sigmoid Function)。它的公式为:

y = 1 1 + e − z y = \frac{1}{1 + e^{-z}} y=1+ez1

这个函数的输出是一个连续值,位于 0 0 0 1 1 1 之间,可以看作是输出为某一类别的概率。它有以下几个重要的性质:

  • z z z 很大时, y y y 接近 1 1 1
  • z z z 很小时, y y y 接近 0 0 0
  • z = 0 z = 0 z=0 时, y = 0.5 y = 0.5 y=0.5

在这里插入图片描述

从图中的曲线可以看到,对数几率函数的曲线在 z = 0 z = 0 z=0 处平滑过渡,解决了阶跃函数不连续、不可微的问题。

4. 对数几率函数在分类中的应用

在分类任务中,我们使用对数几率函数将线性回归的输出值映射到 [ 0 , 1 ] [0, 1] [0,1] 之间,这样我们可以将其视作类别 1 1 1 的概率。然后根据这个概率值,我们可以将 y y y 分为 0 0 0 1 1 1。例如:

  • 如果 y > 0.5 y > 0.5 y>0.5 ,我们可以预测分类为 1 1 1
  • 如果 y < 0.5 y < 0.5 y<0.5 ,则预测分类为 0 0 0

总结

  • 线性回归的输出 z = w T x + b z = w^T x + b z=wTx+b 本质上是一个实数。
  • 为了进行二分类,我们希望将 z z z 映射到 [ 0 , 1 ] [0,1] [0,1] 之间,并且可以平滑、连续地变化。为此,我们用 对数几率函数(Logistic Function) 代替单位阶跃函数。
  • 对数几率函数输出一个概率值,用于决定输入属于哪一类。

概率(Probability)几率(Odds)对数几率(Logit)

1. 概率 (Probability)

概率是指事件发生的可能性,通常用 p p p 表示,范围在 [ 0 , 1 ] [0, 1] [0,1] 之间。

  • 如果事件肯定发生, p = 1 p = 1 p=1
  • 如果事件不可能发生, p = 0 p = 0 p=0
  • 一般情况下,概率表示的是事件成功的可能性。

2. 几率 (Odds)

几率 描述的是事件发生的可能性和不发生的可能性之间的比率。它可以用概率 p 表示:

Odds = p 1 − p \text{Odds} = \frac{p}{1 - p} Odds=1pp

  • p = 0.5 p = 0.5 p=0.5 时,几率为 1 1 1,表示事件发生和不发生的可能性相等。
  • p > 0.5 p > 0.5 p>0.5 时,几率大于 1 1 1,表示事件更有可能发生
  • p < 0.5 p < 0.5 p<0.5 时,几率小于 1 1 1,表示事件更不可能发生

例如,如果某事件发生的概率是 0.75 0.75 0.75,那么其几率为:

Odds = 0.75 1 − 0.75 = 3 \text{Odds} = \frac{0.75}{1 - 0.75} = 3 Odds=10.750.75=3

表示事件发生的可能性是其不发生可能性的 3 3 3 倍。

3. 对数几率 (Logit)

对数几率几率取对数的结果,用来将几率转换为一个无限范围的数值。对数几率公式如下:

Logit ( p ) = log ⁡ ( p 1 − p ) \text{Logit}(p) = \log\left(\frac{p}{1 - p}\right) Logit(p)=log(1pp)

对数几率将 p p p [ 0 , 1 ] [0, 1] [0,1] 的范围映射到整个实数范围 ( − ∞ , ∞ -\infty, \infty ,) ,这对建模非常有用,特别是在逻辑回归中。

  • p = 0.5 p = 0.5 p=0.5 时, L o g i t Logit Logit 值为 0 0 0
  • p > 0.5 p > 0.5 p>0.5 时, L o g i t Logit Logit 值为正,表示事件发生的几率更高。
  • p < 0.5 p < 0.5 p<0.5 时, L o g i t Logit Logit 值为负,表示事件不发生的几率更高。

4. 在逻辑回归中的应用

逻辑回归中,我们通常需要预测一个事件发生的概率( p p p ),而通过线性模型(如 z = w T x + b z = w^T x + b z=wTx+b )直接预测的值范围是 ( − ∞ , ∞ -\infty, \infty ,) 。为了将这个值映射到 [ 0 , 1 ] [0, 1] [0,1] 之间,我们使用了对数几率函数。对数几率函数可以将线性模型的输出转换为几率,然后通过几率得到事件发生的概率。

总结

  • 概率 p p p 表示事件发生的可能性,范围是 [ 0 , 1 ] [0, 1] [0,1]
  • 几率 p 1 − p \frac{p}{1 - p} 1pp 表示事件发生与不发生的比率。
  • 对数几率 log ⁡ ( p 1 − p ) \log\left(\frac{p}{1 - p}\right) log(1pp) 是几率取对数后的值,将概率映射到实数范围。

这些概念在逻辑回归中用于预测二分类问题的结果,并通过对数几率来将线性回归的输出映射到概率值上。

对数几率回归模型(Logistic Regression Model) 的基本数学形式

1. 对数几率回归模型的核心

对数几率回归模型用于解决二分类问题,其核心思想是通过一个线性模型( w T x + b w^T x + b wTx+b )来预测一个事件发生的概率。

在这个模型中,我们希望预测 y = 1 y = 1 y=1 的概率。模型假设输出的对数几率(即事件发生与不发生的几率比值取对数)是一个线性模型:

ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) = w T x + b (3.22) \ln \left( \frac{p(y=1|x)}{p(y=0|x)} \right) = w^T x + b \tag{3.22} ln(p(y=0∣x)p(y=1∣x))=wTx+b(3.22)

这个公式的左边表示事件发生和不发生的对数几率,而右边是一个线性组合的表达式。

2. 为什么这样表示?(公式 3.22)

这里使用对数几率的原因是为了将线性模型的输出(即 w T x + b w^T x + b wTx+b 的值)和概率联系起来。具体来说:

  • 几率 p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) \frac{p(y=1|x)}{p(y=0|x)} p(y=0∣x)p(y=1∣x) 本质上是一个正数,但其范围可以是 ( 0 , ∞ ) (0, \infty) (0,) ,也就是非负数。
  • 对数几率 ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) \ln \left( \frac{p(y=1|x)}{p(y=0|x)} \right) ln(p(y=0∣x)p(y=1∣x)) 将几率映射到了整个实数范围 ( − ∞ , ∞ ) (-\infty, \infty) (,) ,而线性模型的输出也是可以取任何实数值的。

因此,使用对数几率可以很好地将线性模型与二分类问题的概率联系起来,这就是公式 (3.22) 的推导来源。

3. 从对数几率到概率的推导

我们可以通过公式 ( 3.22 ) (3.22) (3.22) 来推导出 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x) p ( y = 0 ∣ x ) p(y=0|x) p(y=0∣x) 。我们从几率公式出发:

ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) = w T x + b \ln \left( \frac{p(y=1|x)}{p(y=0|x)} \right) = w^T x + b ln(p(y=0∣x)p(y=1∣x))=wTx+b

将对数移到等式的另一边:

p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = e w T x + b \frac{p(y=1|x)}{p(y=0|x)} = e^{w^T x + b} p(y=0∣x)p(y=1∣x)=ewTx+b

接着我们知道 p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) p(y=0|x) = 1 - p(y=1|x) p(y=0∣x)=1p(y=1∣x) ,所以可以得到:

p ( y = 1 ∣ x ) 1 − p ( y = 1 ∣ x ) = e w T x + b \frac{p(y=1|x)}{1 - p(y=1|x)} = e^{w^T x + b} 1p(y=1∣x)p(y=1∣x)=ewTx+b

接下来我们将这个式子进行变形,解出 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x)

p ( y = 1 ∣ x ) = e w T x + b 1 + e w T x + b (3.23) p(y=1|x) = \frac{e^{w^T x + b}}{1 + e^{w^T x + b}} \tag{3.23} p(y=1∣x)=1+ewTx+bewTx+b(3.23)

这就是 y = 1 y=1 y=1 的概率公式。

同理, y = 0 y=0 y=0 的概率为:

p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) = 1 1 + e w T x + b (3.24) p(y=0|x) = 1 - p(y=1|x) = \frac{1}{1 + e^{w^T x + b}} \tag{3.24} p(y=0∣x)=1p(y=1∣x)=1+ewTx+b1(3.24)

4. 小结

  • 公式 ( 3.22 ) (3.22) (3.22) 表示的是对数几率的线性关系。对数几率回归的基本假设是,输出的对数几率与输入 x x x 的线性组合 w T x + b w^T x + b wTx+b 有关。
  • 从这个公式出发,我们推导出了 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x) p ( y = 0 ∣ x ) p(y=0|x) p(y=0∣x) 的具体概率表达式,这些公式用于描述二分类问题中每一类发生的概率。

似然函数(Likelihood Function)

1. 似然函数的定义

似然函数 ℓ ( w , b ) \ell(w, b) (w,b) 是关于参数 w w w b b b 的一个函数,用来表示我们给定参数下数据的可能性。其形式为:

ℓ ( w , b ) = ∑ i = 1 m ln ⁡ p ( y i ∣ x i ; w , b ) \ell(w, b) = \sum_{i=1}^{m} \ln p(y_i | \mathbf{x}_i; w, b) (w,b)=i=1mlnp(yixi;w,b)

其中:

  • m m m 是训练数据的样本数量。
  • p ( y i ∣ x i ; w , b ) p(y_i | \mathbf{x}i; w, b) p(yixi;w,b) 表示在给定输入 x i \mathbf{x}_i xi 和参数 w , b w, b w,b 的情况下,模型预测 y i y_i yi 的概率。

我们通过对数似然函数(Log-likelihood Function)来简化计算,避免直接计算较小的概率连乘,累积误差。

2. 似然函数的解释

公式表示的是事件 y i y_i yi 发生或不发生的概率,它结合了 y i = 1 y_i = 1 yi=1 y i = 0 y_i = 0 yi=0 两种情况:

p ( y i ∣ x i ; w , b ) = y i p 1 ( x i ; β ) + ( 1 − y i ) p 0 ( x i ; β ) p(y_i | \mathbf{x}_i; w, b) = y_i p_1(\mathbf{x}_i; \beta) + (1 - y_i)p_0(\mathbf{x}_i; \beta) p(yixi;w,b)=yip1(xi;β)+(1yi)p0(xi;β)

其中:

  • y i y_i yi 1 1 1 时,选择的是 p 1 ( x i ; β ) p_1(\mathbf{x}_i; \beta) p1(xi;β) ,即事件 y = 1 y=1 y=1 的概率。
  • y i y_i yi 0 0 0 时,选择的是 p 0 ( x i ; β ) p_0(\mathbf{x}_i; \beta) p0(xi;β) ,即事件 y = 0 y=0 y=0 的概率。

用更直观的方式理解这个公式:

  • y i = 1 y_i = 1 yi=1 时,这个公式变为 p 1 ( x i ; β ) p_1(\mathbf{x}_i; \beta) p1(xi;β) ,即我们只需要关注 y = 1 y = 1 y=1 的概率。
  • y i = 0 y_i = 0 yi=0 时,这个公式变为 p 0 ( x i ; β ) p_0(\mathbf{x}_i; \beta) p0(xi;β) ,即我们只关注 y = 0 y = 0 y=0 的概率。

因此,这个似然函数描述的是所有数据点在不同情况下( y = 1 y = 1 y=1 y = 0 y = 0 y=0 )的整体概率。

3. 参数的最大化

通过最大化似然函数 ℓ ( w , b ) \ell(w, b) (w,b) ,我们可以找到最优的参数 w w w b b b 来使得模型对已知数据的预测概率最大。最大化似然函数就是最大似然估计(Maximum Likelihood Estimation, MLE)的核心思想。

总结

  • 似然函数 ℓ ( w , b ) \ell(w, b) (w,b) 用于度量模型在参数 w w w b b b 下对所有样本预测的整体概率
  • 对数似然函数 通过对数化简了计算,使得我们可以更方便地处理较小的概率值。
  • 公式是对概率的分解,分别处理 y i = 1 y_i = 1 yi=1 y i = 0 y_i = 0 yi=0 的情况,使得我们能够通过最大化似然函数来训练模型。

最小化目标函数

也就是我们需要最大化似然函数的等价形式

1. 目标:最大化似然函数

首先,我们的目标是 最大化似然函数,用符号表示为:

ℓ ( w , b ) = ∑ i = 1 m ln ⁡ p ( y i ∣ x i ; w , b ) \ell(w, b) = \sum_{i=1}^{m} \ln p(y_i|\mathbf{x}_i; w, b) (w,b)=i=1mlnp(yixi;w,b)

这就是对数似然函数。我们希望找到合适的参数 w w w b b b使得模型在数据上的预测概率最大化。

2. 最大化似然函数等价于最小化损失函数

最大化对数似然函数与最小化负对数似然函数是等价的。为什么呢?因为最大化一个函数,等价于最小化其负数。于是我们可以通过最小化负的对数似然函数来进行优化。

所以,我们定义损失函数 ℓ ( β ) \ell(\beta) (β) 为:

ℓ ( β ) = − ∑ i = 1 m ln ⁡ p ( y i ∣ x i ; β ) \ell(\beta) = - \sum_{i=1}^{m} \ln p(y_i|\mathbf{x}_i; \beta) (β)=i=1mlnp(yixi;β)

其中 β = [ w , b ] T \beta = [w, b]^T β=[w,b]T 是需要优化的参数。

3. 对 p ( y i ∣ x i ; β ) p(y_i|\mathbf{x}_i; \beta) p(yixi;β) 的展开

我们之前推导了 p ( y i ∣ x i ; β ) p(y_i|\mathbf{x}_i; \beta) p(yixi;β) 的表达式:

p ( y i ∣ x i ; β ) = y i p 1 ( x i ; β ) + ( 1 − y i ) p 0 ( x i ; β ) p(y_i|\mathbf{x}_i; \beta) = y_i p_1(\mathbf{x}_i; \beta) + (1 - y_i) p_0(\mathbf{x}_i; \beta) p(yixi;β)=yip1(xi;β)+(1yi)p0(xi;β)

其中:

  • p 1 ( x i ; β ) = e β T x i 1 + e β T x i p_1(\mathbf{x}_i; \beta) = \frac{e^{\beta^T \mathbf{x}_i}}{1 + e^{\beta^T \mathbf{x}_i}} p1(xi;β)=1+eβTxieβTxi y = 1 y = 1 y=1 的概率;
  • p 0 ( x i ; β ) = 1 1 + e β T x i p_0(\mathbf{x}_i; \beta) = \frac{1}{1 + e^{\beta^T \mathbf{x}_i}} p0(xi;β)=1+eβTxi1 y = 0 y = 0 y=0 的概率。

p ( y i ∣ x i ; β ) p(y_i|\mathbf{x}_i; \beta) p(yixi;β) 展开带入对数似然函数,并取负,得到:

ℓ ( β ) = − ∑ i = 1 m ( y i ln ⁡ p 1 ( x i ; β ) + ( 1 − y i ) ln ⁡ p 0 ( x i ; β ) ) \ell(\beta) = - \sum_{i=1}^{m} \left( y_i \ln p_1(\mathbf{x}_i; \beta) + (1 - y_i) \ln p_0(\mathbf{x}_i; \beta) \right) (β)=i=1m(yilnp1(xi;β)+(1yi)lnp0(xi;β))

经过进一步化简和整理,最终得到的最小化目标函数(损失函数)为:

ℓ ( β ) = ∑ i = 1 m ( − y i β T x i + ln ⁡ ( 1 + e β T x i ) ) \ell(\beta) = \sum_{i=1}^{m} \left( -y_i \beta^T \mathbf{x}_i + \ln(1 + e^{\beta^T \mathbf{x}_i}) \right) (β)=i=1m(yiβTxi+ln(1+eβTxi))

  • 第一项 − y i β T x i -y_i \beta^T \mathbf{x}_i yiβTxi 是与真实标签相关的部分;
  • 第二项 ln ⁡ ( 1 + e β T x i ) \ln(1 + e^{\beta^T \mathbf{x}_i}) ln(1+eβTxi) 则是模型输出的对数几率。

5. 为什么可以用梯度下降法求解?

公式 (3.27) 是一个关于 β \beta β连续、可导的凸函数,而且高阶可导。这意味着我们可以用梯度下降法或牛顿法等优化算法来最小化这个目标函数,找到使其最小的参数 β \beta β

小结

  • 我们从最大化对数似然函数出发,通过取负将其转换为最小化损失函数。
  • 公式 (3.27) 是通过对数几率回归的概率公式推导而来,最终形式是对数似然函数的负数。
  • 因为该损失函数是连续、凸的,所以可以使用经典的优化方法,如梯度下降法来求解,使得参数 β \beta β 最优。

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

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

相关文章

有手就会!低代码让你告别繁琐开发流程

近几年&#xff0c;随着低代码与无代码相关话题的火热&#xff0c;逻辑编排作为其重要构成部分也备受关注&#xff0c;集团内外不乏优秀的实践。之前在做技术调研时发现了不少业内逻辑编排相关的方案&#xff0c;陆续整理记录下来。今天先为大家带来低代码开发领域的 JNPF。 1.…

如何有效恢复受污染除砷树脂的功能?

在半导体制造领域&#xff0c;砷是一种常见的杂质元素。然而&#xff0c;砷的存在不仅会严重影响芯片的性能和可靠性&#xff0c;还会对生产环境和人体健康构成威胁。通过使用高效的除砷树脂&#xff0c;可以有效地去除水中的砷元素。 然而&#xff0c;一旦除砷树脂受到污染&am…

一个月学会Java 第10天 详讲static和面向对象——继承与Java世上最厉害的IDE——IDEA

Day10 详讲static和面向对象——继承与Java世上最厉害的IDE——IDEA 今天的篇幅会比较长&#xff0c;因为牵扯到不少的内容还有面向对象的内容 第一章 static 首先我们先来填一下坑&#xff0c;之前挖的&#xff0c;说后面要详细讲解static这个关键字的作用&#xff0c;那在这之…

二叉树的构建与遍历

在介绍二叉树的篇章中&#xff0c;我们用方法简单创建了一个二叉树&#xff0c;如下代码&#xff1a; public treeNode creattree(){treeNode Anew treeNode(A);treeNode Bnew treeNode(B);treeNode Cnew treeNode(C);treeNode Dnew treeNode(D);treeNode Enew treeNode(E);tr…

新大话西游图文架设教程

开始架设 1. 架设条件 新大话西游架设需要准备&#xff1a; linux 系统服务器&#xff0c;建议 CentOs 7.6或以上版本游戏源码&#xff0c;。 2. 安装宝塔面板 宝塔是一个服务器运维管理软件&#xff0c;安装命令&#xff1a; yum install -y wget && wget -O in…

zabbix7.0配置中文界面

Zabbix 是一个广泛使用的开源监控解决方案&#xff0c;支持多种语言界面。本文将详细介绍如何配置 Zabbix 以使用中文界面&#xff0c;从而提高用户体验和可读性。 1. 环境准备 在开始配置之前&#xff0c;请确保你已经安装并运行了 Zabbix 服务器、前端和数据库。如果你还没有…

成品婚恋交友相亲源码打包APP小程序H5公众号可打包小程序APP公众号H5源码交付支持二开

聊天交友系统开发专业语聊交友app开发搭建同城交友源码开发婚恋交友系统相亲app小程序H5婚恋交友小程序的定制开发与行业新机遇婚恋交友app红娘连线系统app小程序开发一站式开发系统源码&#xff1a;婚恋交友H5与小程序开发详解 电商运营技术服务源码系统php相亲交友平台APP婚恋…

前端优化之路:git commit 校验拦截

但是想要做到高效落地执行&#xff0c;就需要做些别的功课&#xff0c;先展示下成果图 需要了解git hooks&#xff0c;它是git的钩子&#xff0c;就像vue拥有自己的钩子一样。 官方文档&#xff1a;https://git-scm.com/docs/githooks 项目安装 husky&#xff0c;建议稳定版本…

Linux进程间通信(个人笔记)

Linux进程通信 1.进程通信介绍1.1进程间通信目的1.2进程间通信发展1.3进程间通信的具体分类 2.管道2.1匿名管道2.1.1代码实例2.1.2 fork共享管道原理2.1.3 管道的读写规则与特点2.1.4 进程池 2.2 命名管道2.2.1 命名管道的创建2.2.2匿名管道与命名管道的区别2.2.3代码实例 3.Sy…

Spring Boot洗衣店订单系统:数据驱动的决策

3系统分析 3.1可行性分析 通过对本洗衣店订单管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本洗衣店订单管理系统采用JAVA作为开发语言&#xff0c;S…

如何安装Llama3.1 —— 附一键安装包!

一键安装包文末领取&#xff01; 下载地址 软件&#xff1a;Llama版本&#xff1a;3.1语言&#xff1a;简体中文大小&#xff1a;645 MB安装环境&#xff1a;Win10及以上版本(64bit) 软件简介 ‌‌LLaMA模型是Meta研发的大语言模型‌&#xff0c;旨在帮助研究人员推进他们…

vue-jsonp的使用和腾讯地图当前经纬度和位置详情的获取

1.下载&#xff1a; npm install –save vue-jsonp2.main.js中引入&#xff1a; //腾讯逆地址解析会用到jsonp import {VueJsonp} from vue-jsonp; Vue.use(VueJsonp);3.腾讯地图中使用 uniapp中获取*经纬度*和通过经纬度获取当前**位置详情** //获取当前经纬度 getLocation…

【AI系统】AI在不同领域的应用与行业影响

本文将探讨AI在不同技术领域和行业中的广泛应用&#xff0c;以及这些应用如何影响和改变我们的世界。 I. 引言 AI技术正日益渗透到各个技术领域&#xff0c;从计算机视觉到自然语言处理&#xff0c;再到音频处理&#xff0c;AI的应用正变得越来越广泛。这些技术的发展不仅推动…

影刀RPA实战:制作Excel工资条

1.实战目标 使用Excel制作工资条是一种常见的做法&#xff0c;每个公司几乎都有这样的需求&#xff0c;我们先介绍下使用excel手动制作工资条的方法&#xff0c;看看不足之处&#xff0c;使用影刀RPA又会给我们带来怎样的便利&#xff0c;让我们更倾向于选择影刀来处理。 工资…

世昌股份与吉利亲密关系:资产负债率远高同行,应收账款周转率偏弱

《港湾商业观察》杨丹妮 9月23日&#xff0c;河北世昌汽车部件股份有限公司&#xff08;以下简称“世昌股份”&#xff09;回复了第一轮审核问询函&#xff0c;公司于今年六月递表北交所&#xff0c;保荐机构为东北证券。 近几年新能源汽车如日中天&#xff0c;世昌股份也因此…

系统端口号被占用问题处理(WindowsLinux系统)

Windows 直接kill占用端口的进程 WinR 输入cmd 打开命令行窗口 1.查询本地已被占用的端口号&#xff1a; 下面以8080端口为例&#xff1a; netstat -aon|findstr "8080" 查看本地8080端口进程的PID 2.杀死"xxxx"端口号的进程 (下面的22868是 你查到…

DAY5 数组

概念 数组是一个数据容器&#xff0c;可用来存储一批同类型的数据。 存储原理 int[] arr new int[]{12,24,36}; 理解为数组对象中存储的为地址信息 一维数组 静态数组 数据类型[] 数组名 new 数据类型[]{元素1,元素2,......}&#xff1b; 数据类型[] 数组名 {元素1,元…

惯导+卫导组合高精度模块UM981系列新品特点

近日&#xff0c;和芯星通发布了UM981系列全系统全频高精度RTK/INS组合定位模块&#xff0c;可同时跟踪 BDS B1I/B2I/B3I/B1C/B2a/B2b&#xff0c;GPS L1/L2/L5&#xff0c;GLONASS G1/G2/G3&#xff0c;Galileo E1/E5a/E5b/E6&#xff0c;QZSS L1/L2/L5&#xff0c;NavIC L5&a…

Extreme Compression of Large Language Models via Additive Quantization阅读

文章目录 Abstract1. Introduction2. Background & Related Work2.1. LLM量化2.2. 最近邻搜索的量化 3.AQLM:Additive Quantization for LLMs3.1. 概述3.1.0 补充**步骤说明****举例说明** 3.2. 阶段1&#xff1a;代码的波束搜索3.3. 阶段2&#xff1a;码本更新3.4. 阶段3&…

Java中对象的比较(equals、Comparable、Comparator)

文章目录 一、PriorityQueue中插入对象二、元素的比较 2.1、基本类型的比较2.2、对象比较的问题三、对象的比较 3.1、覆写基类的equals3.2、基于Comparable接口类的比较3.3、基于比较器比较3.4、三种方式对比 一、PriorityQueue中插入对象 前篇我们讲解了优先级队列&#xff0…