引言
汉明距离是机器学习中的常用度量。本文整理了具体的图示+代码,帮你形象化理解汉明距离(Hamming distance)、汉明损失(Hamming loss)。
汉明距离(Hamming distance)
定义:两个等长的符号串之间的汉明距离是对应符号不同的位置个数。
汉明距离是用于测量两个序列之间的编辑距离的几个字符串度量之一。它以美国数学家理查德·海明命名。
比如例子中第一行,符号不同的位置是"rol"和"thr",即符号不同位置有3个,汉明距离为3。
代码示例
用python计算两个字符串之间的汉明距离:
# 写法一:
def hamming_distance(string1, string2):
dist_counter = 0
for n in range(len(string1)):
if string1[n] != string2[n]:
dist_counter += 1
return dist_counter
# 写法二:或者采用更短的表达式
sum(xi != yi for xi, yi in zip(x, y))
汉明损失(Hamming loss)
汉明损失是错误预测的标签比例,用于度量两个样本之间的汉明距离。
L H a m m i n g ( y , y ^ ) = 1 n labels ∑ j = 0 n labels − 1 1 ( y ^ j ≠ y j ) L_{Hamming}(y, \hat{y}) = \frac{1}{n_\text{labels}} \sum_{j=0}^{n_\text{labels} - 1} 1(\hat{y}_j \not= y_j) LHamming(y,y^)=nlabels1j=0∑nlabels−11(y^j=yj)
从公式可以看出,汉明损失即在前一节的汉明距离基础上进行归一化,得到一个在0~1区间的损失值。
代码示例
调用 sklearn.metrics
中的 hamming_loss
进行计算:
sklearn.metrics.hamming_loss(y_true, y_pred, *, sample_weight=None)
>>> from sklearn.metrics import hamming_loss
>>> y_pred = [1, 2, 3, 4]
>>> y_true = [2, 2, 3, 4]
>>> hamming_loss(y_true, y_pred)
0.25
y_true, y_pred只有第一个位置不同,1/4=0.25。
如果评估的是多分类情况:
>>> import numpy as np
>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))
0.75
需要注意的是:
在多分类问题中,当normalize参数设置为True时,汉明损失对应于y_true和y_pred之间的汉明距离,相当于0-1损失 (zero one loss),是一种精确匹配(exact match)。 0-1损失认为:如果给定样本中的所有数值不完全匹配真实的标签,则认为这个样本不正确。例如下图,有三个样本不完全匹配,就是3/5=0.6。
在多标签问题中,汉明损失不同于0-1损失。在多标签问题中,汉明损失更宽容,因为它只惩罚个别标签。比如下图中,有三个样本中的4个字符位置不同,就是4/(4*5)=0.2。
通过这两个图可以看出,多标签问题的汉明损失会比0/1损失更宽松(0.2<0.6),惩罚力度更小。
参考链接
ACM Multi-label Classification Tutorial
https://en.wikipedia.org/wiki/Hamming_distance
https://scikit-learn.org/stable/modules/model_evaluation.html#hamming-loss
http://www.manongjc.com/detail/30-emspeytwauwwdai.html