首页 > 编程语言 >python计算余弦相似性和汉明距离

python计算余弦相似性和汉明距离

时间:2023-05-25 20:01:17浏览次数:62  
标签:编码 codes python 余弦 二进制 汉明 相似性

要使用矩阵相乘来计算7个二进制编码之间的余弦相似性,我们需要先将二进制编码转换为数值向量。对于每个二进制编码,我们可以将0映射为-1,将1映射为1,从而得到一个数值向量。然后,我们可以将这些数值向量表示为一个矩阵,并进行矩阵相乘来计算余弦相似性。

以下是一个示例代码,使用Python和NumPy库来执行此操作:

import numpy as np

# 7个二进制编码
binary_codes = [
    [0, 1, 0, 1, 1, 0, 0],
    [1, 0, 1, 0, 0, 1, 1],
    [0, 0, 1, 0, 1, 0, 1],
    [1, 1, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 1, 0],
    [0, 1, 0, 0, 1, 0, 1],
    [1, 1, 0, 1, 1, 0, 1]
]

# 将二进制编码转换为数值向量
vectorized_codes = np.array(binary_codes) * 2 - 1

# 计算余弦相似性
cosine_similarity = np.dot(vectorized_codes, vectorized_codes.T) / np.outer(np.linalg.norm(vectorized_codes, axis=1), np.linalg.norm(vectorized_codes, axis=1))

print(cosine_similarity)

上述代码将输出一个7x7的矩阵,其中每个元素[i, j]表示第i个二进制编码和第j个二进制编码之间的余弦相似性。值的范围在-1到1之间,越接近1表示相似性越高,越接近-1表示相似性越低。对角线上的元素表示每个编码与自身的相似性,因此都应该为1。

在计算余弦相似性时,我们需要比较向量之间的夹角。二进制编码是由0和1组成的序列,不包含连续的数值信息,无法直接计算向量之间的夹角。因此,我们需要将二进制编码转换为数值向量,以便进行余弦相似性的计算。

将二进制编码转换为数值向量的一种常见方法是将0映射为-1,将1映射为1。这样做的目的是为了保留二进制编码的相对性质,即将0和1分别映射到数值空间中的两个相距较远的点。通过这种映射,我们可以计算向量之间的夹角,并使用余弦相似性作为相似性度量。

请注意,该方法假设二进制编码中的0和1具有等价的重要性。如果对于特定问题,0和1具有不同的含义或重要性,可能需要采用其他的数值映射方法。

如果要使用汉明距离来比较二进制编码之间的相似性,可以直接计算编码之间的汉明距离。汉明距离是指在相同长度的两个二进制编码中,对应位置上不同的位数。

以下是一个示例代码,使用Python来计算7个二进制编码之间的汉明距离:

# 7个二进制编码
binary_codes = [
    [0, 1, 0, 1, 1, 0, 0],
    [1, 0, 1, 0, 0, 1, 1],
    [0, 0, 1, 0, 1, 0, 1],
    [1, 1, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 1, 0],
    [0, 1, 0, 0, 1, 0, 1],
    [1, 1, 0, 1, 1, 0, 1]
]

# 计算汉明距离矩阵
hamming_distance = []
for i in range(len(binary_codes)):
    row = []
    for j in range(len(binary_codes)):
        distance = sum(bit1 != bit2 for bit1, bit2 in zip(binary_codes[i], binary_codes[j]))
        row.append(distance)
    hamming_distance.append(row)

# 输出汉明距离矩阵
for row in hamming_distance:
    print(row)

 

标签:编码,codes,python,余弦,二进制,汉明,相似性
From: https://www.cnblogs.com/chentiao/p/17432708.html

相关文章

  • Python竖版大屏2 | 用pyecharts开发可视化的奇妙探索!
    目录1、SHINE主题2、LIGHT主题3、MACARONS主题4、INFOGRAPHIC主题5、WALDEN主题6、WESTEROS主题7、WHITE主题8、WONDERLAND主题你好!我是@马哥python说,一名10年程序猿,正在试错用pyecharts开发可视化大屏的非常规排版。以下,我用8种ThemeType展示的同一个可视化数据大屏,可视化主题......
  • python试题
    1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20. 程序题1    程序题2     附加题        一、选择题每题4分1.关于二进制,八进制,十进制,十六进制的表示方......
  • Python集合 (set) 的增删改查及 copy()方法
    集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:1、去重,把一个列表变成集合,就自动去重了。2、关系测试,测试两组数据之前的交集、差集、并集等关系。一、集合的创建set1=set({1,2......
  • Hello World II - python垂直输出Hello World
    描述垂直输出"HelloWorld",全部代码不超过2行。 输入无输出Hello Worldstr="HelloWorld"fornameinstr[:]:print(name)修改:开始没看到要求不超过两行,正确代码为:fornamein"HelloWorld":print(name)题目来源:python123.io......
  • Python基础之字符编码和文件类型
    字符编码什么事字符编码?什么是字符编码?人类在与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、日文字符等,而计算机只能识别二进制。所以就产生了字符编码'''字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。字符编......
  • 第一周 python基本语法 笔记
    写在前面的话:由于已经学习了c和c++,所以主要记录了与c/c++不同的地方一:基础知识1:严格缩进,单引号与双引号功能相同2:字符串的序号  字符串的序号可以用两种方式表示  -5-4-3-2-1  我喜欢编程  0  1 2 3 43:使用[]获取字符串的一个或多个字符   索引......
  • Python解数学题
    【Python解决数学问题]用Python解方程】父亲和儿子今年共有60岁,又知4年前,父亲的年龄正好是儿子的3倍,儿子今年是多少岁?1.在Mu下载第三方库2.方程在数学中是什么方程(equation)是指含有未知数的等式。是表示两个数学式(如两个数、函数、量、运算)之间相等关系的一种等式,使等式成立......
  • python基础day11
    文件内指针的移动指针移动总共有三种模式'''f.seek(3,0)f.seek(offset,whence)whence:0:默认的模式,该模式代表指针移动的字节数是以文件开头为参照的(支持tb模式)1:该模式代表指针移动的字节数是以当前所在的位置为参照的(只用于字节模式)2:该模式代表指针移动的字节数是以文件......
  • Python数值类型[转载]
    1.2数值类型从本节开始,我们快速练习Python编程基础,但是由于本教程的定位和篇幅所限,完整的编程基础内容,需要各位读者自行阅读相关书籍和教程。数值类型,说白了就是处理各种各样的数字,Python中的数值类型包括整型、长整型、布尔、双精度浮点、十进制浮点和复数,这些类型在很多方面......
  • python基础11
    文件操作模式1.如果是t模式,read(3)里面的数字代表字符个数2.如果b模式,read(3)里面代表的是字节个数3.一个字节代表一个英文字符4.一个中文字符用三个字节表示withopen('a.txt','r',encoding='utf8')asf:print(f.read(3))文件内指针的移动指针的移动有三种模式1......