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

1. Levenshtein 距离

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

Levenshtein 距离公式

1.1 Levenshtein 距离的应用:

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

1.2 Levenshtein 距离的计算

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

# 安装库: pip install python-Levenshtein

def 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,否则为 1
            if s[i - 1] == t[j - 1]:
                substitution_cost = 0
            else:
                substitution_cost = 1
            d[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 Levenshtein

s = "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 汉明距离的计算

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))  
# 2

seq1 = "ATACGTAC"
seq2 = "ATGCCTGC"
print(hamming_distance(seq1, seq2))  
# 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信与基因组学

每一份鼓励是我坚持下去动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值