【生信算法】利用HMM纠正测序错误(Viterbi算法的python实现)

article/2025/9/12 10:27:07

利用HMM纠正测序错误(Viterbi算法的python实现)

问题背景

对两个纯系个体M和Z的二倍体后代进行约~0.05x的低覆盖度测序,以期获得后代个体的基因型,即后代中哪些片段分别来源于M和Z。已知:

  1. 后代中基因型为MM、MZ(杂合)和ZZ的比例是0.4:0.2:0.4;(初始概率)

  2. 直接通过测序结果判断单个位点的基因型的错误率为3%;(输出概率)

  3. 测序获得的M和Z之间的多态性位点相互之间距离恰好一致,重组率均为0.01。(转移概率)

有一个后代的一段染色体,测序获得的109个位点的基因型依次为:

1111111011111101111111000000001000000001000001000000000000001011001010101010111111101111111111101111111011111

其中1表示MM,0表示ZZ。由于低覆盖度测序,杂合位点只能测到其中一个等位基因,因此表现为MM或ZZ。

请构建隐马科夫模型,并推断这段序列各位点真正的基因型。

参考结果:

1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111

其中1表示MM,0表示ZZ,2表示MZ(杂合)。
在这里插入图片描述

五大参数说明

状态集

MMMZZZ
120

观测集

mz
10

初始分布

MMMZZZ
0.40.20.4

状态转移概率矩阵

重组率表示重组型配子占总配子数的比例,MM→MZ和MM→ZZ加起来应为重组率。
二者在重组类型中的比例则是通过初始分布得到的,即MM:MZ:ZZ=2:1:2。
故相较于论文中转移概率矩阵,调整后如下:

MMMZZZ
MM 1 − R 1-R 1R R 3 \frac{R}{3} 3R 2 R 3 \frac{2R}{3} 32R
MZ R 2 \frac{R}{2} 2R 1 − R 1-R 1R R 2 \frac{R}{2} 2R
ZZ 2 R 3 \frac{2R}{3} 32R R 3 \frac{R}{3} 3R 1 − R 1-R 1R

https://doi.org/10.1073/pnas.1005931107

输出概率矩阵

zm
MM E E E 1 − E 1-E 1E
MZ 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21
ZZ 1 − E 1-E 1E E E E

代码实现

参数设置

import numpy as np# 转移概率矩阵
A = [[0.99, 0.02 / 3, 0.01 / 3],[0.01 / 2, 0.99, 0.01 / 2],[0.02 / 3, 0.01 / 3, 0.99]]
# 行列为 MM MZ ZZ
# 输出概率矩阵
B = [[0.03, 0.97],[0.5, 0.5],[0.97, 0.03]]
# 行为 MM MZ ZZ, 列为 z m
# 初始状态分布
initp = [0.4, 0.2, 0.4]
# 对应着 MM MZ ZZ
# 状态数和状态名
S = 3
S_name = ['1', '2', '0']
# 观察序列
Y = '1111111011111101111111000000001000000001000001000000000000001011001010101010111111101111111111101111111011111'

viterbi实现

# viterbi实现
# 向前计算
Probability = []
Position = []
Position.append([0, 0, 0])
first = []
for i in range(len(initp)):first.append(initp[i] * B[i][int(Y[i])])Probability.append(first)
for i in range(1, len(Y)):ProbabilityTemp = []  # 用来存放每一层观察值对应的三种状态概率值GetPosition = []for j in range(S):ProbabilityTemp.append((np.max(np.array(Probability[i - 1]) * np.array(A[j]))) * B[j][int(Y[i])])GetPosition.append(np.argmax(np.array(Probability[i - 1]) * np.array(A[j])))Probability.append(ProbabilityTemp)Position.append(GetPosition)
traceback_idx = np.argmax(np.array(Probability[-1]))
path = [S_name[traceback_idx]]for i in range(len(Y) - 2, -1, -1):path.append(S_name[traceback_idx])traceback_idx = Position[i][traceback_idx]
print('程序输出如下:')
print((''.join(path))[::-1])
print('参考答案如下:')
print('1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111')
程序输出如下:
1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111
参考答案如下:
1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111

http://chatgpt.dhexx.cn/article/fYdK8p30.shtml

相关文章

Viterbi算法实现中文分词和词性标注

Viterbi算法 目标过程词典分词统计分词词性标注 附录附录二附录三 源码地址 目标 实现基于词典的分词方法和统计分词方法对分词结果进行词性标注对分词及词性标注结果进行评价,包括4个指标:正确率、召回率、F1值和效率 过程 词典分词 基于词典的分词…

viterbi 算法与python实现

Viterbi算法 (部分内容转自知乎:《如何通俗地讲解 viterbi 算法?》) 1、问题描述 如下如所示,如何快速找到从 S 到 E 的最短路径? 一:遍历穷举法,可行,但速度太慢&am…

维特比算法(viterbi)原理以及简单实现

维特比算法 看一下维基百科的解释,维特比算法(Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径——隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。 通俗易懂的解释知乎…

flask中jsonify遇到的坑

1.jsonify可以将字典转换成json对象传入前端 data {"movie": movie_list,"page": page,"dic_list": dic,"total_page": total_page}>>坑1 字典的值不能为range(x,x),上图dic就是像range(x,x),会报错 …

flask中的jsonify返回的是乱码

用flask返回json时遇到了返回字符串支持中文显示的问题,在web端显示的是utf-8的编码如图; 虽然不影响接口的读取,但是可读性太差,于是研究了一下怎么直接显示成中文。最后找到了解决方案如下,在配置中加入下面一行代码就OK了。 …

request jsonify

python的flask框架为用户提供了直接返回包含json格式数据响应的方法,即jsonify,在开发中会经常用到。如下一段简单的flask后端代码,服务端视图函数根据请求参数返回json格式的数据到客户端。 转载于:https://www.cnblogs.com/daqingzi/p/9018…

Flask使用json或jsonify返回响应的数据

前言 在做网站前后端数据交互的时候,我们经常需要使用Ajax等方法向后端发送请求来获取响应的数据,而我们经常需要的就是json格式的响应数据,它实际上就是一个字符串。要知道Flask如何返回json响应数据,首先就需要知道如何将字典di…

Flask 学习-8. jsonify返回中文没正常显示问题

前言 Flask 接口返回的json 格式数据有中文的时候,默认是以ASCII码 返回的,没正常显示中文。 jsonify 返回 json 数据 函数直接返回dict 数据 或返回jsonfy() 函数处理的数据,都是以json格式返回的 from flask import Flask, jsonify fro…

flask jsonify之序列化时的default函数、jsonify序列化自定义对象

目录 1.看源码 2、重写默认的default函数,实现自己的序列化机制 3、把对象转化成字典 3.1 __dict__的方式 3.2、定义keys和__getitem__的方式 4、最终的代码实现 5、关于default函数的其他知识 1.看源码 打开site-package,flask,json…

Flask | 解决jsonify返回中文乱码问题

在采用 return jsonify(data) 返回内容中含有中文时,前端接收数据出现中文乱码问题,乱码格式如下(仅中文为ASCII码): 故在此记录下该问题的解决方式,以作后期参考: 在定义Flask app时&#xff…

jsonify返回中文编码的问题

app.config[JSON_AS_ASCII]Flase 在它下面加上上面的代码就欧克了 没加之前或者为True: 加了之后:

flask学习二(jsonify)

示例一: 实现动态路由,代码如下 # coding:utf-8 from flask import Flask from flask import jsonify # 创建对象 app Flask(__name__)users_list {"1001":["123","张三",19],"1002":["234","…

flask中jsonify和json区别

一 JSON数据结构 要把json与字典区分开来 dumps(字典转换成Json) loads(Json转换成字典) Python 的字典是一种数据结构,JSON 是一种数据格式。 json 就是一个根据某种约定格式编写的纯字符串,不具备任何数据结构的特征。而 python 的字典…

关于flask入门教程-记录集转jsonify

Flask 框架里,可以用 jsonify 返回 json 数据,但是为什么不用 Python 自带的 json 模块返回 JSON 数据呢? 其实两者是差不多的,jsonify指明了Content-Type 是 application/json , 这样做是符合 HTTP 协议的规定的&…

Flask 的 jsonify 理解

文章目录 python 代码解决原因Content-Type的区别 python 代码 # -*- coding:utf-8 -*- from flask import Flask, jsonifyapp Flask(__name__)urls [{id: 1,title: python,description: https://www.python.org/},{id: 2,title: flask,description: https://flask.palletsp…

Flask中jsonify和json.dumps用法以及区别(简单案例)

环境:python3.6, Flask1.0.3 flask提供了jsonify函数供用户处理返回的序列化json数据, 而python自带的json库中也有dumps方法可以序列化json对象. 其二者的区别,写个简单的案例实测一下便见分晓。 from flask import Flask from flask im…

const常量函数详解

在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。 const常量与指针 const int *p1与const int *p2的顺序不同,但是他们指向的值都不能改变,上述代码说明虽然指向的值不能…

C++const函数的运用:深度解析const函数的魅力

C 深度解析const函数的魅力 1. C const函数的基本概念(Basic Concepts of const Functions in C)1.1 const函数的定义与特性(Definition and Characteristics of const Functions)1.2 const函数的使用场景(Usage Scena…

const 用法

const 用法 const 修饰变量,这个变量被称为常变量,不能被修改,但本质上还是一个变量 #通过指针改变num的值 int main() {int num 10;int* p #*p 20;printf("%d ", num);return 0; }#这里num被 const修饰本来不能被修改…

const成员函数

const成员函数 const修饰成员函数的时候,const需要放在成员函数的后面,不能放在一开始,如果放在一开始的话,那么const其实是在修饰成员函数的返回值,而不是在修饰成员函数了 const成员函数中不能修改成员变量 普通成员…