Fisher散度:从信息几何到机器学习的隐藏利器

Fisher散度:从信息几何到机器学习的隐藏利器

在机器学习和统计学中,比较两个概率分布的差异是常见任务,比如评估真实分布与模型预测分布的差距。KL散度(Kullback-Leibler Divergence)可能是大家熟悉的选择,但今天我们要介绍一个不太常见却同样重要的指标——Fisher散度(Fisher Divergence)。它与Fisher信息矩阵关系密切,不仅有深厚的理论根基,还在生成模型和变分推断等领域大放异彩。这篇博客将详细讲解Fisher散度的定义、数学公式、推导过程及其应用,特别澄清推导中的关键步骤,既通俗易懂,也适合研究者深入探索。


什么是Fisher散度?

Fisher散度是一种基于对数密度梯度(即得分函数,Score Function)来度量两个概率分布 ( p ( x ) p(x) p(x) ) 和 ( q ( x ) q(x) q(x) ) 之间差异的指标。它得名于Fisher信息矩阵,源于信息几何,利用分布的局部曲率来比较“形状”差异。

通俗比喻

想象你在比较两座山(分布 ( p p p ) 和 ( q q q ))。KL散度像是在测量两座山的“总体体积差”,而Fisher散度更像是站在山坡上,比较两座山的“坡度”(梯度)在每个点的差异。它关注分布的局部变化,而非全局概率质量。


Fisher散度的数学定义

Fisher散度的形式因应用场景而异。最常见的是得分匹配(Score Matching)中的定义,表示为得分函数差异的平方范数:

D F ( p ∥ q ) = ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) − ∇ log ⁡ q ( x ) ∥ 2   d x D_F(p \parallel q) = \int p(x) \left\| \nabla \log p(x) - \nabla \log q(x) \right\|^2 \, dx DF(pq)=p(x)logp(x)logq(x)2dx

  • ( ∇ log ⁡ p ( x ) \nabla \log p(x) logp(x) ) 和 ( \nabla \log q(x) ):分别是 ( p(x)$ ) 和 ( q ( x ) q(x) q(x) ) 的对数密度梯度。
  • ( ∥ ⋅ ∥ 2 \left\| \cdot \right\|^2 2 ):欧几里得范数的平方,衡量梯度差异。
  • ( p ( x ) p(x) p(x) ):以 ( p ( x ) p(x) p(x) ) 加权,强调真实分布的视角。

更广义的形式可能涉及Fisher信息矩阵:

D F ( p ∥ q ) = ∫ p ( x ) ( ∇ log ⁡ p ( x ) − ∇ log ⁡ q ( x ) ) T I ( x ) ( ∇ log ⁡ p ( x ) − ∇ log ⁡ q ( x ) )   d x D_F(p \parallel q) = \int p(x) \left( \nabla \log p(x) - \nabla \log q(x) \right)^T I(x) \left( \nabla \log p(x) - \nabla \log q(x) \right) \, dx DF(pq)=p(x)(logp(x)logq(x))TI(x)(logp(x)logq(x))dx

  • ( I ( x ) I(x) I(x) ):Fisher信息矩阵,通常定义为 ( I ( x ) = E p [ ∇ log ⁡ p ( x ) ∇ log ⁡ p ( x ) T ] I(x) = E_p[\nabla \log p(x) \nabla \log p(x)^T] I(x)=Ep[logp(x)logp(x)T] )。

Fisher散度不对称(( D F ( p ∥ q ) ≠ D F ( q ∥ p ) D_F(p \parallel q) \neq D_F(q \parallel p) DF(pq)=DF(qp) )),也不满足三角不等式,因此不是严格的距离。


Fisher散度的推导

为了理解Fisher散度的来源,我们从得分匹配的角度推导其常见形式,并解决推导中的疑惑点(如交叉项系数调整)。

得分匹配中的Fisher散度

得分匹配的目标是让模型分布 ( q ( x ) q(x) q(x) ) 的得分函数 ( ∇ log ⁡ q ( x ) \nabla \log q(x) logq(x) ) 接近真实分布 ( p ( x ) p(x) p(x) ) 的得分函数 ( ∇ log ⁡ p ( x ) \nabla \log p(x) logp(x) )。Fisher散度是这一过程的自然损失函数。

推导步骤

假设我们要最小化 ( q ( x ) q(x) q(x) ) 和 ( p ( x ) p(x) p(x) ) 在得分函数上的差异,定义损失:

L ( q ) = ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) − ∇ log ⁡ q ( x ) ∥ 2   d x L(q) = \int p(x) \left\| \nabla \log p(x) - \nabla \log q(x) \right\|^2 \, dx L(q)=p(x)logp(x)logq(x)2dx

展开平方项:

L ( q ) = ∫ p ( x ) [ ∥ ∇ log ⁡ p ( x ) ∥ 2 − 2 ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x ) + ∥ ∇ log ⁡ q ( x ) ∥ 2 ]   d x L(q) = \int p(x) \left[ \left\| \nabla \log p(x) \right\|^2 - 2 \nabla \log p(x)^T \nabla \log q(x) + \left\| \nabla \log q(x) \right\|^2 \right] \, dx L(q)=p(x)[logp(x)22∇logp(x)Tlogq(x)+logq(x)2]dx

  • 第一项 ( ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) ∥ 2   d x \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx p(x)logp(x)2dx ):只依赖 ( p ( x ) p(x) p(x) ),是常数。
  • 第二项 ( − 2 ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x -2 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx 2p(x)logp(x)Tlogq(x)dx ):交叉项,依赖 ( p p p ) 和 ( q q q )。
  • 第三项 ( ∫ p ( x ) ∥ ∇ log ⁡ q ( x ) ∥ 2   d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx p(x)logq(x)2dx ):依赖 ( q q q ),需要转换。

直接优化 ( L ( q ) L(q) L(q) ) 对 ( q ( x ) q(x) q(x) ) 的函数梯度较为复杂。得分匹配的关键是利用分部积分,将第三项转换为更易处理的形式。

分部积分简化

处理第三项:

∫ p ( x ) ∥ ∇ log ⁡ q ( x ) ∥ 2   d x = ∫ p ( x ) ∇ log ⁡ q ( x ) T ∇ log ⁡ q ( x )   d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = \int p(x) \nabla \log q(x)^T \nabla \log q(x) \, dx p(x)logq(x)2dx=p(x)logq(x)Tlogq(x)dx

因为 ( ∇ log ⁡ q ( x ) = ∇ q ( x ) q ( x ) \nabla \log q(x) = \frac{\nabla q(x)}{q(x)} logq(x)=q(x)q(x) ):

∇ log ⁡ q ( x ) T ∇ log ⁡ q ( x ) = ∇ log ⁡ q ( x ) T ∇ q ( x ) q ( x ) \nabla \log q(x)^T \nabla \log q(x) = \nabla \log q(x)^T \frac{\nabla q(x)}{q(x)} logq(x)Tlogq(x)=logq(x)Tq(x)q(x)

应用向量形式的分部积分(散度定理):

∫ p ( x ) ∇ log ⁡ q ( x ) T ∇ q ( x ) q ( x )   d x = ∫ ∇ T [ p ( x ) ∇ log ⁡ q ( x ) ]   d x − ∫ ∇ p ( x ) T ∇ log ⁡ q ( x )   d x \int p(x) \nabla \log q(x)^T \frac{\nabla q(x)}{q(x)} \, dx = \int \nabla^T [p(x) \nabla \log q(x)] \, dx - \int \nabla p(x)^T \nabla \log q(x) \, dx p(x)logq(x)Tq(x)q(x)dx=T[p(x)logq(x)]dxp(x)Tlogq(x)dx

假设边界项 ( ∫ ∇ T [ p ∇ log ⁡ q ]   d x \int \nabla^T [p \nabla \log q] \, dx T[plogq]dx ) 在无穷远为零(概率密度通常满足此条件),则:

∫ p ( x ) ∥ ∇ log ⁡ q ( x ) ∥ 2   d x = − ∫ ∇ p ( x ) T ∇ log ⁡ q ( x )   d x + ∫ p ( x ) ∇ T ∇ log ⁡ q ( x )   d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = - \int \nabla p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx p(x)logq(x)2dx=p(x)Tlogq(x)dx+p(x)Tlogq(x)dx

代入 ( ∇ p = p ∇ log ⁡ p \nabla p = p \nabla \log p p=plogp ):

∫ p ( x ) ∥ ∇ log ⁡ q ( x ) ∥ 2   d x = − ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x + ∫ p ( x ) ∇ T ∇ log ⁡ q ( x )   d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx p(x)logq(x)2dx=p(x)logp(x)Tlogq(x)dx+p(x)Tlogq(x)dx

代回原始损失

将第三项替换回 ( L ( q ) L(q) L(q) ):

L ( q ) = ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) ∥ 2   d x − 2 ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x + [ − ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x + ∫ p ( x ) ∇ T ∇ log ⁡ q ( x )   d x ] L(q) = \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx - 2 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \left[ - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx \right] L(q)=p(x)logp(x)2dx2p(x)logp(x)Tlogq(x)dx+[p(x)logp(x)Tlogq(x)dx+p(x)Tlogq(x)dx]

合并交叉项:

− 2 ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x − ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x = − 3 ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x -2 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx = -3 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx 2p(x)logp(x)Tlogq(x)dxp(x)logp(x)Tlogq(x)dx=3p(x)logp(x)Tlogq(x)dx

得到:

L ( q ) = ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) ∥ 2   d x − 3 ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x + ∫ p ( x ) ∇ T ∇ log ⁡ q ( x )   d x L(q) = \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx - 3 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx L(q)=p(x)logp(x)2dx3p(x)logp(x)Tlogq(x)dx+p(x)Tlogq(x)dx

调整到标准形式

此时,交叉项系数是 ( − 3 -3 3)。但得分匹配的标准形式(Hyvärinen, 2005)是:

L ( q ) = const + ∫ p ( x ) [ − 2 ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x ) + ∇ T ∇ log ⁡ q ( x ) ]   d x L(q) = \text{const} + \int p(x) \left[ -2 \nabla \log p(x)^T \nabla \log q(x) + \nabla^T \nabla \log q(x) \right] \, dx L(q)=const+p(x)[2∇logp(x)Tlogq(x)+Tlogq(x)]dx

为什么从 ( − 3 -3 3) 变成 ( − 2 -2 2)?得分匹配的目标是优化 ( q ( x ) q(x) q(x) ) 使其得分匹配 ( p ( x ) p(x) p(x) ) 的得分。原始定义中的交叉项是 ( − 2 -2 2),分部积分引入了额外的 ( − 1 -1 1)。在优化中,我们只关心 ( q q q ) 的可变部分,等价形式保留原始的 ( − 2 -2 2),将多余的 ( − 1 -1 1)(即 ( − ∫ p ∇ log ⁡ p T ∇ log ⁡ q -\int p \nabla \log p^T \nabla \log q plogpTlogq ))归入常数,因为它不影响 ( q q q ) 的优化结果(详见附录)。

最终损失为:

L ( q ) = const + ∫ p ( x ) [ − 2 ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x ) + ∇ T ∇ log ⁡ q ( x ) ]   d x L(q) = \text{const} + \int p(x) \left[ -2 \nabla \log p(x)^T \nabla \log q(x) + \nabla^T \nabla \log q(x) \right] \, dx L(q)=const+p(x)[2∇logp(x)Tlogq(x)+Tlogq(x)]dx

验证:最小化此损失,求变分导数为零,得 ( ∇ log ⁡ q ( x ) = ∇ log ⁡ p ( x ) \nabla \log q(x) = \nabla \log p(x) logq(x)=logp(x) ),与 ( D F ( p ∥ q ) D_F(p \parallel q) DF(pq) ) 的目标一致。


Fisher散度的性质

  1. 非负性
    D F ( p ∥ q ) ≥ 0 ,等于 0 当且仅当 ∇ log ⁡ p ( x ) = ∇ log ⁡ q ( x )   (几乎处处) D_F(p \parallel q) \geq 0,等于0 当且仅当 \nabla \log p(x) = \nabla \log q(x) \,(几乎处处) DF(pq)0,等于0当且仅当logp(x)=logq(x)(几乎处处)
    对于可微分布,意味着 ( p ( x ) ∝ q ( x ) p(x) \propto q(x) p(x)q(x) )。

  2. 不对称性
    Fisher散度以 ( p ( x ) p(x) p(x) ) 加权,因此 ( D F ( p ∥ q ) ≠ D F ( q ∥ p ) D_F(p \parallel q) \neq D_F(q \parallel p) DF(pq)=DF(qp) )。

  3. 局部性
    它聚焦得分函数差异,反映分布的局部特性。


在机器学习中的应用

Fisher散度在生成模型和统计推断中有重要应用:

1. 得分匹配(Score Matching)

  • 用途:训练生成模型(如得分基模型)。
  • 方法:通过最小化Fisher散度,模型 ( q ( x ) q(x) q(x) ) 学习 ( p ( x ) p(x) p(x) ) 的得分函数,再用朗之万采样生成样本。
  • 优势:无需归一化常数,适合高维数据(如图像)。

2. 扩散模型(Diffusion Models)

  • 联系:反向去噪过程依赖得分估计,Fisher散度是训练核心。
  • 例子:Stable Diffusion 通过神经网络逼近 ( ∇ log ⁡ p ( x t ) \nabla \log p(x_t) logp(xt) )。

3. 变分推断

  • 用途:近似后验分布时,衡量局部差异。
  • 优势:计算简便,梯度易得。

4. GAN改进

  • 用途:替代判别器损失,提升稳定性。

与KL散度的对比

  • KL散度
    D K L ( p ∥ q ) = ∫ p ( x ) log ⁡ p ( x ) q ( x )   d x D_{KL}(p \parallel q) = \int p(x) \log \frac{p(x)}{q(x)} \, dx DKL(pq)=p(x)logq(x)p(x)dx

    • 全局性:关注概率质量差异。
    • 计算复杂:需归一化。
  • Fisher散度

    • 局部性:关注得分差异。
    • 计算简便:仅需梯度。

总结

Fisher散度通过得分函数差异量化分布距离,兼具理论优雅与实践威力。它在得分匹配和扩散模型中大放异彩,推导中的分部积分虽复杂,但最终形式清晰简洁,确保优化目标正确。无论是研究分布特性,还是生成高质量样本,Fisher散度都是不可忽视的利器。下次遇到分布比较问题,试试Fisher散度吧!

有疑问或想看例子?欢迎留言交流!


附录:为什么不改变优化结果?常数可以随便改吗?

为什么不改变优化结果?

在得分匹配中,原始损失 ( L ( q ) = ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) − ∇ log ⁡ q ( x ) ∥ 2   d x L(q) = \int p(x) \left\| \nabla \log p(x) - \nabla \log q(x) \right\|^2 \, dx L(q)=p(x)logp(x)logq(x)2dx ) 展开后,分部积分将第三项转换为:

∫ p ( x ) ∥ ∇ log ⁡ q ( x ) ∥ 2   d x = − ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x + ∫ p ( x ) ∇ T ∇ log ⁡ q ( x )   d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx p(x)logq(x)2dx=p(x)logp(x)Tlogq(x)dx+p(x)Tlogq(x)dx

代回后,交叉项系数变成 ( − 3 -3 3):

L ( q ) = ∫ p ( x ) ∥ ∇ log ⁡ p ( x ) ∥ 2   d x − 3 ∫ p ( x ) ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x )   d x + ∫ p ( x ) ∇ T ∇ log ⁡ q ( x )   d x L(q) = \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx - 3 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx L(q)=p(x)logp(x)2dx3p(x)logp(x)Tlogq(x)dx+p(x)Tlogq(x)dx

但标准形式是:

L ( q ) = const + ∫ p ( x ) [ − 2 ∇ log ⁡ p ( x ) T ∇ log ⁡ q ( x ) + ∇ T ∇ log ⁡ q ( x ) ]   d x L(q) = \text{const} + \int p(x) \left[ -2 \nabla \log p(x)^T \nabla \log q(x) + \nabla^T \nabla \log q(x) \right] \, dx L(q)=const+p(x)[2∇logp(x)Tlogq(x)+Tlogq(x)]dx

多出的 ( − 1 -1 1)(即 ( − ∫ p ∇ log ⁡ p T ∇ log ⁡ q -\int p \nabla \log p^T \nabla \log q plogpTlogq ))被归入常数,为什么不影响优化结果?

  • 优化目标的等价性:得分匹配的目标是让 ( ∇ log ⁡ q ( x ) = ∇ log ⁡ p ( x ) \nabla \log q(x) = \nabla \log p(x) logq(x)=logp(x) )。无论交叉项系数是 ( − 3 -3 3) 还是 ( − 2 -2 2),只要损失函数的最优解(变分导数为零)保持一致,优化结果不变。
  • 变分导数:对 ( L ( q ) L(q) L(q) ) 求变分导数,忽略常数项:
    • 对于 (-3) 形式:
      δ L δ q = − 3 ∇ log ⁡ p + ∇ T ∇ log ⁡ q = 0    ⟹    ∇ log ⁡ q = 3 ∇ log ⁡ p \frac{\delta L}{\delta q} = -3 \nabla \log p + \nabla^T \nabla \log q = 0 \implies \nabla \log q = 3 \nabla \log p δqδL=3∇logp+Tlogq=0logq=3∇logp
      (错误,结果不匹配)。
    • 对于标准 ( − 2 -2 2) 形式:
      δ L δ q = − 2 ∇ log ⁡ p + ∇ T ∇ log ⁡ q = 0    ⟹    ∇ log ⁡ q = ∇ log ⁡ p \frac{\delta L}{\delta q} = -2 \nabla \log p + \nabla^T \nabla \log q = 0 \implies \nabla \log q = \nabla \log p δqδL=2∇logp+Tlogq=0logq=logp
      (正确,与目标一致)。
  • 修正原因:直接用 ( − 3 -3 3) 会导致错误的最优解。Hyvärinen (2005) 通过等价变换,保留原始定义的 ( − 2 -2 2),将分部积分引入的 ( − 1 -1 1) 归入常数,确保优化目标正确。这是因为 ( − ∫ p ∇ log ⁡ p T ∇ log ⁡ q -\int p \nabla \log p^T \nabla \log q plogpTlogq ) 虽含 ( q q q ),但在等价损失中不改变最小值点。

常数可以随便改吗(如 ( − 5 -5 5)、( − 6 -6 6))?

  • 不可以随便改:常数(如 ( const \text{const} const ))不影响优化结果,因为它不含 ( q q q ),对 ( q q q ) 的梯度为零。但交叉项系数(如 ( − 2 -2 2))直接影响 ( q q q ) 的优化路径。
  • 系数的作用:交叉项 ( − 2 ∫ p ∇ log ⁡ p T ∇ log ⁡ q   d x -2 \int p \nabla \log p^T \nabla \log q \, dx 2plogpTlogqdx ) 是 ( q q q ) 的线性项,改变系数(如 ( − 5 -5 5)、( − 6 -6 6))会改变变分导数的结果:
    • 若改为 ( − 5 -5 5):
      δ L δ q = − 5 ∇ log ⁡ p + ∇ T ∇ log ⁡ q = 0    ⟹    ∇ log ⁡ q = 5 ∇ log ⁡ p \frac{\delta L}{\delta q} = -5 \nabla \log p + \nabla^T \nabla \log q = 0 \implies \nabla \log q = 5 \nabla \log p δqδL=5∇logp+Tlogq=0logq=5∇logp
      (错误)。
  • 结论:常数 ( const \text{const} const ) 可以是任意值(如 ( 5 5 5)、( − 6 -6 6)),不影响 ( q q q ) 的最优解。但交叉项系数必须是 ( − 2 -2 2),以保证 ( ∇ log ⁡ q = ∇ log ⁡ p \nabla \log q = \nabla \log p logq=logp )。多余的 ( − 1 -1 1) 被归入常数,是推导中分离无关项的结果。

后记

2025年2月25日15点36分于上海,在Grok 3大模型辅助下完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字,然后转换为张量,成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型,重要的是使用与之关联的…

[Web 安全] PHP 反序列化漏洞 —— PHP 序列化 反序列化

关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01:PHP 序列化 — Serialize 序列化就是将对象的状态信息转化为可以存储或传输的形式的过程,在 PHP 中,通常使用 serialize() 函数来完成序列化的操作…

国科大——数据挖掘(0812课程)——课后作业

前沿: 此文章记录了2024年度秋季学期数据挖掘课程的三次课后作业,答案仅供参考。 第一次作业 1 假定数据仓库中包含4个维:date, product, vendor, location;和两个度量:sales_volume和sales_cost。 1)画…

从电子管到量子计算:计算机技术的未来趋势

计算机发展的历史 自古以来人类就在不断地发明和改进计算工具,从结绳计数到算盘,计算尺,手摇计算机,直到1946年第一台电子计算机诞生,虽然电子计算机至今虽然只有短短的半个多世纪,但取得了惊人的发展吗,已经经历了五代的变革。计算机的发展和电子技术的发展密切相关,…

Redis核心数据结构与底层实现

5种基础数据结构 String 字符串list 列表hash 字典set 集合zset 有序集合 deepseek的回答 String 内部编码 redis根据当前值的类型和长度决定使用哪种内部编码&#xff0c;共3种内部编码&#xff1a; int &#xff1a;value为整数时embstr : 短字符串&#xff08;长度<…

【我的Android进阶之旅】Android Studio SDK Update Site 国内的腾讯云镜像配置指南

一、腾讯云的镜像 https://mirrors.cloud.tencent.com/AndroidSDK/ 二、 打开 Android Studio‌的SDK Manager 路径:Tools–>SDK Manager 在右侧找到 SDK Update Sites 列表‌‌,添加如下链接,像下面一样,一个一个添加 将下面几个链接都加上去 https:

C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)

文章目录 1.继承的概念和定义2.基类与派生类之间的转换3.继承中的作用域4.派生类的默认成员函数5.实现一个不能被继承的类6.继承与友元7.继承与静态成员8.多继承和菱形继承问题8.1 继承分类及菱形继承8.2 虚继承 1.继承的概念和定义 概念&#xff1a; 继承(inheritance)机制是⾯…

OpenCV计算摄影学(2)图像去噪函数denoise_TVL1()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 原始-对偶算法是用于解决特定类型变分问题&#xff08;即&#xff0c;寻找一个函数以最小化某个泛函&#xff09;的算法。特别地&#xff0c;图像…

【Kimi】自动生成PPT-并支持下载和在线编辑--全部免费

【Kimi】免费生成PPT并免费下载 用了好几个大模型&#xff0c;有些能生成PPT内容&#xff1b; 有些能生成PPT&#xff0c;但下载需要付费&#xff1b; 目前只有Kimi生成的PPT&#xff0c;能选择模板、能在线编辑、能下载&#xff0c;关键全部免费&#xff01; 一、用kimi生成PP…

SQL注入(order by,limit),seacms的报错注入以及系统库的绕过

1&#xff1a;如果information_schema被过滤了&#xff0c;该怎么绕过 1.1&#xff1a;介绍一下information_schema这个库 information_schema 是一个非常重要的系统数据库&#xff0c;它在SQL标准中定义&#xff0c;并且被许多关系型数据库管理系统&#xff08;RDBMS&#x…

猿大师播放器:交通水利、公安消防Web端Vue网页播放20路RTSP H.265 1080P监控视频流

随着互联网技术的飞速发展&#xff0c;视频监控已成为各行各业不可或缺的一部分。无论是交通物流、公安消防&#xff0c;还是水利农业、园区校园&#xff0c;视频监控都扮演着至关重要的角色。然而&#xff0c;传统的视频监控解决方案往往依赖于特定的客户端软件&#xff0c;这…

Vue3 + Spring WebMVC 验证码案例中的跨域问题与解决方法

最近在基于vue3 SpringWebMVC前后端分离的开发环境中实现一个验证码的案例&#xff0c;在开发过程中遇到了一些复杂的跨域问题&#xff0c;现已解决&#xff0c;故将解决方法分享&#xff0c;希望能帮到有需要的人。 出现的问题&#xff1a; 对于验证码的实现&#xff0c;我选…

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…

蛋白质研究常用数据库系列1

一系列常用的蛋白质研究数据库 一 蛋白综合数据库 1.1 Uniprot UniProt&#xff08;Universal Protein Resource&#xff0c;https://www.uniprot.org/&#xff09;是一个免费开放的综合性蛋白质数据库。该数据库蛋白信息来源于EMBL、GenBank、DDBJ等公共数据库&#xff08;非…

minio作为K8S后端存储

docker部署minio mkdir -p /minio/datadocker run -d \-p 9000:9000 \-p 9001:9001 \--name minio \-v /minio/data:/data \-e "MINIO_ROOT_USERjbk" \-e "MINIO_ROOT_PASSWORDjbjbjb123" \quay.io/minio/minio server /data --console-address ":90…

深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全

在当今医疗科技飞速发展的时代&#xff0c;医疗设备的电磁兼容性&#xff08;EMC&#xff09;已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性&#xff0c;更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…

安装TortoiseGit时,显示需要安装驱动?!

安装TortoiseGit时&#xff0c;显示需要安装驱动&#xff1f; 原因分析&#xff1a; 出现上述情况&#xff0c;单纯是被捆绑了&#xff0c;TortoiseGit是不需要任何插件 解决方案&#xff1a; 在电脑上选择应用Windows安装程序

高中数学基础-平面向量

文章目录 1、平面向量2、复数 高中数学-平面向量、复数 1、平面向量 向量&#xff1a;具有大小和方向的量称为向量&#xff1b;物理学中向量也称矢量&#xff0c;只有大小没有方向的量称为标量&#xff1b;向量的大小称为模&#xff0c;大小为1的是单位向量&#xff0c;长度为0…

springboot博客系统详解与实现(后端实现)

目录 前言&#xff1a; 项目介绍 一、项目的准备工作 1.1 数据准备 1.2 项目创建 1.3 前端页面的准备 1.4 配置配置文件 二、公共模块 2.1 根据需求完成公共层代码的编写 2.1.1 定义业务状态枚举 2.1.2 统一返回结果 2.1.3 定义项目异常 2.1.4 统一异常处理 三、业…

Visual Studio Code 远程开发方法

方法1 共享屏幕远程控制&#xff0c;如 to desk, 向日葵 &#xff0c;像素太差&#xff0c;放弃 方法2 内网穿透 ssh 第二个方法又很麻烦&#xff0c;尤其是对于 windows 电脑&#xff0c;要使用 ssh 还需要额外安装杂七杂八的东西&#xff1b;并且内网穿透服务提供商提供的…