机器学习是时下流行AI技术中一个很重要的方向,不管是有监督学习仍是无监督学习都使用各类“度量”来获得不一样样本数据的差别度或者不一样样本数据的类似度。良好的“度量”能够显著提升算法的分类或预测的准确率,本文中将介绍机器学习中各类“度量”,“度量”主要由两种,分别为距离、类似度和相关系数,距离的研究主体通常是线性空间中点;而类似度研究主体是线性空间中向量;相关系数研究主体主要是分布数据。本文主要介绍字符串距离。算法
在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不一样字符的个数。换句话说,它就是将一个字符串变换成另一个字符串所须要替换的字符个数。机器学习
汉明重量是字符串相对于一样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来讲,就是1的个数,因此11101的汉明重量是4。例如:函数
1017101与1007001之间的汉明距离是2
9143896与9233796之间的汉明距离是3。
karolin与kathrin之间的汉明距离是3。学习
如图1给出了汉明距离几何意义,所示任意两个顶点之间的最小距离是两个二进制字符串之间的汉明距离。编码
汉明距离是以理查德·卫斯里·汉明的名字命名的,汉明在偏差检测与校订码的基础性论文中首次引入这个概念。在通讯中累计定长二进制字中发生翻转的错误数据位,因此它也被称为信号距离。汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。可是,若是要比较两个不一样长度的字符串,不只要进行替换,并且要进行插入与删除的运算,在这种场合下,一般使用更加复杂的编辑距离等算法。下面介绍另外一个经常使用的字符串距离——编辑距离。blog
编辑距离是针对二个字符串(例如英文字)的差别程度的量化量测,量测方式是看至少须要多少次的处理才能将一个字符串变成另外一个字符串,处理只包括插入一个字符、删除一个字符、新增一个字符。编辑距离能够用在天然语言处理中,例如拼写检查能够根据一个拼错的字和其余正确的字的编辑距离,判断哪个(或哪几个)是比较可能的字。如下为编辑距离的例子
"kitten" and "sitting"的编辑距离是3,这是由于:字符串
第一次处理:kitten → sitten (替换一个字符,"s" 替换了 "k")it
第二次处理:sitten → sittin (替换一个字符, "i" 替换了 "e")基础
第三次处理:sittin → sitting (插入一个字符, 字符串末尾插入了 "g").二进制
那么编辑距离如何计算了?假定函数dist(A, B)表示字串A转变到字串B的编辑距
离,那么对于下面3种极端状况,咱们很容易给出解答(NULL表示空串)。
dist(NULL, NULL) = 0
dist(NULL, s) = s的长度
dist(s, NULL) = s的长度
对于通常的状况,dist(A, B)咱们应该如何求解呢?假定咱们如今正在求解dist(A+c1, B+c2),在这里A和B是字符串,c1和c2都是字符。dist(A+c1, B+c2)也就是把"A+c1"转变成"B+c2"。在这个转变过称中,咱们要分状况讨论:
(1) A能够直接转变成B。这时咱们只要把c1转成c2就能够了(若是c1 != c2)。
(2) A+c1能够直接转变成B。这时咱们处理的方式是插入c2。
(3) A能够直接转成B+c2。这时的状况是咱们须要删除c1。
综合上面三种状况,dist(A+c1, B+c2)应该是三者的最小值。所以咱们能够定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。显然能够有以下动态规划公式:
if i = 0 且 j = 0,edit(i, j) = 0
if i = 0 且 j > 0,edit(i, j) = j
if i > 0 且j =0,edit(i, j) = i
if i ≥ 1 且 j ≥ 1, 若A第i个字符等于B第j个字符edit(i, j)=min{edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1)};不然edit(i, j)=min{edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + 1}。
结合"kitten" and "sitting"可得图2编辑距离矩阵,矩阵右下角数值就是两个字符串编辑距离。