序列比对(十二)——计算后验概率

本文详细阐述了如何在已知整条符号序列的情况下,通过数学推导和算法来计算序列中每个位置对应状态的后验概率。介绍了利用前向算法和后向算法的全概率,并给出公式及代码实现。
摘要由CSDN通过智能技术生成

原创: hxj7

本文介绍如何计算状态的后验概率。

前文《序列比对(十一)——计算符号序列的全概率》介绍了如何使用前向算法后向算法计算符号序列全概率。但是很多情况下我们也想了解在整条符号序列已知的情况下,某一位置符号所对应的状态的概率。也就是说要计算
在这里插入图片描述
的概率。很明显,此概率为一后验概率。
要计算上述后验概率,可以经过以下推导:
在这里插入图片描述
其中:
在这里插入图片描述在这里插入图片描述

根据公式(1),(4),(5),(6),可以重新计算后验概率:
在这里插入图片描述

公式(7)后验概率计算就简单多了。可以利用前文代码,稍加增改即可。运行效果如下:

**具体代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//#define MIN_LOG_VALUE -15
//#define SAFE_EXP(x) ((x) < MIN_LOG_VALUE ? 0 : exp(x))

typedef char State;
typedef char Result;
State state[] = {
   'F', 'L'};   // 所有的可能状态
Result result[] = {
   '1', '2', '3', '4', '5', '6'};   // 所有的可能符号
double init[] = {
   0.9, 0.1};    // 初始状态的概率向量
double emission[][6] = {
      // 发射矩阵:行对应着状态,列对应着符号
  1.0/6, 1.0/6, 1.0/6, 1.0/6, 1.0/6, 1.0/6,
  0.1, 0.1, 0.1, 0.1, 0.1, 0.5
};
double trans[][2] = {
      // 转移矩阵:行和列都是状态
  0.95, 0.05,
  0.1, 0.9
};
const int nstate = 2;
const int nresult = 6;

double** fscore;  // 前向算法的得分矩阵
double** bscore;  // 后向算法的得分矩阵
double* scale;   // 缩放因子向量
double logScaleSum;

int random(double* prob, const int n);
void randSeq(State* st, Result* res, const int n);
int getResultIndex(Result r);
void printState(State* st, const int n);
void printResult(Result* res, const int n);
double forward(Result* res, const int n);
double backward(Result* res, const int n);
double** getPostProb(const int n);

int main(void) {
   
  int i;
  int n = 5;
  State* rst;   // 一串随机状态序列
  Result* rres;  // 一串随机符号序列
  double** postProb;
  if ((rst = (State
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值