numpy :: 计算特征之间的余弦距离
余弦距离在计算相似度的应用中经常使用,比如:
- 文本相似度检索
- 人脸识别检索
- 相似图片检索
原理简述
下面是余弦相似度的计算公式(图来自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(a, b, out=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
matmulora @ bis preferred.
为了保持一致性,都使用了转置操作。如下图所示,矩阵乘法按线性代数定义,必须是 行 × 列才能完成乘法运算。举例 32张128维特征进行运算,则应该是 32x128 * 128x32 才行。

参考文章
numpy :: 计算特征之间的余弦距离的更多相关文章
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- JS高德地图计算两地之间的实际距离
这个是通过导航的方式来获取两地之间的实际距离,和消耗的时间(key值自己去申请哈) <!doctype html> <html> <head> <meta c ...
- 余弦距离、欧氏距离和杰卡德相似性度量的对比分析 by ChaoSimple
1.余弦距离 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量. 向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向 ...
- 评价指标的局限性、ROC曲线、余弦距离、A/B测试、模型评估的方法、超参数调优、过拟合与欠拟合
1.评价指标的局限性 问题1 准确性的局限性 准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷.比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率.所以,当 ...
- 机器学习-文本数据-文本的相关性矩阵 1.cosing_similarity(用于计算两两特征之间的相关性)
函数说明: 1. cosing_similarity(array) 输入的样本为array格式,为经过词袋模型编码以后的向量化特征,用于计算两两样本之间的相关性 当我们使用词频或者TFidf构造出 ...
- numpy计算路线距离
numpy计算路线距离 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 enumerate遍历数组 np.diff函数 numpy适用数组作为索引 标记路线上的点 \[X={X1,X ...
- sql server2008根据经纬度计算两点之间的距离
--通过经纬度计算两点之间的距离 create FUNCTION [dbo].[fnGetDistanceNew] --LatBegin 开始经度 --LngBegin 开始维度 --29.49029 ...
- C#面向对象思想计算两点之间距离
题目为计算两点之间距离. 面向过程的思维方式,两点的横坐标之差,纵坐标之差,平方求和,再开跟,得到两点之间距离. using System; using System.Collections.Gene ...
- 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米
/** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...
随机推荐
- oralce GROUPING
/*从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null, 如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!*/ select decode(groupin ...
- 12-3 DOM操作
一 DOM基础 1 DOM介绍 DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组 ...
- pandas数据框,统计某列或者某行数据元素的个数
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sinat_38893241/articl ...
- util.date
package com.sxt.utils.date1; import java.util.Date; /* * util.date */ public class TestDate { public ...
- @codeforces - 1187F@ Expected Square Beauty
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个序列 x = {x1, x2, ..., xn},已知 ...
- 【[Offer收割]编程练习赛15 A】 偶像的条件
[题目链接]:http://hihocoder.com/contest/offers15/problem/1 [题意] [题解] 把3个数组的元素全都合并在一个数组里面; (当然你要记录每个数字原本是 ...
- 13 Free GIS Software Options: Map the World in Open Source
13 Free GIS Software Options: Map the World in Open Source A LIST OF FREE OPEN SOURCE MAPPING SOFT ...
- python selenium 测试配置信息(URL和浏览器)
config.ini # this is config file, only store browser type and server URL [browserType] #browserName ...
- python2和python3一些不同
文件写法: #python2fp=file(filepath,'wb')#python3# fp = open(filepath, 'wb') 关于乱码问题: #python2 #coding=utf ...
- ajax上传文件 基于jquery form表单上传文件
<script src="/static/js/jquery.js"></script><script> $("#reg-btn&qu ...