机器学习笔记之流形模型——标准流模型基本介绍

news2024/11/23 23:44:22

机器学习笔记之流形模型——标准流模型基本介绍

引言

本节将介绍概率生成模型——标准流模型( Normalizing Flow \text{Normalizing Flow} Normalizing Flow)。

回顾:隐变量模型的缺陷

关于隐变量模型( Latent Variable Model,LVM \text{Latent Variable Model,LVM} Latent Variable Model,LVM),如果表示隐变量的随机变量集合 Z \mathcal Z Z足够复杂的话,很容易出现积分难问题:
此时隐变量 Z \mathcal Z Z的维度(随机变量个数)极高 ( M ) (\mathcal M) (M),对 Z \mathcal Z Z求解积分的代价是极大的 ( Intractable ) (\text{Intractable}) (Intractable).
P ( X ) ⏟ Intractable = ∫ Z P ( Z , X ) d Z = ∫ Z P ( Z ) ⋅ P ( X ∣ Z ) d Z = ∫ Z 1 ⋯ ∫ Z M P ( Z 1 , ⋯   , Z M ) ⋅ P ( X ∣ Z 1 , ⋯   , Z M ) d Z 1 , ⋯   , Z M \begin{aligned} \underbrace{\mathcal P(\mathcal X) }_{\text{Intractable}} & = \int_{\mathcal Z} \mathcal P(\mathcal Z,\mathcal X) d\mathcal Z \\ & = \int_{\mathcal Z} \mathcal P(\mathcal Z) \cdot \mathcal P(\mathcal X \mid \mathcal Z) d\mathcal Z \\ & = \int_{\mathcal Z_1} \cdots \int_{\mathcal Z_{\mathcal M}} \mathcal P(\mathcal Z_1,\cdots,\mathcal Z_{\mathcal M}) \cdot \mathcal P(\mathcal X \mid \mathcal Z_1,\cdots,\mathcal Z_{\mathcal M}) d\mathcal Z_1,\cdots,\mathcal Z_{\mathcal M} \end{aligned} Intractable P(X)=ZP(Z,X)dZ=ZP(Z)P(XZ)dZ=Z1ZMP(Z1,,ZM)P(XZ1,,ZM)dZ1,,ZM
从而,关于隐变量 Z \mathcal Z Z后验概率 P ( Z ∣ X ) \mathcal P(\mathcal Z \mid \mathcal X) P(ZX)也同样是极难求解的:
P ( Z ∣ X ) ⏟ Intractable = P ( Z , X ) P ( X ) = P ( Z ) ⋅ P ( X ∣ Z ) P ( X ) ⏟ Intractable \begin{aligned} \underbrace{\mathcal P(\mathcal Z \mid \mathcal X)}_{\text{Intractable}} & = \frac{\mathcal P(\mathcal Z,\mathcal X)}{\mathcal P(\mathcal X)} \\ & = \frac{\mathcal P(\mathcal Z) \cdot \mathcal P(\mathcal X \mid \mathcal Z)}{\underbrace{\mathcal P(\mathcal X)}_{\text{Intractable}}} \end{aligned} Intractable P(ZX)=P(X)P(Z,X)=Intractable P(X)P(Z)P(XZ)

针对这种问题,由于无法得到精确解/精确解计算代价极高,因而通常采用近似推断( Approximate Inference \text{Approximate Inference} Approximate Inference)的方式对 P ( Z ∣ X ) \mathcal P(\mathcal Z \mid \mathcal X) P(ZX)近似求解。

例如变分自编码器( Variational Auto-Encoder,VAE \text{Variational Auto-Encoder,VAE} Variational Auto-Encoder,VAE),它的底层逻辑是使用重参数化技巧人为设定分布 Q ( Z ∣ X ) \mathcal Q(\mathcal Z \mid \mathcal X) Q(ZX)视作关于参数 ϕ \phi ϕ的函数 Q ( Z ∣ X , ϕ ) \mathcal Q(\mathcal Z \mid \mathcal X,\phi) Q(ZX,ϕ),并通过神经网络学习参数 ϕ \phi ϕ并使其近似 P ( Z ∣ X ) \mathcal P(\mathcal Z \mid \mathcal X) P(ZX)。关于变分自编码器的模型结构表示如下:
在这里插入图片描述
关于编码器( Encoder \text{Encoder} Encoder)函数 Q ( Z ∣ X ; ϕ ) \mathcal Q(\mathcal Z \mid \mathcal X;\phi) Q(ZX;ϕ)解码器( Decoder \text{Decoder} Decoder)函数 P ( X ∣ Z ; θ ) \mathcal P(\mathcal X \mid \mathcal Z;\theta) P(XZ;θ),变分自编码器的目标函数表示如下:
一个有趣的现象:其中 − KL [ Q ( Z ∣ X ; ϕ ) ∣ ∣ P ( Z ; θ ( t ) ) ] - \text{KL} [\mathcal Q(\mathcal Z \mid \mathcal X;\phi) || \mathcal P(\mathcal Z ;\theta^{(t)})] KL[Q(ZX;ϕ)∣∣P(Z;θ(t))]只是一个关于 ϕ \phi ϕ的惩罚项(约束),并且这个约束直接作用于 E Q ( Z ∣ X ; ϕ ) [ log ⁡ P ( X ∣ Z ; θ ) ] \mathbb E_{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)} \left[\log \mathcal P(\mathcal X \mid \mathcal Z;\theta)\right] EQ(ZX;ϕ)[logP(XZ;θ)].因此真正迭代的只有参数 θ ( θ ( t ) ⇒ θ ( t + 1 ) ) \theta(\theta^{(t)}\Rightarrow \theta^{(t+1)}) θ(θ(t)θ(t+1)),参数 ϕ \phi ϕ仅是迭代过程中伴随着 θ \theta θ的更新而更新。
{ L ( ϕ , θ , θ ( t ) ) = E Q ( Z ∣ X ; ϕ ) [ log ⁡ P ( X ∣ Z ; θ ) ] − KL [ Q ( Z ∣ X ; ϕ ) ∣ ∣ P ( Z ; θ ( t ) ) ] ( θ ^ ( t + 1 ) , ϕ ^ ( t + 1 ) ) = arg ⁡ max ⁡ θ , ϕ L ( ϕ , θ , θ ( t ) ) \begin{cases} \mathcal L(\phi,\theta,\theta^{(t)}) = \mathbb E_{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)} \left[\log \mathcal P(\mathcal X \mid \mathcal Z;\theta)\right] - \text{KL} [\mathcal Q(\mathcal Z \mid \mathcal X;\phi) || \mathcal P(\mathcal Z;\theta^{(t)})] \\ \quad \\ (\hat {\theta}^{(t+1)},\hat {\phi}^{(t+1)}) = \mathop{\arg\max}\limits_{\theta,\phi} \mathcal L(\phi,\theta,\theta^{(t)}) \end{cases} L(ϕ,θ,θ(t))=EQ(ZX;ϕ)[logP(XZ;θ)]KL[Q(ZX;ϕ)∣∣P(Z;θ(t))](θ^(t+1),ϕ^(t+1))=θ,ϕargmaxL(ϕ,θ,θ(t))
关于目标函数 L ( ϕ , θ , θ ( t ) ) \mathcal L(\phi,\theta,\theta^{(t)}) L(ϕ,θ,θ(t))的底层逻辑是最大化 ELBO \text{ELBO} ELBO
( θ ^ ( t + 1 ) , ϕ ^ ( t + 1 ) ) = arg ⁡ max ⁡ θ , ϕ { E Q ( Z ∣ X ; ϕ ) [ log ⁡ P ( X , Z ; θ ) Q ( Z ∣ X ; ϕ ) ] } (\hat {\theta}^{(t+1)},\hat {\phi}^{(t+1)}) = \mathop{\arg\max}\limits_{\theta,\phi} \left\{\mathbb E_{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)} \left[\log \frac{\mathcal P(\mathcal X,\mathcal Z;\theta)}{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)}\right]\right\} (θ^(t+1),ϕ^(t+1))=θ,ϕargmax{EQ(ZX;ϕ)[logQ(ZX;ϕ)P(X,Z;θ)]}
也就是说,它仅仅是最大化了极大似然估计 log ⁡ P ( X ; θ ) \log \mathcal P(\mathcal X;\theta) logP(X;θ)下界。实际上,它并没有直接对对数似然函数求解最优化问题。

这不可避免地存在误差,毕竟最优化对数似然函数和最优化它的下界 是两个概念。这一切的核心问题均在于 P ( X ) \mathcal P(\mathcal X) P(X)无法得到精确解。

如果存在一种模型,它在学习任务过程中, P ( X ) \mathcal P(\mathcal X) P(X)可求解的( tractable \text{tractable} tractable),自然不会出现上述一系列的近似操作了。

标准流( Normalizing Flow \text{Normalizing Flow} Normalizing Flow)思想

关于样本 X \mathcal X X的概率分布 P ( X ) \mathcal P(\mathcal X) P(X),它可能是复杂的。但流模型( Flow-based Model \text{Flow-based Model} Flow-based Model)的思想是:分布 P ( X ) \mathcal P(\mathcal X) P(X)的复杂并不是一蹴而就的,而是通过若干次的变化而产生出的复杂结果

关于流模型的概率图结构可表示为如下形式:
流模型-概率图结构
从模型结构中可以观察到,既然分布 P ( X ) \mathcal P(\mathcal X) P(X)比较复杂,那么可以构建隐变量 Z \mathcal Z Z X \mathcal X X之间的函数关系 X = f ( Z ) \mathcal X = f(\mathcal Z) X=f(Z),从而通过换元的方式描述 P ( Z ) \mathcal P(\mathcal Z) P(Z) P ( X ) \mathcal P(\mathcal X) P(X)的函数关系。

如果隐变量 Z \mathcal Z Z的结构同样复杂,可以继续针对该隐变量创造新的隐变量并构建函数关系。以此类推,最终可以通过一组服从简单分布的随机变量 Z i n i t \mathcal Z_{init} Zinit通过若干次的函数的嵌套表示,得到关于 X \mathcal X X的关联关系,从而得到 P i n i t ( Z i n i t ) ⇒ P ( X ) \mathcal P_{init}(\mathcal Z_{init}) \Rightarrow \mathcal P(\mathcal X) Pinit(Zinit)P(X)的函数关系。

分布变换的推导过程

以上图中隐变量 Z K \mathcal Z_{\mathcal K} ZK观测变量 X \mathcal X X之间关联关系示例:
在这里插入图片描述

  • 创建假设 f K f_{\mathcal K} fK是一个 连续、可逆 函数,满足 X = f K ( Z K ) \mathcal X = f_{\mathcal K}(\mathcal Z_{\mathcal K}) X=fK(ZK)。其中 Z K , X \mathcal Z_{\mathcal K},\mathcal X ZK,X均表示随机变量集合,并服从对应的概率分布:
    • 其中 P X ( X ) \mathcal P_{\mathcal X}(\mathcal X) PX(X)表示关于 X \mathcal X X的概率分布,并且变量是 X . Z K \mathcal X.\mathcal Z_{\mathcal K} X.ZK对应分布同理。
    • 反过来,由于 f K f_{\mathcal K} fK函数可逆,因而有: Z K = f K − 1 ( X ) \mathcal Z_{\mathcal K} = f_{\mathcal K}^{-1}(\mathcal X) ZK=fK1(X).
      Z K ∼ P Z K ( Z K ) , X ∼ P X ( X ) ; Z K , X ∈ R p \mathcal Z_{\mathcal K} \sim \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}),\mathcal X \sim \mathcal P_{\mathcal X}(\mathcal X);\quad \mathcal Z_{\mathcal K},\mathcal X \in \mathbb R^p ZKPZK(ZK),XPX(X);ZK,XRp
  • 不可否认的是,无论是 P Z K ( Z K ) \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PZK(ZK)还是 P X ( X ) \mathcal P_{\mathcal X}(\mathcal X) PX(X),它们都是概率分布。根据概率密度积分的定义,必然有:
    ∫ Z K P Z K ( Z K ) d Z K = ∫ X P X ( X ) d X = 1 \int_{\mathcal Z_{\mathcal K}} \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) d\mathcal Z_{\mathcal K} = \int_{\mathcal X} \mathcal P_{\mathcal X}(\mathcal X) d\mathcal X =1 ZKPZK(ZK)dZK=XPX(X)dX=1
    从而有:
    变分推断——重参数化技巧一节中也使用这种描述进行换元,在不定积分中, P Z K ( Z K ) d Z K \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) d\mathcal Z_{\mathcal K} PZK(ZK)dZK P X ( X ) d X \mathcal P_{\mathcal X}(\mathcal X)d \mathcal X PX(X)dX必然相等;但是在定积分中, Z K , X \mathcal Z_{\mathcal K},\mathcal X ZK,X位于不同的特征空间,对应的积分值(有正有负)存在差异。因此需要加上‘模’符号。
    ∣ P Z K ( Z K ) d Z K ∣ = ∣ P X ( X ) d X ∣ |\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) d\mathcal Z_{\mathcal K}| = |P_{\mathcal X}(\mathcal X) d\mathcal X| PZK(ZK)dZK=PX(X)dX
    但由于 P Z K ( Z K ) , P X ( X ) \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}),\mathcal P_{\mathcal X}(\mathcal X) PZK(ZK),PX(X)它们是概率密度函数,它们的实际结果表示概率值(恒正)。因此 ∣ P X ( X ) ∣ = P X ( X ) |\mathcal P_{\mathcal X}(\mathcal X)| = \mathcal P_{\mathcal X}(\mathcal X) PX(X)=PX(X) P Z K ( Z K ) \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PZK(ZK)同理。经过移项,可将概率分布之间的关系表示为如下形式:
    P X ( X ) = ∣ d Z K d X ∣ ⋅ P Z K ( Z K ) \mathcal P_{\mathcal X}(\mathcal X) = \left|\frac{d\mathcal Z_{\mathcal K}}{d\mathcal X}\right| \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PX(X)= dXdZK PZK(ZK)
    Z K = f K − 1 ( X ) \mathcal Z_{\mathcal K} = f_{\mathcal K}^{-1}(\mathcal X) ZK=fK1(X)代入,最终可得到如下形式:
    P X ( X ) = ∣ ∂ f K − 1 ( X ) ∂ X ∣ ⋅ P Z K ( Z K ) \mathcal P_{\mathcal X}(\mathcal X) = \left|\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right| \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PX(X)= XfK1(X) PZK(ZK)
  • 观察系数项 ∣ ∂ f K − 1 ( X ) ∂ X ∣ \left|\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right| XfK1(X) ,它是一个标量、常数,但 ∂ f K − 1 ( X ) ∂ X \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial\mathcal X} XfK1(X)自身是一个矩阵
    该矩阵被称作雅可比矩阵 Jacobian \text{Jacobian} Jacobian
    ∂ f K − 1 ( X ) ∂ X = [ ∂ f K − 1 ( X 1 ) ∂ X 1 ∂ f K − 1 ( X 1 ) ∂ X 2 ⋯ ∂ f K − 1 ( X 1 ) ∂ X p ∂ f K − 1 ( X 2 ) ∂ X 1 ∂ f K − 1 ( X 2 ) ∂ X 2 ⋯ ∂ f K − 1 ( X 2 ) ∂ X p ⋮ ⋮ ⋱ ⋮ ∂ f K − 1 ( X p ) ∂ X 1 ∂ f K − 1 ( X p ) ∂ X 2 ⋯ ∂ f K − 1 ( X p ) ∂ X p ] p × p \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} = \begin{bmatrix} \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_1)}{\partial \mathcal X_1} & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_1)}{\partial \mathcal X_2}& \cdots & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_1)}{\partial \mathcal X_p} \\ \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_2)}{\partial \mathcal X_1} & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_2)}{\partial \mathcal X_2} & \cdots & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_2)}{\partial \mathcal X_p}\\ \vdots & \vdots & \ddots & \vdots\\ \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_p)}{\partial \mathcal X_1} & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_p)}{\partial \mathcal X_2} & \cdots & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_p)}{\partial \mathcal X_p} \end{bmatrix}_{p \times p} XfK1(X)= X1fK1(X1)X1fK1(X2)X1fK1(Xp)X2fK1(X1)X2fK1(X2)X2fK1(Xp)XpfK1(X1)XpfK1(X2)XpfK1(Xp) p×p
    那么 ∣ ∂ f K − 1 ( X ) ∂ X ∣ \left|\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right| XfK1(X) 实际上是与雅克比矩阵对应的雅克比行列式( Jacobian Determinant \text{Jacobian Determinant} Jacobian Determinant)的绝对值。使用 det [ ∂ f K − 1 ( X ) ∂ X ] \text{det}\left[\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right] det[XfK1(X)]进行表示:
    P X ( X ) = ∣ det [ ∂ f K − 1 ( X ) ∂ X ] ∣ ⋅ P Z K ( Z K ) \mathcal P_{\mathcal X}(\mathcal X) = \left|\text{det}\left[\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right]\right| \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PX(X)= det[XfK1(X)] PZK(ZK)
  • 继续变换,观察 ∂ f K − 1 ( X ) ∂ X \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} XfK1(X),可以继续向下变换:
    { ∂ f K − 1 ( X ) ∂ X ⋅ ∂ f K ( Z K ) ∂ Z K = 1 ⇒ ∂ f K − 1 ( X ) ∂ X = [ ∂ f K ( Z K ) ∂ Z K ] − 1 ⇒ ∣ det [ ∂ f K − 1 ( X ) ∂ X ] ∣ = ∣ det [ ∂ f K ( Z K ) ∂ Z K ] ∣ − 1 \begin{cases} \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} \cdot \frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}} = 1 \Rightarrow \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} = \left[\frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}}\right]^{-1} \\ \Rightarrow \left|\text{det}\left[\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right]\right| = \left|\text{det}\left[\frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}}\right]\right|^{-1} \end{cases} XfK1(X)ZKfK(ZK)=1XfK1(X)=[ZKfK(ZK)]1 det[XfK1(X)] = det[ZKfK(ZK)] 1
    最终,分布 P X ( X ) \mathcal P_{\mathcal X}(\mathcal X) PX(X)与分布 P Z K ( Z K ) \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PZK(ZK)之间的关系表示为:
    P X ( X ) = ∣ det [ ∂ f K ( Z K ) ∂ Z K ] ∣ − 1 ⋅ P Z K ( Z K ) \mathcal P_{\mathcal X}(\mathcal X) = \left|\text{det}\left[\frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}}\right]\right|^{-1} \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PX(X)= det[ZKfK(ZK)] 1PZK(ZK)

至此,从随机变量 Z K \mathcal Z_{\mathcal K} ZK随机变量 X \mathcal X X之间的函数关系,转化为概率分布 P X ( X ) \mathcal P_{\mathcal X}(\mathcal X) PX(X) P Z K ( Z K ) \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) PZK(ZK)之间的函数关系已表示出来。而流模型中的每一个过程均是基于上述关系,一层一层计算过来。

不同于以往对 P ( X ) \mathcal P(\mathcal X) P(X)的求解过程,它能够将 P ( X ) \mathcal P(\mathcal X) P(X)描述出来,直到使用隐变量的层数选择完成,其对应的 P ( X ) \mathcal P(\mathcal X) P(X)计算精度达到条件即可。关于流模型的学习方式依然是极大似然估计( Maximum Likelihood Estimation,MLE \text{Maximum Likelihood Estimation,MLE} Maximum Likelihood Estimation,MLE):
log ⁡ P X ( X ) = log ⁡ { ∏ k = 1 K ∣ det [ ∂ f k ( Z k ) ∂ Z k ] ∣ − 1 ⋅ P i n i t ( Z i n i t ) } = log ⁡ P i n i t ( Z i n i t ) + ∑ k = 1 K log ⁡ { ∣ det [ ∂ f k ( Z k ) ∂ Z k ] ∣ − 1 } \begin{aligned} \log \mathcal P_{\mathcal X}(\mathcal X) & = \log \left\{\prod_{k=1}^{\mathcal K} \left|\text{det} \left[\frac{\partial f_{k}(\mathcal Z_k)}{\partial \mathcal Z_k}\right]\right|^{-1} \cdot \mathcal P_{init}(\mathcal Z_{init})\right\} \\ & = \log \mathcal P_{init}(\mathcal Z_{init}) + \sum_{k=1}^{\mathcal K} \log \left\{\left|\text{det} \left[\frac{\partial f_{k}(\mathcal Z_k)}{\partial \mathcal Z_k}\right]\right|^{-1}\right\} \end{aligned} logPX(X)=log{k=1K det[Zkfk(Zk)] 1Pinit(Zinit)}=logPinit(Zinit)+k=1Klog{ det[Zkfk(Zk)] 1}

相关参考:
雅可比矩阵——百度百科
【机器学习白板推导系列(三十三) ~ 流模型(Flow Based Model)】

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

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

相关文章

第九节 常用API(String/ArrayList)

常用API(String/ArrayList) java写好的程序,我们可以直接调用。 String类定义的变量可以用于存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接使用。 ArrayList简单介绍 1.ArrayList代表的是集合类,集合是一种容…

《C++ Primer Plus》(第6版)第6章编程练习

《C Primer Plus》(第6版)第6章编程练习《C Primer Plus》(第6版)第6章编程练习1. 大小写转换2. 平均值3. 菜单4. 成员5. 收入所得税6. 捐款7. 统计单词8. 统计文件字符数9. 重写编程练习6《C Primer Plus》(第6版&…

taobao.top.secret.appkey.bill.detail( 服务商解密账单查询 )

¥免费不需用户授权 服务商解密账单查询,分页返回所有店铺的账单,每个店铺每天仅包含两条数据,当天产生的号租费 和 当天产生的通话费,仅对90天内的账单提供SLA保障。查询账单详情请使用taobao.top.secret.bill.detail接口。 公共参…

计算机的发展

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…

云打包苹果证书生成、上架和应用截屏攻略

在使用apicloud或hbuilderx这些跨端的开发工具开发移动应用的时候,假如是打包ios应用,是需要生成苹果证书、证书profile文件,和对应用上架的。首先要普及一个概念,苹果的应用是无法像安卓那样挂在自己的服务器上下载直接安装就可以…

C++ STL:迭代器 Iterator

文章目录1、迭代器的类型2、traitsiterator_traitstype_traits泛化的指针,容器与算法的桥梁。提供一种方法,按照一定顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。既能对容器进行遍历,又可以对外隐藏容器的底层实…

谷歌邮箱账号不会注册?注册失败?这份完美注册教程请收好

谷歌邮箱相信大家都不陌生吧,无论是用于发送和接收邮件,还是用于在国外网站注册,很多人都离不开谷歌邮箱。甚至,一些网站直接提供谷歌邮箱登录选项。这就是为什么很多跨境人想要注册谷歌邮箱的原因。 但是,大部分网友都…

Java学习之路002——面向对象编程

【说明】部分内容来源于网络,如有冲突,请联系作者删除。 一、面向对象编程(OOP) 2.1 对象和类的关系 2.2 面向对象的特征 2.2.1 封装 2.2.2 继承 2.2.3 多态 3、抽象 使用abstract关键字修饰的类或者方法 定义抽象类(使用abstract) // 1、定义抽象方法…

计数排序.

1.动图演示: 2.代码示例: package test1;import java.util.Arrays;public class Test3 {public static void main(String[] args) {int[] nums new int[]{1, 2, 1, 4, 52, 1, 4};int[] arr count_sort(nums, getMax(nums));for (int i : arr) {System…

spring boot 配合element ui vue实现表格的批量删除(前后端详细教学,简单易懂,有手就行)

目录 一.前言: 二. 前端代码: 2.1.element ui组件代码 2.2删除按钮 2.3.data 2.4.methods 三.后端代码: 一.前言: 研究了其他人的博客,找到了一篇有含金量的,进行了部分改写实现前后端分离&#xff0…

【Python实战】爬虫教程千千万,一到实战全完蛋?今天手把手教你一键采集某网站图书信息数据啦~排名第一的竟是...(爬虫+数据可视化)

前言 ​一本本书,是一扇扇窗,为追求知识的人打开认知世界的窗口 一本本书,是一双双翅膀,让追求理想的人张开翅膀翱翔 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末…

机器学习的特征归一化Normalization

为什么需要做归一化? 为了消除数据特征之间的量纲影响,就需要对特征进行归一化处理,使得不同指标之间具有可比性。对特征归一化可以将所有特征都统一到一个大致相同的数值区间内。 为了后⾯数据处理的⽅便,归⼀化可以避免⼀些不…

Pycharm和跳板机 连接内网服务器

Pycharm和跳板机 连接内网服务器 建立配置文件 本地配置 .ssh 文件夹下配置 config 文件 Host jumpHostName xxxPort 22User xxxServerAliveInterval 30IdentityFile C:\Users\15284\.ssh\id_rsa # 通过密钥连接Host server # 同样,任意名字,随…

vxe自定义表头设置+前端本地数据存储

业务要求 支持拖动排序,按现有内容排序支持显示/隐藏,默认全部显示列表增加顶部格线,用户可以自己调整列宽设置内容仅对该账号有效,前端存储 最终实现的效果图 哪些改动 静态表格改动态表格 table > grid vxe-grid 高级表格…

一文深度解读音视频行业技术发展历程

从1948年的香农定律,到音视频的今天。IMMENSE、36氪|作者 北京时间2月28日凌晨,FIFA年度颁奖典礼在巴黎举行。梅西荣膺年度最佳球员,斯卡洛尼当选年度最佳男足主帅,马丁内斯荣获年度最佳男足门将!阿根廷因…

自动售卖机的类型和工作流程分析

线上经济的崛起提高了人们的生活品质,促进了我国市场经济的发展。随着互联网的快速发展,线上经济资源已经饱和,线上和线下资源整合已经成为市场经济发展的方向,而自动售卖机正是线上和线下经济发展的连接纽带。 自动售卖机作为无人…

3.查找算法:顺序查找和二分查找

查找查找,是指在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。列表查找(线性表查找):从列表中查找指定元素输入:列表,待查找元素输出:元素下标(…

多线程 随便起的

进程:进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构如果想让-一个进程访问另一个进程的资源,需要使用进程间通信,比如管道&#xff…

LAMP项目部署实战1

一、说明: LAMP:Linux Apache MySQL PHP Apache: Apache是世界使用排名第一的Web服务器软件。主要用于接收用户的请求,处理业务逻辑,返回结果给客户端(浏览器)。 PHP:一种专门…

SQL 层功能改进 - lookupJoin 的优化

一、传统 join 算法lookupJoin 是 join 查询的一种,传统 join 算法为:1. 遍历 A 表,读取一条数据 r2. 遍历 B 表,对于每条数据,与 r 进行 join 操作3. 重复 1、2 操作,直到 A 表遍历完所有数据二、lookupJo…