使用 Eigen 实现 CosineSimilarity 函数

news/2024/11/30 11:21:41/文章来源:https://www.cnblogs.com/Zheng-Bicheng/p/18578196

1 简介

Eigen 是一个高效、易于使用的C++模板库,广泛应用于线性代数计算。本文将介绍如何使用 Eigen 实现 CosineSimilarity 函数,这是一种常用的相似度度量方法,可以用于衡量两个向量之间的相似程度。通过 Eigen 的矩阵运算和向量运算,我们可以快速、准确地实现 CosineSimilarity 函数,提高机器学习模型的训练和推理效率。

2 实现 NormalizeL2

bool NormalizeL2(std::vector<float> &input_data) {if (input_data.empty()) {return false;}// 将std::vector<float> 转换为 Eigen::MapEigen::Map<Eigen::VectorXf> eigen_vector(input_data.data(), static_cast<long>(input_data.size()));eigen_vector.normalize();return true;
}

3 实现 CosineSimilarity

double CosineSimilarity(const std::vector<T> &a, const std::vector<T> &b, bool use_normalize = false) {if ((a.size() != b.size()) && (a.empty()) || (b.empty())) {BDLOGGER_ERROR("The size of Vector A and B must be equal and greater than 0. But the size of vector A is {}, while the size of vector B is also {}.",a.size(),b.size())return 0;}Eigen::Map<const Eigen::VectorXf> eigen_vector_a(a.data(), static_cast<long>(a.size()));Eigen::Map<const Eigen::VectorXf> eigen_vector_b(b.data(), static_cast<long>(b.size()));if (use_normalize) {return eigen_vector_a.dot(eigen_vector_b) / (eigen_vector_a.norm() * eigen_vector_b.norm());} else {return eigen_vector_a.dot(eigen_vector_b);}
}

4 参考文档

  • 深度学习(二十四)——L2 Normalization, Attention(1)-CSDN博客
  • mindspore.ops.L2Normalize — MindSpore master documentation
  • 余弦相似度(Cosine Similarity)-CSDN博客
  • 距离度量 —— 余弦相似度(Cosine similarity)_繁依Fanyi的技术博客_51CTO博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatRoom pg walkthrough Intermediate

NMAP ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A 192.168.189.110 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-30 00:22 UTC Nmap scan report for 192.168.189.110 Host is up (0.073s latency). Not shown: 65533 filtered tcp ports (no-response) PORT …

vxe-table 树形表格的用法详解

vxe-table 树形表格的使用,支持多种数据结构,可以是带有父子结构的数组,也可以带有层级结构的嵌套数据。 官网:https://vxetable.cn Gitee 带有父子结构的平级数据 只需要带有父子结构的平级数据,例如:id 和 parentId,字段名可以任意设置。对于保存到数据库的平级数据非…

电动车头盔穿戴检测方案

电动车头盔穿戴检测方案的核心在于利用现场监控摄像头捕捉道路上骑电动车、三轮车等骑行者的状态,电动车头盔穿戴检测方案通过深度学习算法自动识别骑行者是否佩戴了安全头盔。在实施过程中,监控摄像头会持续捕捉路面情况,并将图像数据传输至后端服务器(也可以前端分析,本…

滑坡监测识别摄像头

滑坡监测识别摄像头安装在潜在滑坡区域,滑坡监测识别摄像头通过捕捉实时图像,对这些图像进行深度分析,识别出可能的滑坡迹象。一旦系统检测到异常,它将立即发出预警信号,通知相关部门采取紧急措施,从而减少灾害带来的损失。滑坡监测识别摄像头的智能预警系统,不仅提高了…

人员跌倒检测摄像头

人员跌倒检测摄像头的核心在于其搭载的深度学习算法,人员跌倒检测摄像头采用了先进的YOLOX结合OpenCV,能够高效地对视频流进行实时分析和处理,当摄像头检测到有人跌倒时,它会自动对跌倒者进行抓拍,并将当时的图像传输到管理中心。这一过程无需人工干预,大大提高了响应速度…

深度学习发展历史

https://www.bookstack.cn/read/paddlepaddle-tutorials/spilt.3.3d52d8126c99cb7b.md 作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! …

Latex添加一条水平线——overleaf可以用

https://blog.csdn.net/qq_46753404/article/details/118083320 效果如下:添加水平线语法 {\noindent} \rule[-10pt]{17.5cm}{0.05em}\\ {\noindent} 表示取消缩进 \rule[水平高度]{长度}{粗细}

Latex高亮文本,简单有效——overleaf也可以用

https://blog.csdn.net/ShuqiaoS/article/details/118217508 普通文本高亮 效果是这样的:首先在开头使用: \usepackage{soul, color, xcolor} 之后在需要高亮的地方使用: \hl{文本} (注意,如果应用了\hl但是没有反应或者高亮有问题,多半是由于没有包含color和xcolor的缘故…

【人人都能学得会的NLP - 文本分类篇 03】长文本多标签分类分类如何做?

【人人都能学得会的NLP - 文本分类篇 03】长文本多标签分类分类如何做? NLP Github【人人都能学得会的NLP - 文本分类篇 03】长文本多标签分类分类如何做?NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、…

考研打卡(31)

开局(31) 开始时间 2024-11-30 08:23:52 结束时间 2024-11-30 09:24:35睡醒了。睡了六个小时睡不着了数据结构若一个有向图中的顶点不能排成一个拓扑序列,则可断定该有向图______(武汉科技大学 2013年) A 是个有根有向图 B 是个强连通图 C 含有多个入度为0的顶点 D 含有顶…

HTML5图像相关的标签有哪些?

HTML5 中与图像相关的标签主要有以下几个:<img> (Image): 这是最常用的图像标签,用于在网页上嵌入图像。它是一个自关闭标签,意味着它不需要结束标签 </img>。<picture> (Picture): <picture> 元素允许你定义多个图像源,浏览器会根据不同的设备特…