汉明距离、汉明损失详解及代码(python)

引言

汉明距离是机器学习中的常用度量。本文整理了具体的图示+代码,帮你形象化理解汉明距离(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=0nlabels11(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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值