Press "Enter" to skip to content

【机器学习】最大熵马尔科夫模型

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

本文介绍了最大熵马尔可夫模型,在隐马尔可夫模型(隐状态序列)的基础上应用最大熵模型思想,将一个概率生成模型转化为概率判别模型,同样最大熵马尔可夫模型带解决的三个问题:1)概率计算,2)参数学习,3)序列预测,其中概率计算与参数学习类比于最大熵模型,序列标注采用维特比解码。

 

作者 | 文杰

 

编辑 | yuquanle

 

最大熵马尔科夫模型

 

有最大熵模型和隐马尔可夫模型的基础,再看最大熵马尔科夫模型就直观多了。在隐马尔可夫模型中:

 

即与之间独立作用。在最大熵马尔科夫模型中则没有这一假设,而直接采用条件概率的形式输出模型。

 

 

结合最大熵模型,不考虑整个序列时,第时刻的状态可以看作是一个分类问题,采用最大熵模型,由和,构成分类模型,有最大熵模型的结论,我们知道分类模型是一个关于的函数,表达式如下:

 

其中是联合标签特征模板,是特征模板的权重,是联合所有可能的标签特征模板求和,表示归一化因子。对于参数的求解,可以采用最大熵模型的使用的优化算法,但是值得注意的是,在优化求解过程中,每个时刻单独归一化,不考虑序列性。

 

这里,由于笔者之前的误解,对于最大熵模型的特征模板的概率求解采用最大似然估计的方式直接对特征模板进行统计,以其频率作为概率,结果发现还是有效。其中原因可能是我的这种统计方式是基于期望最大化的思想,运用最大似然估计得到模型参数正好是统计频率。

 

在状态预测中,考虑最大化整个序列的概率,意味着目标函数如下:

 

目标函数也就是求解一条最优的状态转移路径,同样可以采用Viterbi算法。

 

代码实战

 

A、最大熵模型维特比算法

 

int Viterbi_M(const DataStr &testdata)

{

int t,i,j,k;

int pos;

double deta[VEC_LEN][STATE];

int fai[VEC_LEN][STATE];

double max_deta;

double max_fai;

int max_i;

for(i=0; i<STATE; i++)

{

pos=getPos(testdata[0][0]);

deta[0][i]=dicos_m.ps0[i]*dicos_m.pos[pos][i];

fai[0][i]=0;

}

for(k=0; k<testdata.size(); k++)

{

for(t=1; t<testdata[k].size(); t++)

{

for(i=0; i<STATE; i++)

{

max_deta=double_min;

max_fai=double_min;

for(j=0; j<STATE; j++)

{

pos=getPos(testdata[k][t]);

if(deta[t-1][j]*dicos_m.pss[j][i]*dicos_m.pos[pos][i]>max_deta)

{

max_deta=deta[t-1][j]*dicos_m.pss[j][i]*dicos_m.pos[pos][i];

}

if(deta[t-1][j]*dicos_m.pss[j][i]>max_fai)

{

max_fai=deta[t-1][j]*dicos_m.pss[j][i];

max_i=j;

}

}

deta[t][i]=max_deta;

fai[t][i]=max_i;

}

}

max_deta=double_min;

for(i=0; i<STATE; i++)

{

if(deta[testdata[k].size()-1][i]>max_deta)

{

max_deta=deta[testdata[k].size()-1][i];

max_i=i;

}

}

cout<<max_i;

for(t=testdata[k].size()-2; t>=0; t–)

{

max_deta=double_min;

cout<<fai[t+1][max_i];

for(i=0; i<STATE; i++)

{

if(deta[t][i]>max_deta)

{

max_deta=deta[t][i];

max_i=i;

}

}

}

cout<<endl;

}

}


 

 

 

The End

 

本文转载自公众号:

AI小白入门,作者文杰

 

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注