逻辑回归公式推导-详细版

逻辑回归的损失函数(或称为代价函数)是用于衡量模型预测结果和真实结果之间差距的一个函数。它通常采用对数似然损失函数(Log-Loss),也称为交叉熵损失函数(Cross-Entropy Loss)。我们通过最大化似然函数来推导它,并将其转化为最小化损失函数的形式。

1. 逻辑回归的目标

逻辑回归是一种用于二分类任务的线性模型,它的目标是估计给定输入特征 $x$ 属于类 1 的概率 P ( y = 1 ∣ x ) P(y=1 |x) P(y=1∣x)

给定一个输入 x x x,逻辑回归模型的输出是一个概率值,表示属于类 1 的概率:

h θ ( x ) = P ( y = 1 ∣ x ) = 1 1 + e − θ T x h_{\theta}(\mathbf{x}) = P(y=1 | \mathbf{x}) = \frac{1}{1 + e^{-\theta^T \mathbf{x}}} hθ(x)=P(y=1∣x)=1+eθTx1

其中, θ \theta θ 是模型的参数向量, θ T x \theta^T \mathbf{x} θTx 是输入特征的线性组合。

2. 似然函数

在逻辑回归中,我们希望通过最大化似然函数来找到最优参数 θ \theta θ。对于一组训练数据 { ( x i , y i ) } \{ (\mathbf{x}_i, y_i) \} {(xi,yi)},每个样本 x i \mathbf{x}_i xi 对应的真实标签 y i y_i yi 是 0 或 1。

假设所有样本是独立同分布的,整个数据集的似然函数可以表示为:

L ( θ ) = ∏ i = 1 m P ( y i ∣ x i ; θ ) L(\theta) = \prod_{i=1}^m P(y_i | \mathbf{x}_i; \theta) L(θ)=i=1mP(yixi;θ)

根据 y i y_i yi 的取值(0 或 1),我们可以写成:

L ( θ ) = ∏ i = 1 m h θ ( x i ) y i ( 1 − h θ ( x i ) ) 1 − y i L(\theta) = \prod_{i=1}^m h_{\theta}(\mathbf{x}_i)^{y_i} (1 - h_{\theta}(\mathbf{x}_i))^{1 - y_i} L(θ)=i=1mhθ(xi)yi(1hθ(xi))1yi

这个公式表示,当 y i = 1 y_i = 1 yi=1 时,选择 h θ ( x i ) h_{\theta}(\mathbf{x}_i) hθ(xi),而当 y i = 0 y_i = 0 yi=0 时,选择 1 − h θ ( x i ) 1 - h_{\theta}(\mathbf{x}_i) 1hθ(xi)

3. 对数似然函数

由于似然函数是多个概率的连乘,直接求解比较困难。为简化计算,我们取对数(因为对数函数是单调递增的,最大化对数似然等价于最大化似然函数本身):

ℓ ( θ ) = log ⁡ L ( θ ) = ∑ i = 1 m [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] \ell(\theta) = \log L(\theta) = \sum_{i=1}^m \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] (θ)=logL(θ)=i=1m[yiloghθ(xi)+(1yi)log(1hθ(xi))]

这就是对数似然函数。我们的目标是最大化它,即: max ⁡ θ ℓ ( θ ) \max_{\theta} \ell(\theta) maxθ(θ)
为了方便,我们可以将最大化对数似然函数转化为最小化它的负对数似然函数,这样问题就转化为一个最小化问题:

J ( θ ) = − ℓ ( θ ) = − ∑ i = 1 m [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] J(\theta) = - \ell(\theta) = - \sum_{i=1}^m \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] J(θ)=(θ)=i=1m[yiloghθ(xi)+(1yi)log(1hθ(xi))]

这个 J ( θ ) J(\theta) J(θ) 就是逻辑回归的损失函数。

4. 我们来详细推导:

ℓ ( θ ) = log ⁡ L ( θ ) = ∑ i = 1 m [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] \ell(\theta) = \log L(\theta) = \sum_{i=1}^m \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] (θ)=logL(θ)=i=1m[yiloghθ(xi)+(1yi)log(1hθ(xi))]

1. 取对数

由于似然函数是多个概率的连乘形式,直接优化这种乘法形式的函数在计算上比较复杂。我们可以通过对数变换将乘法转换为加法,使得优化问题更容易处理。具体来说,对似然函数 ( L(\theta) ) 取对数,得到对数似然函数(log-likelihood function):

ℓ ( θ ) = log ⁡ L ( θ ) \ell(\theta) = \log L(\theta) (θ)=logL(θ)

将似然函数代入,取对数:

ℓ ( θ ) = log ⁡ ( ∏ i = 1 m h θ ( x i ) y i ⋅ ( 1 − h θ ( x i ) ) 1 − y i ) \ell(\theta) = \log \left( \prod_{i=1}^{m} h_{\theta}(\mathbf{x}_i)^{y_i} \cdot (1 - h_{\theta}(\mathbf{x}_i))^{1 - y_i} \right) (θ)=log(i=1mhθ(xi)yi(1hθ(xi))1yi)

利用对数的乘法性质: log ⁡ ( a ⋅ b ) = log ⁡ a + log ⁡ b \log (a \cdot b) = \log a + \log b log(ab)=loga+logb,可以将乘法转换为加法:

ℓ ( θ ) = ∑ i = 1 m log ⁡ ( h θ ( x i ) y i ⋅ ( 1 − h θ ( x i ) ) 1 − y i ) \ell(\theta) = \sum_{i=1}^{m} \log \left( h_{\theta}(\mathbf{x}_i)^{y_i} \cdot (1 - h_{\theta}(\mathbf{x}_i))^{1 - y_i} \right) (θ)=i=1mlog(hθ(xi)yi(1hθ(xi))1yi)

接下来,利用对数的幂法则: log ⁡ ( a b ) = b log ⁡ a \log (a^b) = b \log a log(ab)=bloga,我们进一步分解每一项:

ℓ ( θ ) = ∑ i = 1 m [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] \ell(\theta) = \sum_{i=1}^{m} \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] (θ)=i=1m[yiloghθ(xi)+(1yi)log(1hθ(xi))]

这就是对数似然函数的完整形式。

5. 损失函数

我们最终得到的对数似然函数是一个用于衡量模型表现的函数。为了最小化损失,我们通常最大化对数似然函数(最大似然估计)。但更常见的做法是取负号,将最大化问题转化为最小化问题:

J ( θ ) = − ℓ ( θ ) = − ∑ i = 1 m [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] J(\theta) = - \ell(\theta) = - \sum_{i=1}^{m} \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] J(θ)=(θ)=i=1m[yiloghθ(xi)+(1yi)log(1hθ(xi))]

这个 J ( θ ) J(\theta) J(θ) 就是逻辑回归的损失函数。通过最小化它,我们可以找到最优的参数 θ \theta θ,使模型的预测最接近真实标签。

6. 梯度下降算法

最小化逻辑回归的损失函数 ( J(\theta) ) 的过程通常通过 梯度下降算法 或其变种来完成。以下是具体步骤和方法。

1. 梯度下降算法

梯度下降是一种用于优化目标函数的迭代算法。其基本思想是:通过不断更新参数,使得损失函数逐渐减小,最终找到损失函数的最小值。在逻辑回归中,我们的目标是最小化损失函数 ( J(\theta) )。

梯度下降的更新公式如下:

θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta_j := \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} θj:=θjαθjJ(θ)

其中:

  • θ j \theta_j θj 是逻辑回归模型的参数(特征对应的权重), j ∈ { 0 , 1 , … , n } j \in \{0, 1, \dots, n\} j{0,1,,n}
  • α \alpha α 是学习率(决定每次更新的步长);
  • ∂ J ( θ ) ∂ θ j \frac{\partial J(\theta)}{\partial \theta_j} θjJ(θ) 是损失函数 J ( θ ) J(\theta) J(θ)对参数 θ j \theta_j θj 的偏导数。
2. 损失函数的梯度推导

为了使用梯度下降,我们首先需要计算损失函数 ( J(\theta) ) 对每个参数 ( \theta_j ) 的偏导数。损失函数的形式为:

J ( θ ) = − 1 m ∑ i = 1 m [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] J(\theta) = - \frac{1}{m} \sum_{i=1}^{m} \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] J(θ)=m1i=1m[yiloghθ(xi)+(1yi)log(1hθ(xi))]

其中, h θ ( x i ) = 1 1 + e − θ T x i h_{\theta}(\mathbf{x}_i) = \frac{1}{1 + e^{-\theta^T \mathbf{x}_i}} hθ(xi)=1+eθTxi1 是逻辑回归模型的输出,即第 i i i 个样本属于类别 1 的概率。

为了方便计算,我们对 J ( θ ) J(\theta) J(θ) 的偏导数进行推导。

好的,我们详细讲解通过 链式法则 来推导逻辑回归损失函数的偏导数,进而得到梯度的过程。

2.1 通过链式法则推导偏导数

为了推导损失函数 J ( θ ) J(\theta) J(θ) 对参数 θ j \theta_j θj 的偏导数,我们使用 链式法则。这里,我们将逐步推导出偏导数公式。

2.1.1 损失函数对 θ j \theta_j θj 的偏导数

首先,我们需要对损失函数 J ( θ ) J(\theta) J(θ) θ j \theta_j θj 求偏导。对第 i i i 个样本 ( x i , y i ) (\mathbf{x}_i, y_i) (xi,yi) 的损失函数项:

J i ( θ ) = − [ y i log ⁡ h θ ( x i ) + ( 1 − y i ) log ⁡ ( 1 − h θ ( x i ) ) ] J_i(\theta) = - \left[ y_i \log h_{\theta}(\mathbf{x}_i) + (1 - y_i) \log (1 - h_{\theta}(\mathbf{x}_i)) \right] Ji(θ)=[yiloghθ(xi)+(1yi)log(1hθ(xi))]

求其关于 θ j \theta_j θj 的偏导数:

∂ J i ( θ ) ∂ θ j \frac{\partial J_i(\theta)}{\partial \theta_j} θjJi(θ)

为了简化推导,我们先对两个部分分别求导。

2.1.2 对 log ⁡ h θ ( x i ) \log h_{\theta}(\mathbf{x}_i) loghθ(xi) 的偏导

我们首先对 log ⁡ h θ ( x i ) \log h_{\theta}(\mathbf{x}_i) loghθ(xi) 的部分求导:

∂ ∂ θ j ( log ⁡ h θ ( x i ) ) \frac{\partial}{\partial \theta_j} \left( \log h_{\theta}(\mathbf{x}_i) \right) θj(loghθ(xi))

根据链式法则,我们知道:

∂ ∂ θ j log ⁡ h θ ( x i ) = 1 h θ ( x i ) ⋅ ∂ h θ ( x i ) ∂ θ j \frac{\partial}{\partial \theta_j} \log h_{\theta}(\mathbf{x}_i) = \frac{1}{h_{\theta}(\mathbf{x}_i)} \cdot \frac{\partial h_{\theta}(\mathbf{x}_i)}{\partial \theta_j} θjloghθ(xi)=hθ(xi)1θjhθ(xi)

接下来,我们需要计算 h θ ( x i ) h_{\theta}(\mathbf{x}_i) hθ(xi) θ j \theta_j θj的导数。由于 h θ ( x i ) h_{\theta}(\mathbf{x}_i) hθ(xi)sigmoid 函数,即:

h θ ( x i ) = 1 1 + e − θ T x i h_{\theta}(\mathbf{x}_i) = \frac{1}{1 + e^{-\theta^T \mathbf{x}_i}} hθ(xi)=1+eθTxi1

使用链式法则对 θ j \theta_j θj 求导,首先对内层的 θ T x i = ∑ k = 0 n θ k x i k \theta^T \mathbf{x}_i = \sum_{k=0}^{n} \theta_k x_{ik} θTxi=k=0nθkxik 求导,结果是:

∂ ∂ θ j ( θ T x i ) = x i j \frac{\partial}{\partial \theta_j} \left( \theta^T \mathbf{x}_i \right) = x_{ij} θj(θTxi)=xij

接下来,sigmoid 函数的导数是:

∂ h θ ( x i ) ∂ z = h θ ( x i ) ( 1 − h θ ( x i ) ) \frac{\partial h_{\theta}(\mathbf{x}_i)}{\partial z} = h_{\theta}(\mathbf{x}_i) (1 - h_{\theta}(\mathbf{x}_i)) zhθ(xi)=hθ(xi)(1hθ(xi))

其中, z = θ T x i z = \theta^T \mathbf{x}_i z=θTxi

因此:

∂ h θ ( x i ) ∂ θ j = h θ ( x i ) ( 1 − h θ ( x i ) ) x i j \frac{\partial h_{\theta}(\mathbf{x}_i)}{\partial \theta_j} = h_{\theta}(\mathbf{x}_i) (1 - h_{\theta}(\mathbf{x}_i)) x_{ij} θjhθ(xi)=hθ(xi)(1hθ(xi))xij

现在我们可以将它代入先前的结果中:

∂ ∂ θ j ( log ⁡ h θ ( x i ) ) = 1 h θ ( x i ) ⋅ h θ ( x i ) ( 1 − h θ ( x i ) ) x i j \frac{\partial}{\partial \theta_j} \left( \log h_{\theta}(\mathbf{x}_i) \right) = \frac{1}{h_{\theta}(\mathbf{x}_i)} \cdot h_{\theta}(\mathbf{x}_i) (1 - h_{\theta}(\mathbf{x}_i)) x_{ij} θj(loghθ(xi))=hθ(xi)1hθ(xi)(1hθ(xi))xij

简化为:

∂ ∂ θ j ( log ⁡ h θ ( x i ) ) = ( 1 − h θ ( x i ) ) x i j \frac{\partial}{\partial \theta_j} \left( \log h_{\theta}(\mathbf{x}_i) \right) = (1 - h_{\theta}(\mathbf{x}_i)) x_{ij} θj(loghθ(xi))=(1hθ(xi))xij

2.1.3 对 log ⁡ ( 1 − h θ ( x i ) ) \log (1 - h_{\theta}(\mathbf{x}_i)) log(1hθ(xi)) 的偏导

接下来,我们对 log ⁡ ( 1 − h θ ( x i ) ) \log (1 - h_{\theta}(\mathbf{x}_i)) log(1hθ(xi)) 求偏导:

∂ ∂ θ j log ⁡ ( 1 − h θ ( x i ) ) \frac{\partial}{\partial \theta_j} \log (1 - h_{\theta}(\mathbf{x}_i)) θjlog(1hθ(xi))

同样应用链式法则:

∂ ∂ θ j log ⁡ ( 1 − h θ ( x i ) ) = 1 1 − h θ ( x i ) ⋅ ∂ ( 1 − h θ ( x i ) ) ∂ θ j \frac{\partial}{\partial \theta_j} \log (1 - h_{\theta}(\mathbf{x}_i)) = \frac{1}{1 - h_{\theta}(\mathbf{x}_i)} \cdot \frac{\partial (1 - h_{\theta}(\mathbf{x}_i))}{\partial \theta_j} θjlog(1hθ(xi))=1hθ(xi)1θj(1hθ(xi))

1 − h θ ( x i ) 1 - h_{\theta}(\mathbf{x}_i) 1hθ(xi) 求导:

∂ ( 1 − h θ ( x i ) ) ∂ θ j = − h θ ( x i ) ( 1 − h θ ( x i ) ) x i j \frac{\partial (1 - h_{\theta}(\mathbf{x}_i))}{\partial \theta_j} = - h_{\theta}(\mathbf{x}_i) (1 - h_{\theta}(\mathbf{x}_i)) x_{ij} θj(1hθ(xi))=hθ(xi)(1hθ(xi))xij

因此:

∂ ∂ θ j log ⁡ ( 1 − h θ ( x i ) ) = − h θ ( x i ) 1 − h θ ( x i ) ⋅ ( 1 − h θ ( x i ) ) x i j \frac{\partial}{\partial \theta_j} \log (1 - h_{\theta}(\mathbf{x}_i)) = - \frac{h_{\theta}(\mathbf{x}_i)}{1 - h_{\theta}(\mathbf{x}_i)} \cdot (1 - h_{\theta}(\mathbf{x}_i)) x_{ij} θjlog(1hθ(xi))=1hθ(xi)hθ(xi)(1hθ(xi))xij

简化为:

∂ ∂ θ j log ⁡ ( 1 − h θ ( x i ) ) = − h θ ( x i ) x i j \frac{\partial}{\partial \theta_j} \log (1 - h_{\theta}(\mathbf{x}_i)) = - h_{\theta}(\mathbf{x}_i) x_{ij} θjlog(1hθ(xi))=hθ(xi)xij

2.1.4 组合偏导数

现在我们可以将偏导数组合在一起,得到损失函数对 ( \theta_j ) 的总偏导数:

∂ J i ( θ ) ∂ θ j = − [ y i ⋅ ( 1 − h θ ( x i ) ) x i j + ( 1 − y i ) ⋅ ( − h θ ( x i ) x i j ) ] \frac{\partial J_i(\theta)}{\partial \theta_j} = - \left[ y_i \cdot (1 - h_{\theta}(\mathbf{x}_i)) x_{ij} + (1 - y_i) \cdot (- h_{\theta}(\mathbf{x}_i) x_{ij}) \right] θjJi(θ)=[yi(1hθ(xi))xij+(1yi)(hθ(xi)xij)]

简化为:

∂ J i ( θ ) ∂ θ j = ( h θ ( x i ) − y i ) x i j \frac{\partial J_i(\theta)}{\partial \theta_j} = (h_{\theta}(\mathbf{x}_i) - y_i) x_{ij} θjJi(θ)=(hθ(xi)yi)xij

2.1.5 总损失函数的梯度

将所有样本的偏导数相加得到总损失函数 J ( θ ) J(\theta) J(θ) θ j \theta_j θj 的偏导数:

∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x i j \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(\mathbf{x}_i) - y_i) x_{ij} θjJ(θ)=m1i=1m(hθ(xi)yi)xij

7. 梯度更新公式

现在我们有了损失函数的梯度,可以使用梯度下降法更新参数 θ j \theta_j θj

θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta_j := \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} θj:=θjαθjJ(θ)

即:

θ j : = θ j − α ⋅ 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x i j \theta_j := \theta_j - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(\mathbf{x}_i) - y_i) x_{ij} θj:=θjαm1i=1m(hθ(xi)yi)xij

通过不断迭代更新参数,损失函数逐渐减小,最终找到参数 θ \theta θ 的最优解。

-----以上推导来自gpt4-o模型问答

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成式人工智能

这个接龙的生成就是概率式的,下一个接龙的字是有概率的 本身就是在做文字接龙的游戏,不会搜索网上的资料

Zig语言通用代码生成器:逻辑,冒烟测试版发布

#1024程序员节 | 征文# Zig语言通用代码生成器:逻辑,冒烟测试版发布 Zig语言是一种新的系统编程语言,其生态位类同与C,是前一段时间大热的rust语言的竞品。它某种意义上的确非常像rust,尤其是在开发过程中无穷无尽抛错…

【哈工大_操作系统理论】L282930 生磁盘的使用从生磁盘到文件文件使用磁盘的实现

L4.3 生磁盘的使用 1、认识磁盘 选择磁道旋转扇区数据读写 哪一个柱面 C哪一个磁头 H哪一个扇区 S 2、第一层抽象:盘块号block 发送盘块号block,磁盘驱动根据 block 计算出 cyl、head、sec(CHS) 磁盘访问时间主要是寻道时间…

精准布局:探索CSS中的盒子固定定位的魅力

一、概念 固定定位使元素相对于浏览器窗口进行定位&#xff0c;无论网页如何滚动&#xff0c;固定定位的元素也会保持在相同的位置&#xff0c;设置固定定位的元素脱离文档流。 二、语法结构 <style>选择器{/* fixed 固定定位 */position: fixed;}</style> 与绝…

LeetCode练习-删除链表的第n个结节

大家好&#xff0c;依旧是你们的萧萧啊。 今天我们来练习一个经典的链表问题&#xff1a;删除链表的第n个节点。在这篇文章中&#xff0c;我们将深入分析这个问题&#xff0c;并给出一个有效的解决方案。 问题描述 给定一个链表&#xff0c;要求删除链表的倒数第n个节点&…

WRB Hidden Gap,WRB隐藏缺口,MetaTrader 免费公式!(指标教程)

WRB Hidden Gap MetaTrader 指标用于检测和标记宽范围的柱体&#xff08;非常长的柱体&#xff09;或宽范围的烛身&#xff08;具有非常长实体的阴阳烛&#xff09;。此指标可以识别WRB中的隐藏跳空&#xff0c;并区分显示已填补和未填补的隐藏跳空&#xff0c;方便用户一眼识别…

GEE数据集:1984-2022 年间加拿大 6.5 亿公顷森林生态系统的年度优势树种(也称主要树种)地图

目录 简介 数据集说明 空间信息 变量 代码 代码链接 下载链接 引用 许可 网址推荐 0代码在线构建地图应用 机器学习 简介 加拿大长期树种&#xff08;1984-2022 年&#xff09;∥在该数据集中&#xff0c;我们利用空间分辨率为 30 米的 Landsat 时间序列图像&…

etl-查询错误log日志和oracle删除数据表空间

查看weblogic日志的目录 建立连接ssh root192.168.30.1xx 密码hygd123 找到下面路径中的文件 cd /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/bapp-logs 查看log日志 tail -f -n 400 Adminservers.log oracle删除表空间&#xff08;切换到dba用户…

家庭宽带的ip地址是固定的吗?宽带ip地址怎么修改‌

在家庭网络环境中&#xff0c;IP地址的分配和管理是用户常关注的问题。本文将探讨家庭宽带IP地址的固定性&#xff0c;并介绍如何修改宽带IP地址&#xff0c;以满足用户的不同需求。 一、家庭宽带的IP地址是否固定? 关于家庭宽带的IP地址是否固定&#xff0c;答案并非一概而论…

【深入学习Redis丨第八篇】详解Redis数据持久化机制

前言 Redis支持两种数据持久化方式&#xff1a;RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上&#xff0c;后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用&#xff0c;但是通常会将两者结合使用。 一、持久化 1.1、什么…

【Android】使用 Compose 自定义 View 实现从 0 ~ 1 仿 EChat 柱状图

目录 前言DrawScopeDrawScope Api 绘制柱状图绘制 X 轴绘制 Y 轴绘制柱状背景绘制柱状前景完整代码最终效果 存在的问题 前言 本文讲的是使用 compose 去自定义 View &#xff0c;如果您未曾通过继承 View 的方式去实现自定义 View&#xff0c;那么&#xff0c;我建议在观看本…

监控-08-skywalking监控告警

文章目录 前言一、准备二、配置skywalking2.1 修改alarm-settings.yml2.2 重启skywalking 三、收到告警邮件总结 前言 skywalking根据监控规则&#xff0c;通过webhook调后端微服务接口&#xff0c;从而发送告警邮件。 一、准备 根据上几章内容&#xff0c;保证skywalking能监…

离散数学实验二c语言(输出关系矩阵,输出矩阵性质,输出自反闭包,对称闭包,传递闭包,判断矩阵是否为等价关系,相容关系,偏序关系)

离散数学实验二 一、算法描述&#xff0c;算法思想 &#xff08;一&#xff09;相关数据结构 typedef struct Set *S; //存放集合 struct Set {int size; //集合的元素个数char *A; //存放该集合的元素 }; Set存放有限集合A&#xff0c;该集合的元素个数为size&#xff0…

Kafka-Windows搭建全流程(环境,安装包,编译,消费案例,远程连接,服务自启,可视化工具)

目录 一. Kafka安装包获取 1. 官网地址 2. 百度网盘链接 二. 环境要求 1. Java 运行环境 (1) 对 java 环境变量进行配置 (2) 下载完毕之后进行解压 三. 启动Zookeeper 四. 启动Kafka (1) 修改Conf下的server.properties文件&#xff0c;修改kafka的日志文件路径 (2)…

海外云手机实现高效的海外社交媒体营销

随着全球化的深入发展&#xff0c;越来越多的中国企业走向国际市场&#xff0c;尤其是B2B外贸企业&#xff0c;海外社交媒体营销已成为其扩大市场的重要手段。在复杂多变的海外市场环境中&#xff0c;如何有效提高营销效率并降低运营风险&#xff0c;成为了众多企业的首要任务。…

无人机悬停精度算法!

一、主要算法类型 PID控制算法&#xff1a; PID控制算法是一种常用的闭环控制算法&#xff0c;通过计算目标值与当前值的误差&#xff0c;并根据比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;、微分&#xff08;D&#xff09;三个参数来调整控制输出&#x…

SQL高级查询03

SQL查询语句的下载脚本链接&#xff01;&#xff01;&#xff01; 【免费】SQL练习资源-具体练习操作可以查看我发布的文章资源-CSDN文库​编辑https://download.csdn.net/download/Z0412_J0103/89908378https://download.csdn.net/download/Z0412_J0103/89908378 1 查询employ…

聚链成网,趣链科技参与 “跨链创新联合体”建设

近日&#xff0c;2024全球数商大会在上海举办。大会由上海数据集团和上海市数商协会联合主办&#xff0c;上海市数据局和浦东新区人民政府支持&#xff0c;以“数联全球&#xff0c;商通未来——‘链’接数字经济新未来”为主题&#xff0c;聚焦区块链技术和应用场景展开。 会上…

PostGis空间(下):空间连接与空间索引

目录 1、简介2、空间连接3、空间索引3.1 索引操作3.2 空间索引的工作原理3.2.1 R-Tree 3.3 空间索引函数3.4 仅索引查询3.5 ANALYZE3.6 VACUUMing3.7 函数列表 PS 1024到啦&#xff01;&#xff01;&#xff01; 先祝各位程序员或者想成为程序员正在奋斗中的伙伴1024程序员节快…

JavaScript进阶:手写代码挑战(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript手写代码篇 在现代Web开发中&#xff0c;JavaScript 是不可或缺的编程语言…