前向/后向算法&&维特比算法

本文通过具体的代码示例介绍了前向/后向算法及维特比算法的基本实现过程,这两种算法广泛应用于隐马尔可夫模型中,分别用于计算观察序列的概率和寻找最有可能的状态序列。

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

前向/后向算法:

#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
double dp[5][5];
double A[3][3]={0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5};
double B[3][2]={0.5,0.5,0.4,0.6,0.7,0.3};
double pi[3]={0.2,0.4,0.4};
int C[3]={0,1,0};
int main(){
    int i,j,k;
    double ans;
    memset(dp,0,sizeof(dp));
    dp[0][0]=pi[0]*B[0][C[0]];
    dp[0][1]=pi[1]*B[1][C[0]];
    dp[0][2]=pi[2]*B[2][C[0]];
    for(i=1;i<3;i++){
        for(j=0;j<3;j++){
            for(k=0;k<3;k++)
            dp[i][j]+=(dp[i-1][k]*A[k][j]*B[j][C[i]]);
        }
    }

//
//    for(i=0;i<2;i++){
//        for(j=0;j<3;j++){
//            for(k=0;k<3;k++){
//                dp[i+1][j]+=(dp[i][k]*A[k][j]*B[j][C[i+1]]);
//            }
//        }
//    }
    ans=dp[2][0]+dp[2][1]+dp[2][2];
    printf("%.6lf\n",ans);
    return 0;
}

维特比算法:

#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
double dp[5][5];
double A[3][3]={0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5};
double B[3][2]={0.5,0.5,0.4,0.6,0.7,0.3};
double pi[3]={0.2,0.4,0.4};
int C[3]={0,1,0};
int pre[5][5];
void dfs(int u,int v){
    if(u<0)
    return;
    dfs(u-1,pre[u][v]);
    printf("%d ",v);
}
int main(){                                     //就是概率dp求个max,然后记录一下前驱
    int i,j,k;                                  //例子是<统计学习方法> p186 例10.3
    double ans,tmp;
    memset(dp,0,sizeof(dp));
    memset(pre,-1,sizeof(pre));
    dp[0][0]=pi[0]*B[0][C[0]];
    dp[0][1]=pi[1]*B[1][C[0]];
    dp[0][2]=pi[2]*B[2][C[0]];
    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            for(k=0;k<3;k++){
                tmp=dp[i][k]*A[k][j]*B[j][C[i+1]];
                if(tmp>dp[i+1][j]){
                    dp[i+1][j]=tmp;
                    pre[i+1][j]=k;
                }
            }
        }
    }
    ans=max(dp[2][0],max(dp[2][1],dp[2][2]));
    printf("%.6lf\n",ans);
    for(i=0;i<3;i++){
        if(dp[2][i]==ans){
            dfs(2,i);
            break;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值