介绍汉明距离及计算示例

49 篇文章 20 订阅
42 篇文章 18 订阅

汉明距离(Hamming distance)是计算两个向量之间不同对应元素数量之和。本文介绍R、Python语言的计算过程。

汉明距离概述

汉明距离是以美国数学家理查德·汉明的名字命名的,他在1950年关于汉明码的论文中提出了该举例度量指标。它被广泛用于多个学科,如信息论、编码理论和密码学。

举例:
“karolin” 和 “kathrin” 两个字符串汉明距离为s 3 (差异字符有: r-t, o-h, l-r),

1011100 和 1001000 汉明距离为 2 (不同二进制数为: 1-0 和 1-0)

31738 和 32337 汉明距离为 3 (不同整数位: 1-2, 7-3, 和 8-7).
在这里插入图片描述

汉明距离在解决很多问题中被证明是非常有用。例如,在编码理论中它被用于错误检测和纠错码;在遗传学中它被用来衡量基因差异;在机器学习算法中用来寻找相似点或区别。

实现函数

假设有两个向量 x = [1, 2, 3, 4] ;y = [1, 2, 5, 7] .
它们之间的汉明距离为2,因为最后两个对应元素不同。

R语言的计算逻辑为:

sum(x != y)

Python的计算过程为:

# 自定义函数实现
def hammingDistance(s1, s2):
    """返回等长序列之间的汉明距离"""
    if len(s1) != len(s2):
        raise ValueError("Undefined for sequences of unequal length")
    return sum(el1 != el2 for el1, el2 in zip(s1, s2))

当然也可以使用 scipy.spatial.distance 包 hamming 函数直接计算。

示例1(二值类型)

下面示例计算两个包括二值向量之间的距离:

# R语言实现
# 创建向量
x <- c(0, 0, 1, 1, 1)
y <- c(0, 1, 1, 1, 0)
sum(x != y)

# [1] 2

Python代码实现:

from scipy.spatial.distance import hamming

x = [0, 1, 1, 1, 0, 1]
y = [0, 0, 1, 1, 0, 0]

hamming(x, y) * len(x)

# 2.0

示例2(数值类型)

数值类型向量的汉明距离:

# 创建向量
x <- c(7, 12, 14, 19, 22)
y <- c(7, 12, 16, 26, 27)

# 计算汉明距离
sum(x != y)

# [1] 3

Python代码实现:

from scipy.spatial.distance import hamming

x = [7, 12, 14, 19, 22]
y = [7, 12, 16, 26, 27]

hamming(x, y) * len(x)

# 3.0

示例3(字符串类型)

计算字符串类型汉明距离:

# 创建向量
x <- c('a', 'b', 'c', 'd')
y <- c('a', 'b', 'c', 'r')

# 计算汉明距离
sum(x != y)

# [1] 1

Python语言实现:

from scipy.spatial.distance import hamming 

# 定义数组
x = ['a', 'b', 'c', 'd']
y = ['a', 'b', 'c', 'r']

hamming(x, y) * len(x)

# 1.0

总结

本文介绍了汉明距离,并通过示例介绍R和Python语言的实现过程。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用PCL库计算二进制描述子相似度的示例代码。该代码使用ORB算法提取图像关键点,并计算二进制描述子。然后使用PCL库中的`pcl::common::getL1HammingDistance`函数计算描述子之间的汉明距离,并将距离转换为相似度。最后,根据相似度进行匹配点对的筛选和去除错误匹配。 ```c++ #include <iostream> #include <pcl/features/normal_3d.h> #include <pcl/features/shot_omp.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/common/transforms.h> #include <pcl/common/common.h> #include <pcl/common/histogram.h> using namespace std; using namespace pcl; int main(int argc, char **argv) { // 读取两张图像 Mat image1 = imread("image1.png", IMREAD_GRAYSCALE); Mat image2 = imread("image2.png", IMREAD_GRAYSCALE); // 创建ORB对象并提取关键点和二进制描述子 ORB orb; vector<KeyPoint> keypoints1, keypoints2; Mat descriptors1, descriptors2; orb(image1, noArray(), keypoints1, descriptors1); orb(image2, noArray(), keypoints2, descriptors2); // 将描述子转换为PCL库中的Histogram类型 pcl::Histogram<256> hist1, hist2; for (int i = 0; i < descriptors1.rows; i++) { hist1.histogram[descriptors1.at<uchar>(i)]++; } for (int i = 0; i < descriptors2.rows; i++) { hist2.histogram[descriptors2.at<uchar>(i)]++; } // 计算两个描述子之间的汉明距离 int hamming_distance = pcl::common::getL1HammingDistance(hist1, hist2); // 将汉明距离转换为相似度 double similarity = exp(-hamming_distance / 10.0); // 根据相似度进行匹配点对的筛选和去除错误匹配 // ... return 0; } ``` 需要注意的是,在实际应用中,可能需要对描述子之间的距离和相似度进行归一化或加权,以便更好地反映它们之间的关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值