计算样本之间的相似度

news2025/1/11 10:01:26

文章目录

  • 前言
  • 一、距离度量
    • 1.1 欧几里得距离(Euclidean Distance)
    • 1.2 曼哈顿距离(Manhattan Distance)
    • 1.3 切比雪夫距离(Chebyshev Distance)
    • 1.4 闵可夫斯基距离(Minkowski Distance)
    • 1.5 余弦距离(Cosine Distance)
    • 代码演示
    • 总结
  • 二、相似度度量
    • 2.1 余弦相似度(Cosine Similarity)
    • 2.2 皮尔逊相关系数(Pearson Correlation Coefficient)
    • 2.3 杰卡德相似系数(Jaccard Similarity Coefficient)
    • 2.4 汉明距离(Hamming Distance)
    • 2.5 相关距离(Correlation Distance)
    • 代码演示
    • 总结


前言

计算样本之间的相似度通常可以通过计算样本之间的距离来实现,尽管这不是唯一的方法。距离度量和相似度度量是两个相关但不同的概念。距离度量通常用于表示样本之间的不相似程度,而相似度度量则用于表示样本之间的相似程度

一、距离度量

1.1 欧几里得距离(Euclidean Distance)

欧氏距离是两个点在 n 维空间中直线距离的度量。它是最常见的距离度量方法之一,用于计算两个向量之间的距离。

1.2 曼哈顿距离(Manhattan Distance)

曼哈顿距离,又称为城市街区距离,是指两个点在 n 维空间中各个坐标轴上的距离之和。

1.3 切比雪夫距离(Chebyshev Distance)

切比雪夫距离,又称为棋盘距离,是指两个点在 n 维空间中各个坐标轴上的最大距离。

1.4 闵可夫斯基距离(Minkowski Distance)

闵可夫斯基距离是欧氏距离和曼哈顿距离的广义形式,通过调整参数 𝑝,可以得到不同的距离度量。在这里插入图片描述

1.5 余弦距离(Cosine Distance)

通过计算两个样本点之间夹角的余弦值的补值来衡量相似度。

代码演示

import numpy as np
from sklearn.metrics.pairwise import euclidean_distances, manhattan_distances
from scipy.spatial.distance import chebyshev, minkowski, cosine

# 示例向量
vector1 = np.array([1.2, 2.3, 3.4, 4.5])
vector2 = np.array([4.1, 5.2, 6.3, 7.4])

# 欧几里得距离
euclidean_dist = euclidean_distances([vector1], [vector2])
print(f'Euclidean Distance: {euclidean_dist[0][0]}')

# 曼哈顿距离
manhattan_dist = manhattan_distances([vector1], [vector2])
print(f'Manhattan Distance: {manhattan_dist[0][0]}')

# 切比雪夫距离
chebyshev_dist = chebyshev(vector1, vector2)
print(f'Chebyshev Distance: {chebyshev_dist}')

# 闵可夫斯基距离(p=3)
minkowski_dist = minkowski(vector1, vector2, p=3)
print(f'Minkowski Distance (p=3): {minkowski_dist}')

# 余弦相似度
cosine_dist = cosine(vector1, vector2)
print(f'Cosine Distance: {cosine_dist}')

总结

在距离度量的五种方法中,欧几里得距离(Euclidean Distance)、曼哈顿距离(Manhattan Distance)、余弦距离 是最常用的三种。
欧几里得距离:适用于低维和中维数据,广泛用于各种机器学习算法。(低维通常在1-10维之间,中维在10—100之间)
曼哈顿距离:适用于高维数据,尤其是特征独立时。(高维>100维)
余弦距离:适用于高维稀疏数据,特别是文本数据和推荐系统。

二、相似度度量

2.1 余弦相似度(Cosine Similarity)

衡量两个向量的方向相似度,而不关注它们的大小。

2.2 皮尔逊相关系数(Pearson Correlation Coefficient)

衡量两个变量之间的线性相关性。

2.3 杰卡德相似系数(Jaccard Similarity Coefficient)

衡量两个集合的交集与并集的比值,常用于文本或集合相似度。

2.4 汉明距离(Hamming Distance)

计算两个样本在相同位置上不同元素的数量,常用于二进制数据。

2.5 相关距离(Correlation Distance)

计算两个变量之间的相关性,反映了两个向量在统计上的相似程度,是皮尔逊相关系数的补数。

代码演示

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from scipy.spatial.distance import correlation, jaccard, hamming
from scipy.stats import pearsonr

# 示例向量
vector1 = np.array([1.2, 2.3, 3.4, 4.5])
vector2 = np.array([4.1, 5.2, 6.3, 7.4])

# 1. 余弦相似度(Cosine Similarity)
cosine_sim = cosine_similarity([vector1], [vector2])
print(f'Cosine Similarity: {cosine_sim[0][0]}')

# 2. 皮尔逊相关系数(Pearson Correlation Coefficient)
pearson_corr, _ = pearsonr(vector1, vector2)
print(f'Pearson Correlation Coefficient: {pearson_corr}')

# 3. 杰卡德相似系数(Jaccard Similarity Coefficient)
# 将向量转为布尔型(示例中使用大于2的值作为示例)
vector1_bool = vector1 > 2
vector2_bool = vector2 > 2
jaccard_sim = 1 - jaccard(vector1_bool, vector2_bool)
print(f'Jaccard Similarity Coefficient: {jaccard_sim}')

# 4. 汉明距离(Hamming Distance)
# 这里的计算汉明距离先计算不相似度,再计算相似度
hamming_dist = hamming(vector1_bool, vector2_bool)
print(f'Hamming Distance: {hamming_dist}')
hamming_sim = 1 - hamming_dist
print(f'Hamming Similarity: {hamming_sim}')

# 5. 相关距离(Correlation Distance)
# 这里的计算相关距离先计算不相似度,再计算相似度
correlation_dist = correlation(vector1, vector2)
correlation_sim = 1 - correlation_dist
print(f'Correlation Similarity: {correlation_sim}')

总结

在相似度度量的五种常见方法中,余弦相似度(Cosine Similarity) 和 皮尔逊相关系数(Pearson Correlation Coefficient) 是最常用的两种。
余弦相似度:适用于高维稀疏数据,如文本数据和推荐系统。
皮尔逊相关系数:适用于数值数据,衡量线性相关性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024世界人工智能大会,神仙打架

B站:啥都会一点的研究生公众号:啥都会一点的研究生 AI圈最近又发生了啥新鲜事? 该栏目以周更频率总结国内外前沿AI动态,感兴趣的可以点击订阅合集以及时收到最新推送 B站首秀世界人工智能大会,展示自研AI技术与AIGC…

springboot配置扫描生效顺序

文章目录 举例分析项目结构如下noddles-user-backend 两个配置文件noddles-user-job 配置文件noddles-user-server 配置文件问题:server和Job启动时对应加载的数据库配置为哪一个? 总结 在微服务架构中,backend模块会定义一个基础的配置文件,…

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫:Scrapy框架的全面解析 一、引言 在当今互联网的时代,数据是最重要的资源之一。为了获取这些数据,我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言,拥有许多用于网络爬虫的工具和库…

永磁同步电机无速度算法--滑模观测器(反正切、反余弦)

一、原理介绍 在永磁同步电机滑模观测器控制中,转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是:利用永磁同步电机的电压、电流信息,通过永磁同步电机数学模型,估算出电机在两相静止坐标系中的反电动势信…

鸿蒙NEXT不再支持安卓这条路真的走的通吗?

前言 看到高赞又是一片嘲讽,“apk换种打包方式”等等轻松拿几百赞,我也是无语。 国内多家互联网大厂都已经启动HarmonyOS Next应用开发,预计明年正式上线,如今业内很多人都已经知道了。 网络上相关报道也有很多,新浪…

[数据结构] 归并排序快速排序 及非递归实现

()标题:[数据结构] 归并排序&&快速排序 及非递归实现 水墨不写bug (图片来源于网络) 目录 (一)快速排序 类比递归谋划非递归 快速排序的非递归实现: (二)归并排序 归…

antdesignvue对话框用户可移动并缩放

原贴 轻松搞定Ant Design Modal对话框拖拽缩放 - ByteZoneX社区https://www.bytezonex.com/archives/IFRuoJhd.html Ant Design 模态对话框:实现拖拽缩放功能 **子 Ant Design 是一个流行的前端 UI 框架,提供了一系列实用的组件,包括模态对…

数据结构——二叉树相关题目

1.寻找二叉树中数值为x的节点 //寻找二叉树中数值为x的节点 BTNode* TreeFind(BTNode* root, BTDataType x)//传过来二叉树的地址和根的地址,以及需要查找的数据 {if (root Null){return Null;}//首先需要先判断这个树是否为空,如果为空直接返回空if (…

Linux下fcitx框架输入法输入中文标点时为半角(英文)标点符号的解决

目录 引入解决1.打开fcitx设置2.打开全局配置3. 随便找个可以输入地方敲下快捷键 总结 本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。 因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修…

RNN 交叉熵

RNN善于处理时序 序列数据 简单RNN 展开就是 LSTM 遗忘门f_t决定上期记忆保留多少 隐藏层 在神经网络中,隐藏层指的是除了输入层和输出层之外的层,它们的输出不会直接用于网络的最终输出,而是作为中间步骤用于提取和转换数据。因此&#x…

构件软件开发-系统架构师(二十五)

1、一路和二路公交车都将在10分钟随机到达同一车站,他们相隔四分钟的概率是()。 A0.36 B0.48 C0.64 D0.76 解析: 如果把x为1路,y为2路,则x-y4,y-x4 所以可以得到坐标 (4,0)(10,6)(0,4)(6,1…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码:https://github.com/chongzhou96/MaskCLIP 论文:https://arxiv.org/abs/2112.01071 摘要 对比语言-…

PyVideoTrans:一款功能全面的视频翻译配音工具!【送源码】

PyVideoTrans是一款功能全面的视频翻译配音工具,专为视频内容创作者设计。它能够将视频中的语言翻译成另一种语言,并自动生成与之匹配的字幕和配音。支持多种语言,包括但不限于中文(简繁体)、英语、韩语、日语、俄语、…

算法010:无重复字符的最长子串

无重复字符的最长子串. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 使用的算法:滑动窗口 在这个…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_3【二十二】

在前面的几期博文中有过解析去除apk中功能权限的反编译步骤。另外在以往博文中也列举了修改apk中选项功能权限的操作方法。今天以另外一款apk作为演示修改反编译去除软件功能限制的步骤。兴趣的友友可以参考其中的修改过程。 课程的目的是了解apk中各个文件的具体作用以及简单…

C-11 三角剖分的调研

C-11 三角剖分算法 三角剖分就是将输入的多边形,分割成一系列互不重叠的三角形,其重要性就在这不多赘述。这个是一个别人总结的链接:http://vterrain.org/Implementation/Libs/triangulate.html 图片链接:http://www-cgrl.cs.m…

STM32点灯闪烁

stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤:开启时钟->使用结构体设置输出模式…

Android项目中,查看项目依赖树的多种方式

1.使用预设的Task来进行查看 1.1 命令行 查看某个模块的所有依赖树: gradlew [模块名称]:dependencies 例如:gradlew app:dependencies查看某个模块的某功能的依赖树: gradlew [模块名称]:dependencies --configuration [功能名称] 例如&…

国内采用docker部署open-metadata

背景 最近看看开源的元数据管理项目,比较出名点的有open-metadata、datahub、OpenLineage、atlas。 open-metadata有1千多的贡献者,4.8K的stars,社区现在也比较活跃,支持的数据库类型还蛮多,基本市面上常见的都有支持…

C++ 函数高级——函数的占位参数

C中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补改位置 语法: 返回值类型 函数名(数据类型){ } 在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术 示例:…