余弦距离在计算相似度的应用中经常使用,比如:

  • 文本相似度检索
  • 人脸识别检索
  • 相似图片检索

原理简述

下面是余弦相似度的计算公式(图来自wikipedia):

但是,余弦相似度和常用的欧式距离的有所区别。

  • 余弦相似度的取值范围在-1到1之间。完全相同时数值为1,相反反向时为-1,正交或不相关是为0。(如下图,来源
  • 欧式距离一般为正值,归一化之后在0~1之间。距离越小,越相似。

欧式距离用于相似度检索更符合直觉。因此在使用时,需要将余弦相似度转化成类似欧氏距离的余弦距离。

维基页面中给出的角距离计算公式如下(图来自wikipedia):

由于在计算图片或者文本相似度时,提取的特征没有负值,余弦相似度的取值为0~1,因此采用更简便的方法,直接定义为:

余弦距离 = 1- 余弦相似度

代码分析

根据输入数据的不同,分为两种模式处理。

  • 输入数据为一维向量,计算单张图片或文本之间的相似度 (单张模式)
  • 输入数据为二维向量(矩阵),计算多张图片或文本之间的相似度 (批量模式)
 1 import numpy as np
2 def cosine_distance(a, b):
3 if a.shape != b.shape:
4 raise RuntimeError("array {} shape not match {}".format(a.shape, b.shape))
5 if a.ndim==1:
6 a_norm = np.linalg.norm(a)
7 b_norm = np.linalg.norm(b)
8 elif a.ndim==2:
9 a_norm = np.linalg.norm(a, axis=1, keepdims=True)
10 b_norm = np.linalg.norm(b, axis=1, keepdims=True)
11 else:
12 raise RuntimeError("array dimensions {} not right".format(a.ndim))
13 similiarity = np.dot(a, b.T)/(a_norm * b_norm)
14 dist = 1. - similiarity
15 return dist

6~7 行 , np.linalg.norm 操作是求向量的范式,默认是L2范式,等同于求向量的欧式距离。

9~10行 ,设置参数 axis=1 。对于归一化二维向量时,将数据按行向量处理,相当于单独对每张图片特征进行归一化处理。

13行,np.dot 操作可以支持两种模式的运算,来自官方文档的解释:

numpy.dot(about=None)

  Dot product of two arrays. Specifically,

  • If both a and b are 1-D arrays, it is inner product of vectors (without complex conjugation).

  • If both a and b are 2-D arrays, it is matrix multiplication, but using matmul or a @ b is preferred.

为了保持一致性,都使用了转置操作。如下图所示,矩阵乘法按线性代数定义,必须是 行 × 列才能完成乘法运算。举例 32张128维特征进行运算,则应该是 32x128 * 128x32 才行。

参考文章

numpy :: 计算特征之间的余弦距离的更多相关文章

  1. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  2. JS高德地图计算两地之间的实际距离

    这个是通过导航的方式来获取两地之间的实际距离,和消耗的时间(key值自己去申请哈) <!doctype html> <html> <head> <meta c ...

  3. 余弦距离、欧氏距离和杰卡德相似性度量的对比分析 by ChaoSimple

      1.余弦距离 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量. 向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向 ...

  4. 评价指标的局限性、ROC曲线、余弦距离、A/B测试、模型评估的方法、超参数调优、过拟合与欠拟合

    1.评价指标的局限性 问题1 准确性的局限性 准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷.比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率.所以,当 ...

  5. 机器学习-文本数据-文本的相关性矩阵 1.cosing_similarity(用于计算两两特征之间的相关性)

    函数说明: 1. cosing_similarity(array)   输入的样本为array格式,为经过词袋模型编码以后的向量化特征,用于计算两两样本之间的相关性 当我们使用词频或者TFidf构造出 ...

  6. numpy计算路线距离

    numpy计算路线距离 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 enumerate遍历数组 np.diff函数 numpy适用数组作为索引 标记路线上的点 \[X={X1,X ...

  7. sql server2008根据经纬度计算两点之间的距离

    --通过经纬度计算两点之间的距离 create FUNCTION [dbo].[fnGetDistanceNew] --LatBegin 开始经度 --LngBegin 开始维度 --29.49029 ...

  8. C#面向对象思想计算两点之间距离

    题目为计算两点之间距离. 面向过程的思维方式,两点的横坐标之差,纵坐标之差,平方求和,再开跟,得到两点之间距离. using System; using System.Collections.Gene ...

  9. 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米

    /** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...

随机推荐

  1. javascript导图 标签: javascript 2015-12-06 16:37 721人阅读 评论(24)

  2. Flask学习之六 个人资料和头像

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars ...

  3. PMC亮相IDF展示12G SAS分层存储解决方式

    引领大数据连接.传送以及存储,提供创新半导体及软件解决方式的PMC公司(纳斯达克代码:PMCS)出席了2014年4月2-3日在深圳举办的2014 IDF英特尔开发人员论坛. 此次,PMC将在 1层展示 ...

  4. 网站的域名带www的和不带www的有什么区别呀

    国内用户习惯用www,不过默认的不带www的域名要好过带www的,带Www的是二级域名,不带的是顶级域名,默认的在搜索引擎中得权重会比较高 区别就在于一个带www一个不带www 其他都一样.www的域 ...

  5. vue init定制团队模板之meta.js/meta.json写法入门

    在上一篇文章中,我们提到了meta.js,这次我们详细了解一下meta.js里面各个模块的写法. 对于 meta.js/metajson 文件, 目前主要字段如下: prompts<Object ...

  6. mysql数据库之mysql下载与设置

    下载和安装mysql数据库 mysql为我们提供了开源的安装在各个操作系统上的安装包,包括ios,liunx,windows. mysql的安装,启动和基础配置-------linux版本 mysql ...

  7. 阿里云CDN技术掌舵人文景:相爱相杀一路狂奔的这十年

    导读:提到阿里云CDN,不得不提技术掌舵人姚伟斌(文景),虽然他不是团队中最“老”的同学,但他却历经了淘宝业务发展最为飞速的几年,见证了从最初服务淘宝和集团内部的CDN,到如今国内服务客户最多的云CD ...

  8. laravel 定时任务通过队列发送邮件

    https://www.jianshu.com/p/f6b94596098e 关于laravel发送邮件,请先参考我的另一片文章:laravel sendcloud发送邮件,再继续往下看. 1.用da ...

  9. 2019-9-2-Visual-studio-创建项目失败vstemplate

    title author date CreateTime categories Visual studio 创建项目失败vstemplate lindexi 2019-09-02 12:57:38 + ...

  10. SQL,范式,事务

    数据库范式: 构造数据库必须遵循一定的规则.在关系数据库中,这种规则就是范式. 范式是符合某一种级别的关系模式的集合.数据库中的关系必须满足一定的要求,即满足不同的范式. 满足最低要求的范式是第一范式 ...