机器学习系列(四)——条件随机场

本文深入探讨了马尔可夫过程、隐马尔科夫算法及条件随机场的基本概念、数学模型和应用。重点介绍了条件随机场的参数化、简化与矩阵形式,以及概率计算、学习和预测问题的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、马尔可夫过程

定义:假设一个随机过程中, t n t_n tn 时刻的状态 x n x_n xn的条件发布,只与其前一状态 x n − 1 x_{n-1} xn1 相关,即:
P ( x n ∣ x 1 , x 2 , . . . , x n − 1 ) = P ( x n ∣ x n − 1 ) P(x_n|x_1,x_2,...,x_{n-1}) = P(x_n|x_{n-1}) P(xnx1,x2,...,xn1)=P(xnxn1)
则将其称为马尔可夫过程。
在这里插入图片描述

二、隐马尔科夫算法

1、定义:

隐马尔科夫算法是对含有未知参数(隐状态)的马尔可夫链进行建模的生成模型,如下图所示:

在这里插入图片描述

在隐马尔科夫模型中,包含隐状态和观察状态,隐状态 x i x_i xi对于观察者而言是不可见的,而观察状态 y i y_i yi对于观察者而言是可见的。隐状态间存在转移概率,隐状态 x i x_i xi到对应的观察状态 y i y_i yi间存在输出概率。

2、假设:

  1. 假设隐状态 x i x_i xi的状态满足马尔可夫过程,i时刻的状态 x i x_i xi的条件分布,仅与其前一个状态 x i − 1 x_{i-1} xi1相关,即:
    P ( x i ∣ x 1 , x 2 , . . . , x i − 1 ) = P ( x i ∣ x i − 1 ) P(x_i|x_1,x_2,...,x_{i-1}) = P(x_i|x_{i-1}) P(xix1,x2,...,xi1)=P(xixi1)

  2. 假设观测序列中各个状态仅取决于它所对应的隐状态,即:
    P ( y i ∣ x 1 , x 2 , . . . , x i − 1 , y 1 , y 2 , . . . , y i − 1 , y i + 1 , . . . ) = P ( y i ∣ x i ) P(y_i|x_1,x_2,...,x_{i-1},y_1,y_2,...,y_{i-1},y_{i+1},...) = P(y_i|x_{i}) P(yix1,x2,...,xi1,y1,y2,...,yi1,yi+1,...)=P(yixi)

3、存在问题:

在序列标注问题中,隐状态(标注)不仅和单个观测状态相关,还和观察序列的长度、上下文等信息相关。例如词性标注问题中,一个词被标注为动词还是名词,不仅与它本身以及它前一个词的标注有关,还依赖于上下文中的其他词。

三、条件随机场(以线性链条件随机场为例)

1、定义

给定 X = ( x 1 , x 2 , . . . , x n ) X=(x_1,x_2,...,x_n) X=(x1,x2,...,xn) Y = ( y 1 , y 2 , . . . , y n ) Y=(y_1,y_2,...,y_n) Y=(y1,y2,...,yn)均为线性链表示的随机变量序列,若在给随机变量序列 X X X的条件下,随机变量序列 Y Y Y的条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX)构成条件随机场,即满足马尔可夫性:
P ( y i ∣ x 1 , x 2 , . . . , x i − 1 , y 1 , y 2 , . . . , y i − 1 , y i + 1 ) = P ( y i ∣ x , y i − 1 , y i + 1 ) P(y_i|x_1,x_2,...,x_{i-1},y_1,y_2,...,y_{i-1},y_{i+1})= P(y_i|x,y_{i-1},y_{i+1}) P(yix1,x2,...,xi1,y1,y2,...,yi1,yi+1)=P(yix,yi1,yi+1)
则称为 P ( Y ∣ X ) P(Y|X) P(YX)为线性链条件随机场。

通过去除了隐马尔科夫算法中的观测状态相互独立假设,使算法在计算当前隐状态 x i x_i xi时,会考虑整个观测序列,从而获得更高的表达能力,并进行全局归一化解决标注偏置问题。

在这里插入图片描述

1)参数化形式

p ( y ∣ x ) = 1 Z ( x ) ∏ i = 1 n exp ⁡ ( ∑ i , k λ k t k ( y i − 1 , y i , x , i ) + ∑ i , l μ l s l ( y i , x , i ) ) p\left(y | x\right)=\frac{1}{Z\left(x\right)} \prod_{i=1}^{n} \exp \left(\sum_{i, k} \lambda_{k} t_{k}\left(y_{i-1}, y_{i}, x, i\right)+\sum_{i, l} \mu_{l} s_{l}\left(y_{i}, x, i\right)\right) p(yx)=Z(x)1i=1nexpi,kλktk(yi1,yi,x,i)+i,lμlsl(yi,x,i)

其中:
Z ( x ) Z(x) Z(x)为归一化因子,是在全局范围进行归一化,枚举了整个隐状态序列 x 1 … n x_{1…n} x1n的全部可能,从而解决了局部归一化带来的标注偏置问题。

Z ( x ) = ∑ y exp ⁡ ( ∑ i , k λ x t k ( y i − 1 , y i , x , i ) + ∑ i , l μ l s l ( y i , x , i ) ) Z(x)=\sum_{y} \exp \left(\sum_{i, k} \lambda_{x} t_{k}\left(y_{i-1}, y_{i}, x, i\right)+\sum_{i, l} \mu_{l} s_{l}\left(y_{i}, x, i\right)\right) Z(x)=yexpi,kλxtk(yi1,yi,x,i)+i,lμlsl(yi,x,i)
t k t_k tk 为定义在边上的特征函数,转移特征,依赖于前一个和当前位置
s 1 s_1 s1 为定义在节点上的特征函数,状态特征,依赖于当前位置。

2)简化形式

因为条件随机场中同一特征在各个位置都有定义,所以可以对同一个特征在各个位置求和,将局部特征函数转化为一个全局特征函数,这样就可以将条件随机场写成权值向量和特征向量的内积形式,即条件随机场的简化形式。

  • step 1
    将转移特征和状态特征及其权值用统一的符号表示,设有 k 1 k_1 k1个转移特征, k 2 k_2 k2个状态特征, K = k 1 + k 2 K=k_1+k_2 K=k1+k2,记
    f k ( y i − 1 , y i , x , i ) = { t k ( y i − 1 , y i , x , i ) , k = 1 , 2 , 3 , . . . , K 1 s l ( y i , x , i ) , k = k 1 + l ; l = 1 , 2 , . . . , K 2 f_k(y_{i-1},y_i,x,i)=\begin{cases}t_k(y_{i-1},y_i,x,i),\quad k = 1,2,3, ..., K_1 \\s_l(y_i,x,i), \quad k = k_1+l; l = 1, 2, ... , K_2\end{cases} fk(yi1,yi,x,i)={tk(yi1,yi,x,i),k=1,2,3,...,K1sl(yi,x,i),k=k1+l;l=1,2,...,K2

  • step 2
    对转移与状态特征在各个位置 i i i求和,记作
    f k ( y , x ) = ∑ i = 1 n f k ( y i − 1 , y i , x , i ) , k = 1 , 2 , . . . , K f_k(y,x)=\sum_{i=1}^nf_k(y_{i-1},y_i,x,i),k=1,2,...,K fk(y,x)=i=1nfk(yi1,yi,x,i),k=1,2,...,K

  • step 3
    λ x \lambda_{x} λx μ l \mu_{l} μl 用统一的权重表示,记作
    w k = { λ k , k = 1 , 2 , . . . , K 1 μ l , k = K 1 + l ; l = 1 , 2 , . . . , K 2 w_k = \begin{cases}\lambda_k, \quad k = 1, 2, ..., K_1 \\\mu_l, \quad k = K_1+l; l = 1, 2, ..., K_2\end{cases} wk={λk,k=1,2,...,K1μl,k=K1+l;l=1,2,...,K2

  • step 4
    转化后的条件随机场可表示为:
    P ( y ∣ x ) = 1 Z ( x ) e x p ∑ k = 1 K w k f k ( y , x ) P(y|x)=\frac{1}{Z(x)}exp\sum_{k=1}^{K}w_kf_k(y,x) P(yx)=Z(x)1expk=1Kwkfk(y,x)
    Z ( x ) = ∑ y e x p ∑ k = 1 K w k f k ( y , x ) Z(x)=\sum_yexp\sum_{k=1}^Kw_kf_k(y,x) Z(x)=yexpk=1Kwkfk(y,x)

  • step 5
    w w w 表示权重向量:
    w = ( w 1 , w 2 , . . . , w K ) T w = (w_1,w_2,...,w_K)^T w=(w1,w2,...,wK)T
    F ( y , x ) F(y,x) F(y,x) 表示特征向量,即
    F ( y , x ) = ( f 1 ( y ∣ x ) , f 2 ( y ∣ x ) , . . . , f K ( y ∣ x ) ) T F(y,x)=(f_1(y|x),f_2(y|x),...,f_K(y|x))^T F(y,x)=(f1(yx),f2(yx),...,fK(yx))T

则,条件随机场写成内积形式为:
P w ( y ∣ x ) = e x p ( w ⋅ F ( y , x ) Z w ( x ) P_w(y|x)=\frac{exp(w\cdot F(y,x)}{Z_w(x)} Pw(yx)=Zw(x)exp(wF(y,x)
Z w ( x ) = ∑ y e x p ( w ⋅ F ( y , x ) ) Z_w(x)=\sum_yexp(w\cdot F(y,x)) Zw(x)=yexp(wF(y,x))

3)矩阵形式

P w ( y ∣ x ) = 1 Z w ( x ) ∏ i = 1 n + 1 M i ( y i − 1 , y i ∣ x ) P_w(y|x)=\frac{1}{Z_w(x)}\prod_{i=1}^{n+1}M_i(y_{i-1},y_i|x) Pw(yx)=Zw(x)1i=1n+1Mi(yi1,yix)

2、基本问题

条件随机场包含概率计算问题、学习问题和预测问题三个问题。

    1. 概率计算问题:已知模型的所有参数,计算观测序列 Y Y Y出现的概率,常用方法:前向和后向算法;
    1. 学习问题:已知观测序列 Y Y Y,求解使得该观测序列概率最大的模型参数,包括隐状态序列、隐状态间的转移概率分布和从隐状态到观测状态的概率分布,常用方法: B a u m − W e h c h Baum-Wehch BaumWehch算法;
    1. 预测问题:一直模型所有参数和观测序列 Y Y Y,计算最可能的隐状态序列 X X X,常用算法:维特比算法。

1)概率计算问题

给定条件随机场 P ( Y ∣ X ) P(Y|X) P(YX),输入序列 x x x 和 输出序列 y y y;
计算条件概率
P ( Y i = y i ∣ x ) , P ( Y i − 1 = y i − 1 , Y i = y i ∣ x ) P(Y_i=y_i|x), P(Y_{i-1} = y_{i-1},Y_i = y_i|x) P(Yi=yix),P(Yi1=yi1,Yi=yix)
计算相应的数学期望问题;

①前向-后向算法
  • step 1 前向计算
    对观测序列 x x x的每个位置 i = 1 , 2 , . . . , n + 1 i=1,2,...,n+1 i=1,2,...,n+1,定义一个 m m m阶矩阵( m m m为标记 Y i Y_i Yi取值的个数)

对每个指标 i = 0 , 1 , . . . , n + 1 i=0,1,...,n+1 i=0,1,...,n+1,定义前向向量 α i ( x ) \alpha_{i}(x) αi(x),则递推公式:
α i T ( y i ∣ x ) = α i − 1 T ( y i − 1 ∣ x ) M i ( y i − 1 , y i ∣ x ) , i = 1 , 2 , . . , n + 1 \alpha_i^T(y_i|x)=\alpha_{i-1}^T(y_{i-1}|x)M_i(y_{i-1},y_i|x),i=1,2,..,n+1 αiT(yix)=αi1T(yi1x)Mi(yi1,yix),i=1,2,..,n+1
其中,
α 0 ( y ∣ x ) = { 1 , y = s t a r t 0 , 否 则 \alpha_0(y|x) = \begin{cases}1, \quad y = start \\0, \quad 否则\end{cases} α0(yx)={1,y=start0,

  • step 2 后向计算
    对每个指标 i = 0 , 1 , . . . , n + 1 i=0,1,...,n+1 i=0,1,...,n+1,定义前向向量 β i ( x ) \beta_{i}(x) βi(x),则递推公式:
    β n + 1 ( y n + 1 ∣ x ) = { 1 , y n + 1 = s t o p 0 , 否 则 \beta _{n+1}(y_{n+1}|x) = \begin{cases}1, \quad y_{n+1} = stop \\0, \quad 否则\end{cases} βn+1(yn+1x)={1,yn+1=stop0,
    β i ( y i ∣ x ) = M i ( y i , y i + 1 ∣ x ) β i − 1 ( y i + 1 ∣ x ) \beta _i(y_i|x) =M_i(y_i,y_{i+1}|x)\beta_{i-1}(y_{i+1}|x) βi(yix)=Mi(yi,yi+1x)βi1(yi+1x)

  • step 3
    Z ( x ) = α n T ( x ) ⋅ 1 = 1 T ⋅ β 1 ( x ) Z(x)=\alpha_n^T(x)\cdot 1=1^T\cdot\beta_1(x) Z(x)=αnT(x)1=1Tβ1(x)

  • step 4 概率计算
    所以,标注序列在位置 i i i是标注 y i y_i yi的条件概率为:
    P ( Y i = y i ∣ x ) = α i T ( y i ∣ x ) β i ( y i ∣ x ) Z ( x ) P(Y_i=y_i|x)=\frac{\alpha_i^T(y_i|x)\beta_i(y_i|x)}{Z(x)} P(Yi=yix)=Z(x)αiT(yix)βi(yix)
    P ( Y i − 1 = y i − 1 , Y i = y i ∣ x ) = α i − 1 T ( y i − 1 ∣ x ) M i ( y i − 1 , y i ∣ x ) Z ( x ) P(Y_{i-1}=y_{i-1},{Y_i}=y_i|x)=\frac{\alpha_{i-1}^T(y_{i-1}|x)M_i(y_{i-1},y_i|x)}{Z(x)} P(Yi1=yi1,Yi=yix)=Z(x)αi1T(yi1x)Mi(yi1,yix)
    其中,
    Z ( x ) = α n T ( x ) ⋅ 1 Z(x)=\alpha_n^T(x)\cdot1 Z(x)=αnT(x)1

  • step 5 期望值计算
    通过利用前向-后向向量,计算特征函数关于联合概率分布 P ( X , Y ) P(X,Y) P(X,Y) 和 条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX) 的数学期望,即特征函数 f k f_k fk 关于条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX) 的数学期望:
    E P ( Y ∣ X ) [ f k ] = ∑ y P ( y ∣ x ) f k ( y , x ) = ∑ i = 1 n + 1 ∑ y i − 1 y i f k ( y i − 1 , y i , x , i ) α i − 1 T ( y i − 1 ∣ x ) M i ( y i − 1 , y i ∣ x ) β i ( y i ∣ x ) Z ( x ) k = 1 , 2 , . . . , K E_{P(Y|X)}[f_k]=\sum_yP(y|x)f_k(y,x)\\=\sum_{i=1}^{n+1}\sum_{y_{i-1}y_i}f_k(y_{i-1},y_i,x,i)\frac{\alpha_{i-1}^T(y_{i-1}|x)M_i(y_{i-1},y_i|x)\beta_i(y_i|x)}{Z(x)}\\k=1,2,...,K EP(YX)[fk]=yP(yx)fk(y,x)=i=1n+1yi1yifk(yi1,yi,x,i)Z(x)αi1T(yi1x)Mi(yi1,yix)βi(yix)k=1,2,...,K
    其中:
    M i ( x ) = [ M i ( y i − 1 , y i ∣ x ) ] M i ( y i − 1 , y i ∣ x ) = e x p ( W i ( y i − 1 , y i ∣ x ) ) W i ( y i − 1 , y i ∣ x ) = ∑ i = 1 K w k f k ( y i − 1 , y i , x , i ) ) M_i(x)=[M_i(y_{i-1},y_i|x)]\\M_i(y_{i-1},y_i|x)=exp(W_i(y_{i-1},y_i|x))\\W_i(y_{i-1},y_i|x)=\sum_{i=1}^Kw_kf_k(y_{i-1},y_i,x,i)) Mi(x)=[Mi(yi1,yix)]Mi(yi1,yix)=exp(Wi(yi1,yix))Wi(yi1,yix)=i=1Kwkfk(yi1,yi,x,i))

2)学习问题

这里主要介绍一下 BFGS 算法的思路。

输入:特征函数 f 1 , f 2 , . . . , f n f_1,f_2,...,f_n f1,f2,...,fn:经验分布 P ~ ( X , Y ) \widetilde{P}(X,Y) P (X,Y)

输出:最优参数值 w ^ \widehat{w} w ,最优模型 P w ^ ( y ∣ x ) P_{\widehat{w}}(y|x) Pw (yx)

  1. 选定初始点 w ( 0 ) w^{(0)} w(0), 取 B 0 B_0 B0 为正定对称矩阵, k = 0 k = 0 k=0;

  2. 计算 g k = g ( w ( k ) ) g_k = g(w^(k)) gk=g(w(k)),若 g k = 0 g_k = 0 gk=0 ,则停止计算,否则转 (3) ;

  3. 利用 B k p k = − g k B_k p_k = -g_k Bkpk=gk 计算 p k p_k pk

  4. 一维搜索:求 λ k \lambda_k λk使得
    f ( w ( k ) + λ k p k ) = m i n λ > 0 f ( w ( k ) + λ p k ) f(w^{(k)}+\lambda_kp_k)=min_{\lambda>0}f(w^{(k)}+\lambda p_k) f(w(k)+λkpk)=minλ>0f(w(k)+λpk)

  5. w ( k + 1 ) = w ( k ) + λ k ∗ p k w^{(k+1)} = w^{(k)} + \lambda_k * p_k w(k+1)=w(k)+λkpk

  6. 计算 g k + 1 g_{k+1} gk+1 = g(w^{(k+1)}),

    g k = 0 g_k = 0 gk=0, 则停止计算;否则,利用下面公式计算 B k + 1 B_{k+1} Bk+1:

    B k + 1 = B k + y k y k T y k T δ k − B k δ k δ k T B k δ k T B k δ k y k = g k + 1 − g k , δ k = w ( k + 1 ) − w ( k ) B_{k+1}=B_k+\frac{y_ky_k^T}{y_k^T\delta_k}-\frac{B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k}\\y_k=g_{k+1}-g_k,\delta_k=w^{(k+1)}-w^{(k)} Bk+1=Bk+ykTδkykykTδkTBkδkBkδkδkTBkyk=gk+1gk,δk=w(k+1)w(k)

  7. k = k + 1 k=k+1 k=k+1,转步骤(3);

3)预测问题

对于预测问题,常用的方法是维特比算法,其思路如下:

输入:模型特征向量 F ( y , x ) F(y,x) F(y,x) 和权重向量 w w w,输入序列(观测序列) x = x 1 , x 2 , . . . , x n x={x_1,x_2,...,x_n} x=x1,x2,...,xn

输出:条件概率最大的输出序列(标记序列) y ∗ = ( y 1 ∗ , y 2 ∗ , . . . , y n ∗ ) y^{*}= (y_1^*,y_2^*,...,y_n^*) y=(y1,y2,...,yn),也就是最优路径;

  1. 初始化

δ 1 ( j ) = w ⋅ F 1 ( y 0 = s t a r t , y 1 = j , x ) , j = 1 , 2 , . . . , m \delta_1(j)=w\cdot F_1(y_0=start,y_1=j,x),j=1,2,...,m δ1(j)=wF1(y0=start,y1=j,x),j=1,2,...,m

  1. 递推,对 i = 2 , 3 , . . . , n i=2,3,...,n i=2,3,...,n

δ i ( l ) = m a x 1 ≤ j ≤ m { δ i − 1 ( j ) + w ⋅ F i ( y i − 1 = j , y i = l , x ) } , l = 1 , 2 , . . . , m Ψ i ( l ) = a r g m a x 1 ≤ j ≤ m { δ i − 1 ( j ) + w ⋅ F i ( y j − 1 = j , y i = l , x } , l = 1 , 2 , . . . , m \delta_i(l)=max_{1\leq j\leq m}\{\delta_{i-1}(j)+w\cdot F_i(y_{i-1}=j,y_i=l,x)\},l=1,2,...,m\\ \Psi_i(l)=argmax_{1\leq j\leq m}\{\delta_{i-1}(j)+w\cdot F_i(y_{j-1}=j,y_i=l,x\},l=1,2,...,m δi(l)=max1jm{δi1(j)+wFi(yi1=j,yi=l,x)},l=1,2,...,mΨi(l)=argmax1jm{δi1(j)+wFi(yj1=j,yi=l,x},l=1,2,...,m

  1. 终止

m a x y ( w ⋅ F ( y , x ) ) = m a x 1 ≤ j ≤ m δ n ( j ) y n ∗ = a r g m a x 1 ≤ j ≤ m δ n ( j ) max_y(w\cdot F(y,x))=max_{1\leq j\leq m}\delta_n(j)\\y_n^{*}=argmax_{1\leq j\leq m}\delta_n(j) maxy(wF(y,x))=max1jmδn(j)yn=argmax1jmδn(j)

  1. 返回路径

y i ∗ = Ψ i + 1 ( y i + 1 ∗ ) , i = n − 1 , n − 2 , . . . , 1 y_i^{*}=\Psi_{i+1}(y_{i+1}^{*}),i=n-1,n-2,...,1 yi=Ψi+1(yi+1),i=n1,n2,...,1

求得最优路径 y ∗ = ( y 1 ∗ , y 2 ∗ , . . . , y n ∗ ) y^{*}= (y_1^*,y_2^*,...,y_n^*) y=(y1,y2,...,yn)

利用维特比算法计算给定输入序列 x x x 对应的最优输出序列 y ∗ y^* y

m a x ∑ i = 1 3 w ⋅ F i ( y i − 1 , y i , x ) max\sum_{i=1}^3w\cdot F_i(y_{i-1},y_i,x) maxi=13wFi(yi1,yi,x)

  1. 初始化

δ 1 ( j ) = w ⋅ F 1 ( y 0 = s t a r t , y 1 = j , x ) , j = 1 , 2 i = 1 , δ 1 ( 1 ) = 1 , δ 1 ( 2 ) = 0.5 \delta_1(j)=w\cdot F_1(y_0=start,y_1=j,x),j=1,2\\i=1,\delta_1(1)=1,\delta_1(2)=0.5 δ1(j)=wF1(y0=start,y1=j,x),j=1,2i=1,δ1(1)=1,δ1(2)=0.5

  1. 递推,对 i = 2 , 3 , . . . , n i=2,3,...,n i=2,3,...,n

i = 2 , δ 2 ( l ) = m a x j { δ 1 ( j ) + w ⋅ F 2 ( j , l , x ) } δ 2 ( 1 ) = m a x { 1 + λ 2 t 2 , 0.5 + λ 4 t 4 } = 1.6 , Ψ 2 ( 1 ) = 1 δ 2 ( 2 ) = m a x { 1 + λ 1 t 1 + μ 2 s 2 , 0.5 + μ 2 s 2 } = 2.5 , Ψ 2 ( 2 ) = 1 i=2,\delta_2(l)=max_j\{\delta_1(j)+w\cdot F_2(j,l,x)\}\\ \delta_2(1)=max\{1+\lambda_2t_2,0.5+\lambda_4t_4\}=1.6,\Psi_2(1)=1\\ \delta_2(2)=max\{1+\lambda_1t_1+\mu_2s_2,0.5+\mu_2s_2\}=2.5,\Psi_2(2)=1 i=2,δ2(l)=maxj{δ1(j)+wF2(j,l,x)}δ2(1)=max{1+λ2t2,0.5+λ4t4}=1.6,Ψ2(1)=1δ2(2)=max{1+λ1t1+μ2s2,0.5+μ2s2}=2.5,Ψ2(2)=1

i = 3 , δ 3 ( l ) = m a x j { δ 2 ( j ) + w ⋅ F 3 ( j , l , x ) } δ 3 ( 1 ) = m a x { 1.6 + μ 5 s 5 , 2.5 + λ 3 t 3 + μ 3 s 3 } = 4.3 , Ψ 3 ( 1 ) = 2 δ 3 ( 2 ) = m a x { 1.6 + λ 1 t 1 + μ 4 s 4 , 2.5 + λ 5 t 5 + μ 4 s 4 } = 4.3 , Ψ 3 ( 2 ) = 1 i=3,\delta_3(l)=max_j\{\delta_2(j)+w\cdot F_3(j,l,x)\}\\ \delta_3(1)=max\{1.6+\mu_5s_5,2.5+\lambda_3t_3+\mu_3s_3\}=4.3,\Psi_3(1)=2\\ \delta_3(2)=max\{1.6+\lambda_1t_1+\mu_4s_4,2.5+\lambda_5t_5+\mu_4s_4\}=4.3,\Psi_3(2)=1 i=3,δ3(l)=maxj{δ2(j)+wF3(j,l,x)}δ3(1)=max{1.6+μ5s5,2.5+λ3t3+μ3s3}=4.3,Ψ3(1)=2δ3(2)=max{1.6+λ1t1+μ4s4,2.5+λ5t5+μ4s4}=4.3,Ψ3(2)=1

  1. 终止

m a x y ( w ⋅ F ( y , x ) ) = m a x δ 3 ( l ) = δ 3 ( 1 ) = 4.3 y 3 ∗ = a r g m a x l δ 3 ( l ) = 1 max_y(w\cdot F(y,x))=max\delta_3(l)=\delta_3(1)=4.3\\y_3^{*}=argmax_l\delta_3(l)=1 maxy(wF(y,x))=maxδ3(l)=δ3(1)=4.3y3=argmaxlδ3(l)=1

  1. 返回路径

y 2 ∗ = Ψ 3 ( y 3 ∗ = Ψ 3 ( 1 ) = 2 y 1 ∗ = Ψ 2 ( y 2 ∗ ) = Ψ 2 ( 2 ) = 1 y_2^{*}=\Psi_3(y_3^{*}=\Psi_3(1)=2\\y_1^{*}=\Psi_2(y_2^{*})=\Psi_2(2)=1 y2=Ψ3(y3=Ψ3(1)=2y1=Ψ2(y2)=Ψ2(2)=1

求得最优路径 y ∗ = ( y 1 ∗ , y 2 ∗ , . . . , y n ∗ ) = ( 1 , 2 , 1 ) y^{*}= (y_1^*,y_2^*,...,y_n^*) = (1,2,1) y=(y1,y2,...,yn)=(1,2,1)

import numpy as np
 
class CRF(object):
    '''实现条件随机场预测问题的维特比算法
    '''
    def __init__(self, V, VW, E, EW):
        '''
        :param V:是定义在节点上的特征函数,称为状态特征
        :param VW:是V对应的权值
        :param E:是定义在边上的特征函数,称为转移特征
        :param EW:是E对应的权值
        '''
        self.V  = V  #点分布表
        self.VW = VW #点权值表
        self.E  = E  #边分布表
        self.EW = EW #边权值表
        self.D  = [] #Delta表,最大非规范化概率的局部状态路径概率
        self.P  = [] #Psi表,当前状态和最优前导状态的索引表s
        self.BP = [] #BestPath,最优路径
        return 
        
    def Viterbi(self):
        '''
        条件随机场预测问题的维特比算法,此算法一定要结合CRF参数化形式对应的状态路径图来理解,更容易理解.
        '''
        self.D = np.full(shape=(np.shape(self.V)), fill_value=.0)
        self.P = np.full(shape=(np.shape(self.V)), fill_value=.0)
        for i in range(np.shape(self.V)[0]):
            #初始化
            if 0 == i:
                self.D[i] = np.multiply(self.V[i], self.VW[i])
                self.P[i] = np.array([0, 0])
                print('self.V[%d]='%i, self.V[i], 'self.VW[%d]='%i, self.VW[i], 'self.D[%d]='%i, self.D[i])
                print('self.P:', self.P)
                pass
            #递推求解布局最优状态路径
            else:
                for y in range(np.shape(self.V)[1]): #delta[i][y=1,2...]
                    for l in range(np.shape(self.V)[1]): #V[i-1][l=1,2...]
                        delta = 0.0
                        delta += self.D[i-1, l]                      #前导状态的最优状态路径的概率
                        delta += self.E[i-1][l,y]*self.EW[i-1][l,y]  #前导状态到当前状体的转移概率
                        delta += self.V[i,y]*self.VW[i,y]            #当前状态的概率
                        print('(x%d,y=%d)-->(x%d,y=%d):%.2f + %.2f + %.2f='%(i-1, l, i, y, \
                              self.D[i-1, l], \
                              self.E[i-1][l,y]*self.EW[i-1][l,y], \
                              self.V[i,y]*self.VW[i,y]), delta)
                        if 0 == l or delta > self.D[i, y]:
                            self.D[i, y] = delta
                            self.P[i, y] = l
                    print('self.D[x%d,y=%d]=%.2f\n'%(i, y, self.D[i,y]))
        print('self.Delta:\n', self.D)
        print('self.Psi:\n', self.P)
        
        #返回,得到所有的最优前导状态
        N = np.shape(self.V)[0]
        self.BP = np.full(shape=(N,), fill_value=0.0)
        t_range = -1 * np.array(sorted(-1*np.arange(N)))
        for t in t_range:
            if N-1 == t:#得到最优状态
                self.BP[t] = np.argmax(self.D[-1])
            else: #得到最优前导状态
                self.BP[t] = self.P[t+1, int(self.BP[t+1])]
        
        #最优状态路径表现在存储的是状态的下标,我们执行存储值+1转换成示例中的状态值
        #也可以不用转换,只要你能理解,self.BP中存储的0是状态1就可以~~~~
        self.BP += 1
        
        print('最优状态路径为:', self.BP)
        return self.BP
        
def CRF_manual():   
    S = np.array([[1,1],   #X1:S(Y1=1), S(Y1=2)
                  [1,1],   #X2:S(Y2=1), S(Y2=2)
                  [1,1]])  #X3:S(Y3=1), S(Y3=1)
    SW = np.array([[1.0, 0.5], #X1:SW(Y1=1), SW(Y1=2)
                   [0.8, 0.5], #X2:SW(Y2=1), SW(Y2=2)
                   [0.8, 0.5]])#X3:SW(Y3=1), SW(Y3=1)
    E = np.array([[[1, 1],  #Edge:Y1=1--->(Y2=1, Y2=2)
                   [1, 0]], #Edge:Y1=2--->(Y2=1, Y2=2)
                  [[0, 1],  #Edge:Y2=1--->(Y3=1, Y3=2) 
                   [1, 1]]])#Edge:Y2=2--->(Y3=1, Y3=2)
    EW= np.array([[[0.6, 1],  #EdgeW:Y1=1--->(Y2=1, Y2=2)
                   [1, 0.0]], #EdgeW:Y1=2--->(Y2=1, Y2=2)
                  [[0.0, 1],  #EdgeW:Y2=1--->(Y3=1, Y3=2)
                   [1, 0.2]]])#EdgeW:Y2=2--->(Y3=1, Y3=2)
    
    crf = CRF(S, SW, E, EW)
    ret = crf.Viterbi()
    print('最优状态路径为:', ret)
    return
    
if __name__=='__main__':
    CRF_manual()

输出:

self.V[0]= [1 1] self.VW[0]= [1.  0.5] self.D[0]= [1.  0.5]
self.P: [[0. 0.]
 [0. 0.]
 [0. 0.]]
(x0,y=0)-->(x1,y=0):1.00 + 0.60 + 0.80= 2.4000000000000004
(x0,y=1)-->(x1,y=0):0.50 + 1.00 + 0.80= 2.3
self.D[x1,y=0]=2.40

(x0,y=0)-->(x1,y=1):1.00 + 1.00 + 0.50= 2.5
(x0,y=1)-->(x1,y=1):0.50 + 0.00 + 0.50= 1.0
self.D[x1,y=1]=2.50

(x1,y=0)-->(x2,y=0):2.40 + 0.00 + 0.80= 3.2
(x1,y=1)-->(x2,y=0):2.50 + 1.00 + 0.80= 4.3
self.D[x2,y=0]=4.30

(x1,y=0)-->(x2,y=1):2.40 + 1.00 + 0.50= 3.9000000000000004
(x1,y=1)-->(x2,y=1):2.50 + 0.20 + 0.50= 3.2
self.D[x2,y=1]=3.90

self.Delta:
 [[1.  0.5]
 [2.4 2.5]
 [4.3 3.9]]
self.Psi:
 [[0. 0.]
 [0. 0.]
 [1. 0.]]
最优状态路径为: [1. 2. 1.]
最优状态路径为: [1. 2. 1.]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值