1. Levenshtein 距离
Levenshtein 距离,也称为编辑距离,是一种衡量两个字符串之间差异的度量方法。它表示将一个字符串转换为另一个字符串所需的最少编辑操作次数,允许的编辑操作包括插入、删除和替换字符。
1.1 Levenshtein 距离的应用:
DNA 序列分析:比较不同的 DNA 序列,找出相似性和差异。
拼写检查:用于查找与输入词最相似的正确单词。
文本挖掘和信息检索:计算文本之间的相似度,如在搜索引擎中,可用于查找相似的查询。
1.2 Levenshtein 距离的计算
对于较长的字符串,可以使用空间优化的动态规划算法。
# 安装库: 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 汉明距离的计算
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