生信算法10 - Levenshtein距离与汉明距离比对序列差异

devtools/2025/1/12 19:52:07/

1. Levenshtein 距离

Levenshtein 距离,也称为编辑距离,是一种衡量两个字符串之间差异的度量方法。它表示将一个字符串转换为另一个字符串所需的最少编辑操作次数,允许的编辑操作包括插入、删除和替换字符

Levenshtein 距离公式

1.1 Levenshtein 距离的应用:

DNA 序列分析:比较不同的 DNA 序列,找出相似性和差异。
拼写检查:用于查找与输入词最相似的正确单词。
文本挖掘和信息检索:计算文本之间的相似度,如在搜索引擎中,可用于查找相似的查询。

1.2 Levenshtein 距离的计算

对于较长的字符串,可以使用空间优化的动态规划算法

python"># 安装库: pip install python-Levenshteindef levenshtein_distance(s, t):# 计算2个输入字符串的Levenshtein距离算法m = len(s)n = len(t)# 创建一个 (m + 1) x (n + 1) 的零矩阵,用于存储中间结果d = np.zeros((m + 1, n + 1))# 初始化第一列for i in range(m + 1):d[i, 0] = i# 初始化第一行for j in range(n + 1):d[0, j] = j# 填充矩阵for j in range(1, n + 1):for i in range(1, m + 1):# substitution_cost 表示替换操作的代价,如果当前字符相等则为 0,否则为 1if s[i - 1] == t[j - 1]:substitution_cost = 0else:substitution_cost = 1d[i, j] = min(d[i - 1, j] + 1,  # 删除操作d[i, j - 1] + 1,  # 插入操作d[i - 1, j - 1] + substitution_cost)  # 替换操作return d[m, n]# 测试
s = "ATACGTAC"
t = "ATGCCTG"
distance = levenshtein_distance(s, t)
print(f"Levenshtein 距离 between '{s}' and '{t}' is {distance}")
# Levenshtein 距离 between 'ATACGTAC' and 'ATGCCTG' is 4.0########### 直接调用库函数计算 ################
import Levenshteins = "ATACGTAC"
t = "ATGCCTG"
distance = Levenshtein.distance(s, t)
print(f"Levenshtein 距离 between '{s}' and '{t}' is {distance}")

2. 汉明距离(Hamming distance)

汉明距离是信息论中的一个概念,在多个领域都有广泛应用,指两个等长字符串在对应位置上不同字符的数目

例如,字符串 “1011101” 与 “1001001” 的汉明距离为 2,因为它们在第 3 位和第 5 位上的字符不同。对于二进制字符串,汉明距离等于将一个字符串变换成另一个字符串所需要的最小替换次数。

2.1 汉明距离的应用

序列比较: 用于比较 DNA 序列、蛋白质序列等生物分子序列的相似性。汉明距离越小,说明两个序列的相似性越高,可能具有相似的结构和功能。

信息编码与纠错: 在数据传输和存储中,通过计算汉明距离可以检测和纠正错误。例如,在汉明码中,利用汉明距离的特性对数据进行编码,使得接收端能够根据汉明距离判断是否存在错误,并进行纠错。

模式识别与机器学习: 在分类和聚类算法中,汉明距离可作为衡量样本之间差异的一种度量方式,帮助进行数据分类和聚类分析。例如,在 K 近邻算法中,可以使用汉明距离来确定样本之间的距离,从而进行分类或回归预测。

2.2 汉明距离的计算

python">def hamming_distance(str1, str2):if len(str1)!= len(str2):raise ValueError("两个字符串长度必须相等")return sum(c1!= c2 for c1, c2 in zip(str1, str2))str1 = "1011101"
str2 = "1001001"
print(hamming_distance(str1, str2))  
# 2seq1 = "ATACGTAC"
seq2 = "ATGCCTGC"
print(hamming_distance(seq1, seq2))  
# 3

http://www.ppmy.cn/devtools/149959.html

相关文章

[Qt] 多元素控件 | 容器类控件 | 布局管理器layout

目录 一.多元素控件 1、List Widget 【使用 ListWidget】 2、Table Widget 【使用 QTableWidget】 3、Tree Widget 【使用 QTreeWidget】 二、容器类控件 1、Group Box 【给麦当劳案例加上分组框】 2、Tab Widget 【使用标签页管理多组控件】 三、布局管理器 1、…

docker--小白--导入timescaledb

先安装好docker,确保docker 可正常访问,可参考上一篇文章 安装镜像 sudo docker pull timescale/timescaledb:latest-pg13 如果出现以下错误,应该是权限问题 从本地文件加载镜像或容器,timescaledb是从docker中导出来的 cat /home/t606/time…

《解锁数据科学的魔法盒子:JupyterLab 全面解析》

《解锁数据科学的魔法盒子:JupyterLab 全面解析》 一、JupyterLab 是什么?二、JupyterLab 的核心特性(一)交互模式:即时反馈的代码调试利器(二)内核支持的文档:多语言代码执行的舞台…

Python 教程 - 基本语句

Python 教程 - 基本语句 条件语句循环语句for 循环while 循环breakcontinue pass 语句 条件语句 在进行逻辑判断时,我们需要用到条件语句,Python 提供了 if、elif、else 来进行逻辑判断。格式如下所示: if 判断条件1:执行语句1... elif 判断…

spark functions函数合集(无示例)

ctrlF进行页面查找 没有示例,仅用于查询,具体用法自行搜索 函数名称作用avg计算指定列的平均值count计算指定列或所有行的数量countDistinct计算指定列中不同值的数量corr计算两个列之间的相关系数covar_pop计算两个列之间的总体协方差covar_samp计算两…

springboot整合mysql

1.首先在pom.xml中添加依赖&#xff1a; <!-- MySQL Driver --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- Druid连接池 -->…

c语言提供后端,提供页面显示跳转服务

后端代码: #define SERVER_IP_ADDR "0.0.0.0" // 服务器IP地址 #define SERVER_PORT 8080 // 服务器端口号 #define BACKLOG 10 #define BUF_SIZE 8192 #define OK 1 #define ERROR 0#include <stdio.h> #include <stdlib.h> #include <st…

2025年第三届“华数杯”国际赛A题解题思路与代码(Python版)

游泳竞技策略优化模型代码详解 第一题&#xff1a;速度优化模型 在这一部分&#xff0c;我们将详细解析如何通过数学建模来优化游泳运动员在不同距离比赛中的速度分配策略。 1. 模型概述 我们的模型主要包含三个核心文件&#xff1a; speed_optimization.py: 速度优化的核…