在这一部分中,我们将要介绍NLP领域最常见的一类问题:序列标注。

1. 序列标注

  在NLP领域中,有许多的任务可以转化为“将输入的语言序列转化为标注序列”来解决问题。比如,命名实体识别、词性标注等等。

1.1 命名实体识别

  命名实体识别是NLP中的一个经典问题,比如从一句话中识别出人名、地名、组织机构名等等。
  举例来看:
  任务目标:将给定的输入序列中的组织机构名识别出来。

  输入序列中,“远大公司”是一个组织机构名。根据任务,我们的目标是将其标注出来。
  标注序列中,B表示实体开始符,E表示实体结束符,I表示实体中间内容,O表示非实体的单个字。

1.2 词性标注

  顾名思义,词性标注的目标就是将给定的输入序列中词的词性标出来。
举例来看:

  很明显,这也可以看作一个序列标注任务。

  除此之外,序列标注还可以解决很多问题,例如分词、短语识别、信息抽取等等,在这里不一一举例,有兴趣的朋友们可以自行百度进行了解~

  那么,如何解决序列标注问题呢?
  常用的方法有三种:

  1. 隐马尔科夫模型(HMM)
  2. 条件随机场(CRF)
  3. 神经网络与条件随机场相结合(RNN+CRF)

  下面,我们对这三种方法一一进行介绍。

2. 隐马尔科夫模型(HMM)

  在介绍隐马尔科夫模型(简称隐马模型,HMM)之前,我们先来了解一下马尔可夫模型。

2.1 马尔可夫模型

  假设一个系统有nnn个状态:S1,S2,...SnS_1,S_2,...S_nS1​,S2​,...Sn​,且随着时间(空间)的推移,系统从某一状态转移到另一状态,如果系统在时间ttt的状态q(t)q(t)q(t)只与其在时间t−1t-1t−1的状态相关,则系统构成离散的一阶马尔可夫链。
  以掷骰子为例:
  很明显,在“掷骰子”这个系统中,状态集是这个样子的:

  随着时间的推移,状态序列有可能是这个样子的:

  在这里,需要区别一下状态集和状态序列之间的差别:状态集是一个无序集合,而状态序列是一个有序序列。

  在马尔可夫链的基础上,构建马尔可夫模型:
p(S0,S1,...,ST)=∏t=1Tp(St∣St−1)p(S0)p(S_0,S_1,...,S_T)=\prod_{t=1}^Tp(S_t|S_{t-1})p(S_0)p(S0​,S1​,...,ST​)=t=1∏T​p(St​∣St−1​)p(S0​)

  公式很容易理解,即,“当前状态仅与上一时刻状态有关”。
  假设状态序列(马尔可夫链)如下:

  那么根据马尔可夫模型,有独立于时间ttt的随机过程:
p(qt=Sj∣qt−1=Si)=ai,j,1≤i,j≤np(q_t=S_j|q_{t-1}=S_i)=a_{i,j},\quad1≤i,j≤np(qt​=Sj​∣qt−1​=Si​)=ai,j​,1≤i,j≤n

  其中,将ai,ja_{i,j}ai,j​定义为状态转移概率,ai,j≥0a_{i,j}≥0ai,j​≥0,且∑j=1Nai,j=1\sum_{j=1}^Na_{i,j}=1∑j=1N​ai,j​=1
  这部分很好理解,就不再解释具体细节。
  对于马尔可夫模型而言,最重要的部分还是老问题,四元组:
  模型输入:状态序列
  模型输出:状态序列概率
  模型参数:p(qt∣qt−1)p(q_t|q_{t-1})p(qt​∣qt−1​)
对应运算关系:p(S0,S1,...,ST)=∏t=1Tp(St∣St−1)p(S0)p(S_0,S_1,...,S_T)=\prod_{t=1}^Tp(S_t|S_{t-1})p(S_0)p(S0​,S1​,...,ST​)=∏t=1T​p(St​∣St−1​)p(S0​)

  所以,马尔可夫模型的组成是一个三元组:M=(S,π,A)M=(S,\pi,A)M=(S,π,A)
  其中,SSS表示有限状态集合;pipipi表示初始状态空间的概率分布;AAA表示与时间无关的状态转移概率矩阵。

在“掷骰子”系统中:
S={1,2,3,4,5,6}(1)S=\{1,2,3,4,5,6\} \tag{1}S={1,2,3,4,5,6}(1)

π=(1,0,0,0,0,0)(2)\pi=(1,0,0,0,0,0) \tag{2}π=(1,0,0,0,0,0)(2)

A=[1/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/61/6](3)A=\begin{bmatrix}1/6 & 1/6 & 1/6 & 1/6 & 1/6 &1/6 \\ 1/6 & 1/6 & 1/6 & 1/6 & 1/6 & 1/6\\ 1/6 & 1/6 & 1/6 & 1/6 &1/6 & 1/6\\1/6 & 1/6 &1/6 & 1/6 & 1/6 & 1/6\\1/6 &1/6 & 1/6 &1/6 &1/6 & 1/6\\1/6 & 1/6 & 1/6 & 1/6 & 1/6 & 1/6\\ \end{bmatrix} \tag{3}A=⎣⎢⎢⎢⎢⎢⎢⎡​1/61/61/61/61/61/6​1/61/61/61/61/61/6​1/61/61/61/61/61/6​1/61/61/61/61/61/6​1/61/61/61/61/61/6​1/61/61/61/61/61/6​⎦⎥⎥⎥⎥⎥⎥⎤​(3)

  其中,(2)(2)(2)表示初始状态为‘1’

2.2 隐马尔科夫模型

2.2.1 模型介绍

  隐马尔科夫模型(HMM)是一个双重随机过程,我们不知道具体的状态序列,只知道状态转移的概率。即,模型的状态转换过程是不可观察的(隐蔽的),而可观察事件的随机过程是隐蔽状态转换过程的随机函数。

  这个描述可能有些难以理解,不过没关系,我们举个例子来看:
  假设我们现在有一个描述天气变化的马尔可夫模型,描述该模型的三元组如下:

  图中,天气变化“晴云雨雨晴”是状态序列。
  而刚好,天气变化会引起海藻的潮湿度变化。于是,我们得到了海藻变化的序列,我们将其称为观察序列:

  如图中所说,观察序列的变化是由状态序列的变化引起的,前者时后者的随机函数。
  当状态序列不可见时,这就是一个隐马尔可夫模型:

  当状态序列不可见时,可以通过观察序列推出状态序列。

  看到这里,也许有朋友会问,这个有什么用啊?
  还是以天气和海藻为例,假设你在一个山洞里,你想看看外面是什么天气。但是你受伤了,走不出去,于是你只能通过身边的海藻变化推测外面的天气。

  与马尔可夫模型类似,隐马模型的组成是一个五元组:λ=(S,O,π,A,B)λ=(S,O,\pi,A,B)λ=(S,O,π,A,B)
  其中,S,π,AS,\pi,AS,π,A的含义与马尔可夫模型中的含义相同,分别指的是状态序列中的状态集、初始概率分布和状态转移概率矩阵(即上例中的天气);而OOO表示每个状态可能的观察值,BBB表示给定状态下,观察值的概率分布,也称为发射概率。
  如果对五元组含义有不理解的部分,上图中有清晰的解释,这里就不再赘述。
  特别地,该模型也可以简写为:λ=(π,A,B)λ=(\pi,A,B)λ=(π,A,B)
  通过对HMM的描述,我们可以看出HMM三个明显的假设,在这里对其形式化为:
  对于一个随机事件,有观察序列:O=O1O2...OTO=O_1O_2...O_TO=O1​O2​...OT​
  该事件背后隐含着一个状态序列:Q=q1q2...qTQ=q_1q_2...q_TQ=q1​q2​...qT​

  假设1:马尔可夫性假设(状态序列构成一阶马尔可夫链)
p(qi∣qi−1...q2q1)=p(qi∣qi−1)p(q_i|q_{i-1}...q_2q_1)=p(q_i|q_{i-1})p(qi​∣qi−1​...q2​q1​)=p(qi​∣qi−1​)

  假设2:不动性假设(状态与具体时间无关)
p(qi+1∣qi)=p(qj+1∣qj)p(q_{i+1}|q_i)=p(q_{j+1}|q_j)p(qi+1​∣qi​)=p(qj+1​∣qj​)
  对任意i,ji,ji,j成立
  假设3:输出独立性假设(输出观察值仅与当前状态有关)
p(O1,O2,...,OT∣q1,q2,...,qT)=∏t=1Tp(Ot∣qt)p(O_1,O_2,...,O_T|q_1,q_2,...,q_T)=\prod_{t=1}^Tp(O_t|q_t)p(O1​,O2​,...,OT​∣q1​,q2​,...,qT​)=t=1∏T​p(Ot​∣qt​)

  由此,我们可以总结出HMM的特点:

  1. HMM的状态是不可见的,只有通过观察序列的随机过程才能表现出来。
  2. 观察到的事件与状态并不是一一对应的,而是通过一组概率分布相联系。
  3. HMM是一个双重随机过程,两个组成部分分别为:
    a. 马尔可夫链:描述状态的转移,用转移概率描述;
    b. 一般随机函数:描述状态与观察序列间的关系, 用观察值概率(发射概率)描述。

  别忘了,HMM也是一种模型。对于HMM,描述模型的四元组分别是:
  输入:观察序列
  输出:1.观察序列的概率值;2.隐状态序列
  参数:p(qt∣qt−1),p(Ot∣qt)p(q_t|q_{t-1}),p(O_t|q_t)p(qt​∣qt−1​),p(Ot​∣qt​),即A,BA,BA,B矩阵

  也许有朋友会问,对应运算关系哪儿去了?
  由于对应运算关系描述的是输入到输出之间的关系,而HMM的输出有两种(分别对应HMM可以解决的两类问题),所以,我们将在两类问题中对运算关系进行阐述。

  针对HMM不同的输出,我们可以定义如下两类问题:

  1. 在给定模型中出现观察序列的可能性(概率值),也称为HMM评估问题;
  2. 通过观察序列找出最大可能的隐状态序列,也称为HMM解码问题。

2.2.2 HMM参数学习

  在介绍HMM的这两类问题之前,我们先来看看HMM模型的学习问题。
  在HMM中,参数就是A,BA,BA,B矩阵中的元素,即:p(St∣St−1)、p(Ot∣St)p(S_t|S_{t-1})、p(O_t|S_t)p(St​∣St−1​)、p(Ot​∣St​)
  在训练过程中,以观察序列O=O1,O2,...,OTO=O_1,O_2,...,O_TO=O1​,O2​,...,OT​作为训练数据,利用极大似然估计(MLE),使得观察序列OOO的概率最大。
  很明显,我们会遇到两种情况:

  1. 产生观察序列OOO的隐状态序列QQQ已知
  2. 产生观察序列OOO的隐状态序列QQQ未知

  对于第一种情况,隐状态序列已知,我们可以很容易地利用有监督学习的方法,用极大似然估计计算参数;
  对于第二种情况,隐状态序列未知,很明显极大似然估计不可行,此时可以采用无监督的EM方法进行学习。

  在这里,不对这两种方法进行更多说明,有兴趣的朋友们可以自行百度了解~

2.2.3 HMM评估问题

  首先,我们对HMM评估问题进行描述:
  对于给定的观察序列 O=O1,O2,...,OTO=O_1,O_2,...,O_TO=O1​,O2​,...,OT​以及模型 λ=(π,A,B)λ=(\pi,A,B)λ=(π,A,B),求观察序列的概率值 p(O∣λ)p(O|λ)p(O∣λ)

  看到这里,大家也许会一头雾水,疑问的来源大概有两个方面:

  1. 这个 p(O∣λ)p(O|λ)p(O∣λ)是什么?
  2. 这个p(O∣λ)p(O|λ)p(O∣λ)该怎么求?

  首先,给出p(O∣λ)p(O|λ)p(O∣λ)的定义:
  对于给定的一个状态序列 Q=q1q2...qTQ=q_1q_2...q_TQ=q1​q2​...qT​,根据条件联合分布的分解公式,可以得到:
p(O,Q∣λ)=p(Q∣λ)p(O∣Q,λ)p(O,Q|λ)=p(Q|λ)p(O|Q,λ)p(O,Q∣λ)=p(Q∣λ)p(O∣Q,λ)
  (这部分分解不太明白的朋友们可以自行百度,在这里不进行过多叙述)
  其中,
p(Q∣λ)=πq1aq1,q2aq2,q3...aqT−1,qTp(Q|λ)=\pi_{q_1}a_{q_1,q_2}a_{q_2,q_3}...a_{q_{T-1},q_T}p(Q∣λ)=πq1​​aq1​,q2​​aq2​,q3​​...aqT−1​,qT​​
p(O∣Q,λ)=bq1(O1)bq2(O2)...bqT(OT)p(O|Q,λ)=b_{q_1}(O_1)b_{q_2}(O_2)...b_{q_T}(O_T)p(O∣Q,λ)=bq1​​(O1​)bq2​​(O2​)...bqT​​(OT​)

  所以,有如下公式:
p(O∣Q,λ)=πq1aq1,q2aq2,q3...aqT−1,qTbq1(O1)bq2(O2)...bqT(OT)p(O|Q,λ)=\pi_{q_1}a_{q_1,q_2}a_{q_2,q_3}...a_{q_{T-1},q_T}b_{q_1}(O_1)b_{q_2}(O_2)...b_{q_T}(O_T)p(O∣Q,λ)=πq1​​aq1​,q2​​aq2​,q3​​...aqT−1​,qT​​bq1​​(O1​)bq2​​(O2​)...bqT​​(OT​)
公式很好理解,πq1\pi_{q_1}πq1​​表示时间1状态为q1q_1q1​的概率,aqi,qi+1a_{q_i,q_{i+1}}aqi​,qi+1​​表示状态由(第iii天)qiq_iqi​变为(第i+1i+1i+1天)qi+1q_{i+1}qi+1​的转移概率,bqi(Oi)b_{q_i}(O_i)bqi​​(Oi​)表示(第iii天)状态qiq_iqi​的观察值为OiO_iOi​的概率(发射概率)。
  按照时间推移来计算,该公式可以写为:
p(O,Q∣λ)=p(Q∣λ)p(O∣Q,λ)=πq1bq1(O1)aq1,q2bq2(O2)...aqT−1,qTbqT(OT)p(O,Q|λ)=p(Q|λ)p(O|Q,λ)=\pi_{q_1}b_{q_1}(O_1)a_{q_1,q_2}b_{q_2}(O_2)...a_{q_{T-1},q_T}b_{q_T}(O_T)p(O,Q∣λ)=p(Q∣λ)p(O∣Q,λ)=πq1​​bq1​​(O1​)aq1​,q2​​bq2​​(O2​)...aqT−1​,qT​​bqT​​(OT​)
  与上面的式子完全相同,希望对大家的理解有所帮助。
  当然,上述概率仅针对某特定的状态序列QQQ,对于全部状态序列,有:
p(O∣λ)=∑Qp(O,Q∣λ)=∑Qp(Q∣λ)p(O∣Q,λ)(4)p(O|λ)=\sum_Qp(O,Q|λ)=\sum_Qp(Q|λ)p(O|Q,λ) \tag{4}p(O∣λ)=Q∑​p(O,Q∣λ)=Q∑​p(Q∣λ)p(O∣Q,λ)(4)
  清楚了p(O∣λ)p(O|λ)p(O∣λ)的定义之后,下一个问题就是:如何计算p(O∣λ)p(O|λ)p(O∣λ)?

  由(4)式可以看出,p(O∣λ)p(O|λ)p(O∣λ)是一个积分项(求和项),所以针对所有可能的隐状态序列QQQ进行穷举后加和是一个可行的方法。然而,很显然的是,这种方法效率非常低。假设模型中的隐状态有nnn种,序列长度为TTT,可能的情况有nTn^TnT种。

  然而,在穷举过程中发现,某些计算过程可以重复利用,于是我们可以通过动态规划的方法使用递归,降低计算复杂度,这种方法被称为”前向算法“:
  定义前向变量αt(j)α_t(j)αt​(j),表示达到某个中间状态的概率(ttt时刻隐状态为jjj的概率)。

  当t=1t=1t=1时,为初始概率:
α1(i)=πibi(O1),t=1α_1(i)=\pi_ib_i(O_1),\quad t=1α1​(i)=πi​bi​(O1​),t=1

  当1<t≤T1<t≤T1<t≤T时,
αt(j)=[∑i=1nαt−1(i)ai,j]bj(Ot),1<t≤Tα_t(j)=[\sum_{i=1}^nα_{t-1}(i)a_{i,j}]b_j(O_t),\quad 1<t≤Tαt​(j)=[i=1∑n​αt−1​(i)ai,j​]bj​(Ot​),1<t≤T

  最终结果:p(O∣λ)=∑i=1nαT(i)p(O|λ)=\sum_{i=1}^nα_T(i)p(O∣λ)=∑i=1n​αT​(i)
  由于观察序列给定,所以每一步的每个值都可以通过查阅A,BA,BA,B矩阵进行计算。

  前向算法的过程很好理解,对每一时刻,计算观察值为当前观察值的概率,直到最后一个时刻,将所有满足条件的序列概率加和即为最终结果。

  很明显,前向算法的时间复杂度为O(n2T)O(n^2T)O(n2T),远小于穷举法的O(nT)O(n^T)O(nT)
  与前向算法对应的还有后向算法,具体算法不在这里进行介绍,有兴趣的朋友们可以自行百度~
  个人认为后向算法从理解上要比前向算法更绕一些,没有特殊需求的朋友们可以略过这一part~

2.2.4 HMM解码问题

  同样,我们首先对HMM解码问题进行描述:
  对给定观察序列O=O1,O2,...,OTO=O_1,O_2,...,O_TO=O1​,O2​,...,OT​以及模型 λ=(π,A,B)λ=(\pi,A,B)λ=(π,A,B),选择一个对应的状态序列S=S1,S2,...,STS=S_1,S_2,...,S_TS=S1​,S2​,...,ST​,使得SSS能够最合理地解释观察序列OOO(即,产生某观察序列OOO的,概率最大的状态序列)。

  以天气和海藻湿度为例:

  同样,我们可以用穷举法,计算每个状态序列产生该观察序列OOO的概率,最后选取概率最大的状态序列即可。但同样,穷举法的复杂度为O(nT)O(n^T)O(nT),效率极低。

  于是,聪明的人们再次利用动态规划的递归方法,降低了运算的复杂度,这种方法被称为Viterbi算法。

  在这里,我们不对Viterbi算法的正确性进行证明,而只对算法过程进行描述,对其正确性证明感兴趣的朋友们可以自行查阅相关资料~
  Viterbi算法定义部分概率 δδδ,δt(i)δ_t(i)δt​(i),表示ttt 时刻,到状态iii 的所有路径(隐状态序列)中概率最大的路径的概率。
δ1(i)=πibi(O1),1≤i≤nδ_1(i)=\pi_ib_i(O_1), \quad 1≤i≤nδ1​(i)=πi​bi​(O1​),1≤i≤n

δt(j)=[max1≤i≤n(δt−1(i)ai,j)]bj(Ot),2≤i≤T,1≤j≤nδ_t(j)=[max_{1≤i≤n}(δ_{t-1}(i)a_{i,j})]b_j(O_t), \quad 2≤i≤T,\quad1≤j≤nδt​(j)=[max1≤i≤n​(δt−1​(i)ai,j​)]bj​(Ot​),2≤i≤T,1≤j≤n

  在这个过程中,利用一个后向指针 ψ\psiψ 记录导致某个状态最大局部概率的前一个状态。即,利用变量 ψ\psiψ 记录路径。
ψt(i)=argmaxj(δt−1(j)aj,i)\psi_t(i)=argmax_j(δ_{t-1}(j)a_{j,i})ψt​(i)=argmaxj​(δt−1​(j)aj,i​)

  通过Viterbi算法公式我们可以发现,在递归过程中(除 t=1t=1t=1 外),每一时刻概率值的计算都依赖于上一时刻传来的maxmaxmax值,而通俗来讲,ψ\psiψ 就是用来记录这个maxmaxmax是从上一时刻的哪个隐状态传过来的。

  于是,在计算到最后一个时刻 TTT 之后,我们同样选取概率最大的一个隐状态作为最后时刻的隐状态输出,并以此利用之前记录的 ψ\psiψ 指针回溯,得到所有时刻的隐状态,得到的结果即为最后的结果:
qT∗=argmax1≤i≤n[δT(i)]q_T^*=argmax_{1≤i≤n}[δ_T(i)]qT∗​=argmax1≤i≤n​[δT​(i)]
qt∗=ψt+1(qt+1∗),t=T−1,T−2,...,1q_t^*=\psi_{t+1}(q_{t+1}^*), \quad t=T-1,T-2,...,1qt∗​=ψt+1​(qt+1∗​),t=T−1,T−2,...,1
  Viterbi算法的整个过程与前向算法类似,只不过将每步递归中的求和改为了取最大值。

2.2.5 HMM应用

  介绍过HMM模型之后,让我们回归到一开始的问题——HMM是用来干什么的?在本篇文章的开头,我们曾经提到过:HMM是解决序列标注问题的常用方法。
  那么它究竟是如何解决序列标注问题的呢?

  在文章的开头,我们说过,词性标注可以看作一个序列标注问题,现在我们就以词性标注为例,介绍HMM在其中如何发挥作用:
  假设我们需要对‘Flies like a flower’进行词性标注。

  在自然语言处理领域,HMM的观察序列往往是词,隐状态序列往往是词类(例如词性)。
  现在,我们已知观察序列:‘Flies like a flower’,要求取最合理的隐状态序列(词性序列),这可以看作一个HMM解码问题。
  假设我们有如下的从语料库中训练得到的词性转移概率矩阵和词语生成概率矩阵:

  这就相当于我们HMM里的A,BA,BA,B矩阵,于是我们有了Viterbi算法实现的种种必要条件:观察序列以及HMM的A,BA,BA,B矩阵,可以进行计算,从而得到词性标注的结果。

  HMM在NLP领域中有着广泛的应用。除序列标注之外,HMM还可以进行分词过程中的消歧:当分词出现多种可能时,可以利用HMM取概率最大的序列(相当于HMM评估问题);直接利用HMM进行分词(将分词任务看作序列标注问题)等等。
  HMM的其他应用在这里不再进行赘述,有兴趣的朋友们可以自行查阅相关资料~

  这一部分中,我们主要介绍了序列标注问题以及解决该问题的第一种方法:HMM。
  对于HMM的评估问题和解码问题,我们主要关注对原理的理解,而没有对具体的例子和运算细节进行太多纠结,这方面的内容网上有很多,有兴趣的朋友可以自行查阅~

3. 参考文献

[1] https://blog.csdn.net/echoKangYL/article/details/86983973

NLP入门概览(4)—— 序列标注a:隐马尔科夫模型(HMM)相关推荐

  1. 【NLP】用于语音识别、分词的隐马尔科夫模型HMM

    大家好,今天介绍自然语言处理中经典的隐马尔科夫模型(HMM).HMM早期在语音识别.分词等序列标注问题中有着广泛的应用. 了解HMM的基础原理以及应用,对于了解NLP处理问题的基本思想和技术发展脉络有 ...

  2. 一、隐马尔科夫模型HMM

    隐马尔科夫模型HMM(一)HMM模型基础 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用. ...

  3. 隐马尔科夫模型HMM自学 (3)

    Viterbi Algorithm 本来想明天再把后面的部分写好,可是睡觉今天是节日呢?一时情不自禁就有打开电脑.......... 找到可能性最大的隐含状态序列 崔晓源 翻译 多数情况下,我们都希望 ...

  4. python地图匹配_基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法

    1. 摘要 本篇博客简单介绍下用隐马尔科夫模型(Hidden Markov Model, HMM)来解决地图匹配(Map-Matching)问题.转载请注明网址. 2. Map-Matching(MM ...

  5. m基于隐马尔科夫模型(HMM)的手机用户行为预测(MMUB)算法matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,广泛应用在语音识别, ...

  6. 隐马尔科夫模型HMM自学 (2)

    HMM 定义 崔晓源 翻译 HMM是一个三元组 (,A,B).  the vector of the initial state probabilities;  the state transitio ...

  7. 隐马尔科夫模型 HMM 与 语音识别 speech recognition (1):名词解释

    0.引言 想在 CSDN 上看一下隐马尔科夫模型,简称HMM(Hidden Markov Model)的例子,找了几篇博文,却发现大部分都是转载的,转载的还没有出处,文中的表述与逻辑也看的人晕头转向, ...

  8. 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

    在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的.在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇 ...

  9. 隐马尔科夫模型 (HMM) 算法介绍及代码实现

    Table of Contents Hidden Markov Model (隐马尔科夫模型) 定义 基本问题 前向算法 算法流程 实现代码 后向算法 算法流程 实现代码 Viterbi算法 算法流程 ...

  10. 隐马尔科夫模型(HMM)择时应用的量化策略

    HMM模型 隐马尔科夫模型(HMM)择时应用的量化策略. 仅为研究学习使用, 不作为任何投资策略建议. 文章内容从各处整理汇总而成, 感谢各位大神分享.  具体策略代码均调试通过. 一.从大奖章讲起 ...

最新文章

  1. 几道常见String面试题
  2. android的数据存储方式有哪几种方式,android存储数据的几种方式比较
  3. mongo explain分析详解
  4. python中静态变量和静态方法_【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)...
  5. JAVA不可变List的实现
  6. 自定义动画——animate()
  7. Hibernate事实:始终检查Criteria API SQL查询
  8. 使用base64编码把背景添加到CSS文件中
  9. DWR自学笔记(1)HelloWorld
  10. Vue中拆分视图层代码的5点建议
  11. Exception while invoking! org.apache.thrift.protocol.TProtocolException: Bad version in readMessageB
  12. VC最常见的20种VC++编译错误信息
  13. 用acdsee制作html,应用文论文写作 - - 计算机 - 计算机网络 - ACDSee的HTML相册生成...
  14. flutter代码中使用Android/ios原生生命周期
  15. 写给Python社群的第1课:初识Python,开篇知识点就选字符串吧~
  16. cpu亲和力总结taskset和setcpu及其他相关
  17. 谷歌标签恢复_避免/从Google惩罚中恢复
  18. 红米Android降级,红米Note 5(安卓9.0 不要降级刷低版本)纯净ROOT线刷包分享,一键救砖教程,轻松刷回官方系统,流畅如初!...
  19. 【因果推断的统计方法】综述与个人理解
  20. The Butcher

热门文章

  1. PPC关键字广告是什么?一次搞懂CPC、CPM广告投放术语
  2. 为什么90%的程序员学编程都会从C语言开始?
  3. css创建鼠标悬停下拉菜单样式
  4. 计算机系统写字板,什么是电脑写字板 电脑写字板使用方法
  5. 1000行代码写小游戏(一)
  6. 个人版的一键GHOST工具V1.0 BY何定坤
  7. 毕业设计-基于BP神经网络预测系统的设计- MATLAB
  8. (附源码)计算机毕业设计ssm高校智慧党建党务管理系统
  9. python支持复数类型、以下说法错误的是_Python支持复数类型,以下哪个说法是错误的?...
  10. 基于matlab在信号与系统仿真中的应用,基于MATLAB在信号与系统仿真中的应用