动态模型系列笔记(一)——隐马尔可夫模型(HMM)

2023-11-20

背景介绍

隐马尔可夫模型 (HMM) 是一种概率图模型

我们知道,机器学习模型可以从频率派贝叶斯派两个方向考虑,

  • 频率派发展成形成了统计机器学习,核心是优化问题;
    1. model: 例如,超平面 f ( ω ) = ω T x + b f(\omega)=\omega^Tx+b f(ω)=ωTx+b 或者 回归(regression)等;
    2. strategy: 衡量模型好坏/评估准则 loss function;
    3. algorithm(求解):GD, SGD, 牛顿法, 拟牛顿法等。
  • 贝叶斯派发展成了概率图模型,核心是推断问题(inference)或者求后验概率 p ( z ∣ x ) p(z|x) p(zx), 常常需要用MCMC方法进行积分。(注:通常 x x x表示数据)

在这里插入图片描述

如图,概率图模型最基本的模型可以分为

  • 有向图(贝叶斯网络 Bayesian Newwork)
  • 无向图(马尔可夫随机场 Markov Random Field)

在这些基本的模型上,如果样本之间存在关联,可以认为样本中附带了时序信息(不一定是时间,是一个表示先后的量即可),从而样本之间不独立全同分布的,这种模型就叫做动态模型,隐变量随着时间发生变化,于是观测变量也发生变化。

根据状态变量(隐变量)的特点,可以分为:

  1. 隐马尔可夫模型(HMM),状态变量(隐变量)是离散的;
  2. 卡尔曼滤波(Kalman Filter),状态变量是连续的,线性的;
  3. 粒子滤波(Particle Filter),状态变量是连续,非线性的.

动态模型从横向看是一个时间序列,纵向看是一个混合模型:
请添加图片描述

提纲

下面的内容将分为以下三个部分进行叙述:

  • 一个模型(隐马尔可夫模型)
  • 两个假设
    1. 齐次马尔科夫假设
    2. 观测独立假设
  • 三个问题
    1. Evaluation
    2. Learning
    3. Decoding

隐马尔可夫模型(HMM)

HMM 用概率图表示为:
HMM示意图

符号表示

符号 解释
λ = ( π , A , B ) \lambda=(\pi,A,B) λ=(π,A,B) 一个表示模型的参数
π \pi π 初始时刻的概率分布
A A A 状态转移矩阵
B B B 发射矩阵,观测概率矩阵

更进一步:

  • 观测变量:上图中灰色的圆圈表示观测变量,用符号 O : [ o 1 , o 2 , ⋯   , o t , ⋯   ] O: [o_1, o_2, \cdots , o_t, \cdots] O:[o1,o2,,ot,]表示,其值域为 V = { v 1 , v 2 , ⋯   , v M } V=\{v_1,v_2,\cdots,v_M\} V={v1,v2,,vM} ;
  • 状态变量 Hidden state:上图中白色圆圈表示状态变量 Hidden state,用符号 i : [ i 1 , i 2 , ⋯   , i t , ⋯   ] i: [i_1, i_2, \cdots , i_t, \cdots] i:[i1,i2,,it,] 表示,其值域为 Q = { q 1 , q 2 , ⋯   , q N } Q=\{q_1,q_2,\cdots,q_N\} Q={q1,q2,,qN}
  • 状态转移矩阵 A = [ a i j ] A=[a_{ij}] A=[aij],其中 a i j = p ( i t + 1 = q j ∣ i t = q i ) a_{ij}=p(i_{t+1}=q_j|i_t=q_i) aij=p(it+1=qjit=qi);
  • 发射矩阵/观测概率矩阵 B = [ b j ( k ) ] B=[b_j(k)] B=[bj(k)] ,其中 b j ( k ) = p ( o t = v k ∣ i t = q j ) b_j(k)=p(o_t=v_k|i_t=q_j) bj(k)=p(ot=vkit=qj).

两个假设

在 HMM 中,有两个基本假设:

  1. 齐次 Markov假设(当前状态仅与前一状态有关):
    p ( i t + 1 ∣ i t , i t − 1 , ⋯   , i 1 , o t , o t − 1 , ⋯   , o 1 ) = p ( i t + 1 ∣ i t ) (1) p(i_{t+1}|i_t,i_{t-1},\cdots,i_1,o_t,o_{t-1},\cdots,o_1)=p(i_{t+1}|i_t) \tag{1} p(it+1it,it1,,i1,ot,ot1,,o1)=p(it+1it)(1)

  2. 观测独立假设(当前的观测变量只与当前的状态变量有关):
    p ( o t ∣ i t , i t − 1 , ⋯   , i 1 , o t − 1 , ⋯   , o 1 ) = p ( o t ∣ i t ) (2) p(o_t|i_t,i_{t-1},\cdots,i_1,o_{t-1},\cdots,o_1)=p(o_t|i_t) \tag{2} p(otit,it1,,i1,ot1,,o1)=p(otit)(2)

三个问题:

  1. Evaluation:
    在所有参数 λ \lambda λ已知的条件下,观测序列的概率,即 p ( O ∣ λ ) p(O|\lambda) p(Oλ)
    通常采用前向后向算法(Forward-Backward Algorithm)解决。
  2. Learning:
    如何求 λ \lambda λ? 即如何求 λ = a r g m a x λ p ( O ∣ λ ) \lambda=\mathop{argmax}\limits_{\lambda}p(O|\lambda) λ=λargmaxp(Oλ)
    通常采用EM 算法(即Baum-Welch算法,Baum-Welch算法在EM前提出,后来发现它本质就是EM算法)。
  3. Decoding:
    找到一个系列 I I I使 p ( I ∣ O , λ ) p(I|O,\lambda) p(IO,λ)最大,即 I = a r g m a x I p ( I ∣ O , λ ) I=\mathop{argmax}\limits_{I}p(I|O,\lambda) I=Iargmaxp(IO,λ)最大;
    通常使用Vierbi 算法;
    同时这类问题还可以分成两个小问题
    1. 预测问题: p ( i t + 1 ∣ o 1 , o 2 , ⋯   , o t ) p(i_{t+1}|o_1,o_2,\cdots,o_t) p(it+1o1,o2,,ot),即求 t + 1 t+1 t+1时刻的隐状态;
    2. 滤波问题: p ( i t ∣ o 1 , o 2 , ⋯   , o t ) p(i_t|o_1,o_2,\cdots,o_t) p(ito1,o2,,ot),即求 t t t时刻的隐状态。

Evaluation

p ( O ∣ λ ) = ∑ I p ( I , O ∣ λ ) = ∑ I p ( O ∣ I , λ ) p ( I ∣ λ ) p(O|\lambda)=\sum\limits_{I}p(I,O|\lambda)=\sum\limits_{I}p(O|I,\lambda)p(I|\lambda) p(Oλ)=Ip(I,Oλ)=Ip(OI,λ)p(Iλ)

p ( I ∣ λ ) = p ( i 1 , i 2 , ⋯   , i t ∣ λ ) = p ( i t ∣ i 1 , i 2 , ⋯   , i t − 1 , λ ) p ( i 1 , i 2 , ⋯   , i t − 1 ∣ λ ) p(I|\lambda)=p(i_1,i_2,\cdots,i_t|\lambda)=p(i_t|i_1,i_2,\cdots,i_{t-1},\lambda)p(i_1,i_2,\cdots,i_{t-1}|\lambda) p(Iλ)=p(i1,i2,,itλ)=p(iti1,i2,,it1,λ)p(i1,i2,,it1λ)

根据齐次 Markov 假设:
p ( i t ∣ i 1 , i 2 , ⋯   , i t − 1 , λ ) = p ( i t ∣ i t − 1 ) = a i t − 1 i t p(i_t|i_1,i_2,\cdots,i_{t-1},\lambda)=p(i_t|i_{t-1})=a_{i_{t-1}i_t} p(iti1,i2,,it1,λ)=p(itit1)=ait1it
所以:
p ( I ∣ λ ) = π 1 ∏ t = 2 T a i t − 1 , i t p(I|\lambda)=\pi_1\prod\limits_{t=2}^Ta_{i_{t-1},i_t} p(Iλ)=π1t=2Tait1,it
又由于:
p ( O ∣ I , λ ) = ∏ t = 1 T b i t ( o t ) p(O|I,\lambda)=\prod\limits_{t=1}^Tb_{i_t}(o_t) p(OI,λ)=t=1Tbit(ot)
于是:
p ( O ∣ λ ) = ∑ I π i 1 ∏ t = 2 T a i t − 1 , i t ∏ t = 1 T b i t ( o t ) p(O|\lambda)=\sum\limits_{I}\pi_{i_1}\prod\limits_{t=2}^Ta_{i_{t-1},i_t}\prod\limits_{t=1}^Tb_{i_t}(o_t) p(Oλ)=Iπi1t=2Tait1,itt=1Tbit(ot)
我们看到,上面的式子中的求和符号是对所有的观测变量求和,于是复杂度为 O ( N T ) O(N^T) O(NT)

下面,记 α t ( i ) = p ( o 1 , o 2 , ⋯   , o t , i t = q i ∣ λ ) \alpha_t(i)=p(o_1,o_2,\cdots,o_t,i_t=q_i|\lambda) αt(i)=p(o1,o2,,ot,it=qiλ),所以, α T ( i ) = p ( O , i T = q i ∣ λ ) \alpha_T(i)=p(O,i_T=q_i|\lambda) αT(i)=p(O,iT=qiλ)。我们看到:
p ( O ∣ λ ) = ∑ i = 1 N p ( O , i T = q i ∣ λ ) = ∑ i = 1 N α T ( i ) p(O|\lambda)=\sum\limits_{i=1}^Np(O,i_T=q_i|\lambda)=\sum\limits_{i=1}^N\alpha_T(i) p(Oλ)=i=1Np(O,iT=qiλ)=i=1NαT(i)
α t + 1 ( j ) \alpha_{t+1}(j) αt+1(j)
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\alpha_{t+1}(j)…
利用观测独立假设:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\alpha_{t+1}(j)…
上面利用了齐次 Markov 假设得到了一个递推公式,这个算法叫做前向算法。

还有一种算法叫做后向算法,定义 β t ( i ) = p ( o t + 1 , o t + 1 , ⋯ , o T ∣ i t = i , λ ) \beta_t(i)=p(o_{t+1},o_{t+1},\cdots,o_T|i_t=i,\lambda) βt(i)=p(ot+1,ot+1,oTit=i,λ)
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲p(O|\lambda)&=p…
对于这个 β 1 ( i ) \beta_1(i) β1(i)
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\beta_t(i)&=p(o…
于是后向地得到了第一项。

Learning

为了学习得到参数的最优值,在 MLE 中:
λ M L E = a r g m a x λ p ( O ∣ λ ) \lambda_{MLE}=\mathop{argmax}_\lambda p(O|\lambda) λMLE=argmaxλp(Oλ)
我们采用 EM 算法(在这里也叫 Baum Welch 算法),用上标表示迭代:
θ t + 1 = a r g m a x θ ∫ z log ⁡ p ( X , Z ∣ θ ) p ( Z ∣ X , θ t ) d z \theta^{t+1}=\mathop{argmax}_{\theta}\int_z\log p(X,Z|\theta)p(Z|X,\theta^t)dz θt+1=argmaxθzlogp(X,Zθ)p(ZX,θt)dz
其中, X X X 是观测变量, Z Z Z 是隐变量序列。于是:
λ t + 1 = a r g m a x λ ∑ I log ⁡ p ( O , I ∣ λ ) p ( I ∣ O , λ t ) = a r g m a x λ ∑ I log ⁡ p ( O , I ∣ λ ) p ( O , I ∣ λ t ) \lambda^{t+1}=\mathop{argmax}_\lambda\sum\limits_I\log p(O,I|\lambda)p(I|O,\lambda^t)\\ =\mathop{argmax}_\lambda\sum\limits_I\log p(O,I|\lambda)p(O,I|\lambda^t) λt+1=argmaxλIlogp(O,Iλ)p(IO,λt)=argmaxλIlogp(O,Iλ)p(O,Iλt)
这里利用了 p ( O ∣ λ t ) p(O|\lambda^t) p(Oλt) λ \lambda λ 无关。将 Evaluation 中的式子代入:
∑ I log ⁡ p ( O , I ∣ λ ) p ( O , I ∣ λ t ) = ∑ I [ log ⁡ π i 1 + ∑ t = 2 T log ⁡ a i t − 1 , i t + ∑ t = 1 T log ⁡ b i t ( o t ) ] p ( O , I ∣ λ t ) \sum\limits_I\log p(O,I|\lambda)p(O,I|\lambda^t)=\sum\limits_I[\log \pi_{i_1}+\sum\limits_{t=2}^T\log a_{i_{t-1},i_t}+\sum\limits_{t=1}^T\log b_{i_t}(o_t)]p(O,I|\lambda^t) Ilogp(O,Iλ)p(O,Iλt)=I[logπi1+t=2Tlogait1,it+t=1Tlogbit(ot)]p(O,Iλt)
π t + 1 \pi^{t+1} πt+1
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\pi^{t+1}&=\mat…
上面的式子中,对 i 2 , i 2 , ⋯   , i T i_2,i_2,\cdots,i_T i2,i2,,iT 求和可以将这些参数消掉:
π t + 1 = a r g m a x π ∑ i 1 [ log ⁡ π i 1 ⋅ p ( O , i 1 ∣ λ t ) ] \pi^{t+1}=\mathop{argmax}_\pi\sum\limits_{i_1}[\log \pi_{i_1}\cdot p(O,i_1|\lambda^t)] πt+1=argmaxπi1[logπi1p(O,i1λt)]
上面的式子还有对 π \pi π 的约束 ∑ i π i = 1 \sum\limits_i\pi_i=1 iπi=1。定义 Lagrange 函数:
L ( π , η ) = ∑ i = 1 N log ⁡ π i ⋅ p ( O , i 1 = q i ∣ λ t ) + η ( ∑ i = 1 N π i − 1 ) L(\pi,\eta)=\sum\limits_{i=1}^N\log \pi_i\cdot p(O,i_1=q_i|\lambda^t)+\eta(\sum\limits_{i=1}^N\pi_i-1) L(π,η)=i=1Nlogπip(O,i1=qiλt)+η(i=1Nπi1)
于是:
∂ L ∂ π i = 1 π i p ( O , i 1 = q i ∣ λ t ) + η = 0 \frac{\partial L}{\partial\pi_i}=\frac{1}{\pi_i}p(O,i_1=q_i|\lambda^t)+\eta=0 πiL=πi1p(O,i1=qiλt)+η=0
对上式求和:
∑ i = 1 N p ( O , i 1 = q i ∣ λ t ) + π i η = 0 ⇒ η = − p ( O ∣ λ t ) \sum\limits_{i=1}^Np(O,i_1=q_i|\lambda^t)+\pi_i\eta=0\Rightarrow\eta=-p(O|\lambda^t) i=1Np(O,i1=qiλt)+πiη=0η=p(Oλt)
所以:
π i t + 1 = p ( O , i 1 = q i ∣ λ t ) p ( O ∣ λ t ) \pi_i^{t+1}=\frac{p(O,i_1=q_i|\lambda^t)}{p(O|\lambda^t)} πit+1=p(Oλt)p(O,i1=qiλt)

Decoding

Decoding 问题表述为:
I = a r g m a x I p ( I ∣ O , λ ) I=\mathop{argmax}\limits_{I}p(I|O,\lambda) I=Iargmaxp(IO,λ)
我们需要找到一个序列,其概率最大,这个序列就是在参数空间中的一个路径,可以采用动态规划的思想。

定义:
δ t ( j ) = max ⁡ i 1 , ⋯   , i t − 1 p ( o 1 , ⋯   , o t , i 1 , ⋯   , i t − 1 , i t = q i ) \delta_{t}(j)=\max\limits_{i_1,\cdots,i_{t-1}}p(o_1,\cdots,o_t,i_1,\cdots,i_{t-1},i_t=q_i) δt(j)=i1,,it1maxp(o1,,ot,i1,,it1,it=qi)
于是:
δ t + 1 ( j ) = max ⁡ 1 ≤ i ≤ N δ t ( i ) a i j b j ( o t + 1 ) \delta_{t+1}(j)=\max\limits_{1\le i\le N}\delta_t(i)a_{ij}b_j(o_{t+1}) δt+1(j)=1iNmaxδt(i)aijbj(ot+1)
这个式子就是从上一步到下一步的概率再求最大值。记这个路径为:
ψ t + 1 ( j ) = a r g m a x 1 ≤ i ≤ N δ t ( i ) a i j \psi_{t+1}(j)=\mathop{argmax}\limits_{1\le i\le N}\delta_t(i)a_{ij} ψt+1(j)=1iNargmaxδt(i)aij

小结

HMM 是一种动态模型,是由混合树形模型和时序结合起来的一种模型(类似 GMM + Time)。对于类似 HMM 的这种状态空间模型,普遍的除了学习任务(采用 EM )外,还有推断任务,推断任务包括:

  1. 译码 Decoding: p ( z 1 , z 2 , ⋯   , z t ∣ x 1 , x 2 , ⋯   , x t ) p(z_1,z_2,\cdots,z_t|x_1,x_2,\cdots,x_t) p(z1,z2,,ztx1,x2,,xt)

  2. 似然概率: p ( X ∣ θ ) p(X|\theta) p(Xθ)

  3. 滤波:   p ( z t ∣ x 1 , ⋯   , x t )  p(z_t|x_1,\cdots,x_t)  p(ztx1,,xt),Online
    p ( z t ∣ x 1 : t ) = p ( x 1 : t , z t ) p ( x 1 : t ) = C α t ( z t ) p(z_t|x_{1:t})=\frac{p(x_{1:t},z_t)}{p(x_{1:t})}=C\alpha_t(z_t) p(ztx1:t)=p(x1:t)p(x1:t,zt)=Cαt(zt)

  4. 平滑: p ( z t ∣ x 1 , ⋯   , x T ) p(z_t|x_1,\cdots,x_T) p(ztx1,,xT),Offline
    p ( z t ∣ x 1 : T ) = p ( x 1 : T , z t ) p ( x 1 : T ) = α t ( z t ) p ( x t + 1 : T ∣ x 1 : t , z t ) p ( x 1 : T ) p(z_t|x_{1:T})=\frac{p(x_{1:T},z_t)}{p(x_{1:T})}=\frac{\alpha_t(z_t)p(x_{t+1:T}|x_{1:t},z_t)}{p(x_{1:T})} p(ztx1:T)=p(x1:T)p(x1:T,zt)=p(x1:T)αt(zt)p(xt+1:Tx1:t,zt)
    根据概率图的条件独立性,有:
    p ( z t ∣ x 1 : T ) = α t ( z t ) p ( x t + 1 : T ∣ z t ) p ( x 1 : T ) = C α t ( z t ) β t ( z t ) p(z_t|x_{1:T})=\frac{\alpha_t(z_t)p(x_{t+1:T}|z_t)}{p(x_{1:T})}=C\alpha_t(z_t)\beta_t(z_t) p(ztx1:T)=p(x1:T)αt(zt)p(xt+1:Tzt)=Cαt(zt)βt(zt)
    这个算法叫做前向后向算法。

  5. 预测: p ( z t + 1 , z t + 2 ∣ x 1 , ⋯   , x t ) , p ( x t + 1 , x t + 2 ∣ x 1 , ⋯   , x t ) p(z_{t+1},z_{t+2}|x_1,\cdots,x_t),p(x_{t+1},x_{t+2}|x_1,\cdots,x_t) p(zt+1,zt+2x1,,xt),p(xt+1,xt+2x1,,xt)
    p ( z t + 1 ∣ x 1 : t ) = ∑ z t p ( z t + 1 , z t ∣ x 1 : t ) = ∑ z t p ( z t + 1 ∣ z t ) p ( z t ∣ x 1 : t ) p(z_{t+1}|x_{1:t})=\sum_{z_t}p(z_{t+1},z_t|x_{1:t})=\sum\limits_{z_t}p(z_{t+1}|z_t)p(z_t|x_{1:t}) p(zt+1x1:t)=ztp(zt+1,ztx1:t)=ztp(zt+1zt)p(ztx1:t)

    p ( x t + 1 ∣ x 1 : t ) = ∑ z t + 1 p ( x t + 1 , z t + 1 ∣ x 1 : t ) = ∑ z t + 1 p ( x t + 1 ∣ z t + 1 ) p ( z t + 1 ∣ x 1 : t ) p(x_{t+1}|x_{1:t})=\sum\limits_{z_{t+1}}p(x_{t+1},z_{t+1}|x_{1:t})=\sum\limits_{z_{t+1}}p(x_{t+1}|z_{t+1})p(z_{t+1}|x_{1:t}) p(xt+1x1:t)=zt+1p(xt+1,zt+1x1:t)=zt+1p(xt+1zt+1)p(zt+1x1:t)

附录

A. Markov的齐次性与阶数

  • Markov的齐次性: P ( X t n = x n ∣ X t n − 1 = x n − 1 P(X_{t_n}=x_n|X_{t_{n-1}}=x_{n-1} P(Xtn=xnXtn1=xn1的值与n无关,即转移概率与哪一次转移无关,仅与转移前后的状态有关;
  • n 阶马尔可夫:当前状态仅与前n个状态有关,一般我们研究的都是一阶马尔可夫(只与前一个状态有关),比如本模型的假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态模型系列笔记(一)——隐马尔可夫模型(HMM) 的相关文章

随机推荐

  • 隐藏通知内容什么意思_原来华为手机隐藏5个技巧,难怪别人都说华为好用,涨知识了...

    阅读本文前 请您先点击上面
  • Kinect开发学习笔记之(追加)深度距离误差分析

    由于最近要研究kinect采集到的深度信息的一些统计特征 所以必须先对kinect深度信息做进一步的了解 这些了解包括kinect的深度值精度 深度值的具体代表的距离是指哪个距离以及kinect深度和颜色扫描范围等 经过查找资料可以解决这些
  • 开启电脑ssl协议的方法

    转自 微点阅读 https www weidianyuedu com 电脑ssl协议怎么开启 开启ssl协议的方法是什么 经近期实际操作了解到开启ssl协议一共需要6个步骤 很快即可完成 以下是开启电脑ssl协议的方法介绍 1 首先打开浏览
  • html src 参数,HTTP参数解析

    本文概述 在本节中 我们将讨论各种HTTP参数及其语法 例如 日期和时间格式 字符集等 这些参数用于在编写客户端或服务器的HTTP程序时构造请求和响应消息 HTTP的各种参数如下 HTTP版本 为了指示协议的版本 HTTP使用 编号方案 协
  • 办公网络上网行为管理规划

    办公网络上网行为管理规划是确保办公网络资源的合理利用和保障网络安全的重要措施 下面是办公网络上网行为管理规划的一般性步骤和原则 确立政策和准则 制定明确的上网行为管理政策和准则 明确员工在办公网络上的合规要求和行为规范 包括规定员工上网内容
  • 项目设计:基于YOLO目标检测算法的安全帽/口罩/汽车/行人/交通标志...检测

    本文将详细介绍YOLO目标检测算法 该算法支持各种目标检测 包括 安全帽 汽车 造价 交通标志 等 其他毕业设计题目推荐参考 毕业设计 电子 通信 计算机 物联网专业毕业设计选题参考 嵌入式linux 单片机STM32 web 图像 htt
  • 数据库难点知识

    索引 当表中有大量记录时 若要对表进行查询 第一种搜索信息方式是全表搜索 是将所有记录一一取出 和查询条件进行一一对比 然后返回满足条件的记录 这样做会消耗大量数据库系统时间 并造成大量磁盘I O操作 第二种就是在表中建立索引 然后在索引中
  • matlab通用操作界面窗口包括哪些,matlab作业题

    第一章 MATLAB环境 1 MATLAB通用操作界面窗口包括哪些 命令窗口 历史命令窗口 当前目录窗口 工作空间窗口各有哪些功能 答 MATLAB通用操作界面窗口包括 命令窗口 历史命令窗口 当前目录浏览器窗口 工作空间窗口 变量编辑器窗
  • 前端的工程化、模块化和组件化

    什么是工程化 工程化是一种思想而不是某种特定的技术 当然我们在实现项目工程化的过程中 我们也会去使用一些技术 前端工程化是使用软件工程的技术和方法来对前端的开发流程 技术 工具等进行规范化 标准化 其主要目的为了提高效率和降低成本 即提高开
  • 使用Class.forName 自动完成注册驱动,简化代码 但是 “//” 是使用最多的

    方式1 public void connect05 throws IOException ClassNotFoundException SQLException 通过properties对象获取文件信息 Properties propert
  • Python爬虫突破封禁的6种常见方法

    在互联网上进行自动数据采集 抓取 这件事和互联网存在的时间差不多一样长 今天大众好像更倾向于用 网络数据采集 有时会把网络数据采集程序称为网络机器人 bots 最常用的方法是写一个自动化程序向网络服务器请求数据 通常是用 HTML 表单或其
  • select2 获取选中的值

    获取选中的名 var cardTypeW cardType option checked text 获取选中的值 写法1 var cardTypeW cardType option checked val 写法2 var cardTypeW
  • js逆向-某旗小说

    声明 本文仅供学习参考 请勿用于他途 违者后果自负 前言 笔者一直是一个小说控 喜欢看小说很多年了 自从学会了python后 就经常会去不同的小说网站抓取小说保存到本地阅读 最近发现一本很好看的小说 准备抓下来看 却发现有请求参数和返回的接
  • webpack的构建流程

    一 运行流程 webpack 的运行流程是一个串行的过程 它的工作流程就是将各个插件串联起来 在运行过程中会广播事件 插件只需要监听它所关心的事件 就能加入到这条webpack机制中 去改变webpack的运作 使得整个系统扩展性良好 从启
  • opencv生成棋盘格

    头文件 include
  • 前端将List列表转化为树型结构(reduce函数)

    主要用到了reduce 函数 for循环可以做到的事情reduce 都可以做到 甚至操作起来更加简单方便和高雅 reduce 为数组中的每一个元素依次执行回调函数 不包括数组中被删除或从未被赋值的元素 reduce语法 array redu
  • 使用我们的actionbar实现我们的tab导航功能(详解)

    第一步的话就是创建我们对应的fragment 这里的话我们创建了三个对应的fragment 第二步的话就是创建我们的mytablistener类 package com example handle Fragments import and
  • 超简单:很火的3D立体动态相册,送给心爱的那个人

    1 首先 我们一共需要三个文件 目录关系如下所示 先建index html文件吧 电脑上先创建一个 txt文件 在里面加入代码后保存 重命名为index html 记得把原来的 txt后缀覆盖 html我用的谷歌浏览器 index html
  • pg_receivewal实践

    测试从pg receivewal的日志中恢复从库为主库 主从配置async模式 配置pg receivewal接收日志pg receivewal D dbaas pg data pg receivewal data v h 10 9 10
  • 动态模型系列笔记(一)——隐马尔可夫模型(HMM)

    隐马尔可夫模型 背景介绍 提纲 隐马尔可夫模型 HMM 符号表示 两个假设 三个问题 Evaluation Learning Decoding 小结 附录 背景介绍 隐马尔可夫模型 HMM 是一种概率图模型 我们知道 机器学习模型可以从频率