8种相似度度量方式的原理及实现

雾绡继承
• 阅读 15829

8种相似度度量方式的原理及实现

欧氏距离(Euclidean Distance)

欧氏距离(也称欧几里得度量)指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)

8种相似度度量方式的原理及实现

计算公式

$$dist(A,B)=\sqrt{\sum_{i=1}^n(A_i-B_i)^2}$$

试用场景

  • 在数据完整(无维度数据缺失)的情况下, 维度间的衡量单位是一致的, 否则需要标准化处理

python实现

import numpy as np


vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.linalg.norm(vec1-vec2, ord=2)
# 或者
d = np.sqrt(np.sum(np.square(vec1-vec2)))

曼哈顿距离(Manhattan Distance)

在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和

8种相似度度量方式的原理及实现

计算公式

$$dist(A,B)=\sum_{i=1}^n|A_i-B_i|$$

试用场景

  • 在数据完整(无维度数据缺失)的情况下, 需要将空间划分成网格, 然后以网格为单位来进行度量, 允许4个方向

python实现

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])
 
d = np.linalg.norm(vec1-vec2, ord=1)
# 或者
d = np.sum(np.abs(vec1-vec2))

切比雪夫距离(Chebyshev Distance)

切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各座标数值差的最大值

8种相似度度量方式的原理及实现

计算公式

$$dist(A,B)=\max_i|A_i-B_i|$$
or
$$dist(A,B)=\lim_{p→\infty}(\sum_{i=1}^n|A_i-B_i|^p)^{\frac{1}{p}}$$

试用场景

  • 需要将空间划分成网格, 然后以网格为单位来进行度量, 允许8个方向

python实现

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.linalg.norm(vec1-vec2, ord=np.inf)
# 或者
d = np.abs(vec1-vec2).max()

闵可夫斯基距离(Minkowski Distance)

欧氏空间中的一种测度,被看做是欧氏距离和曼哈顿距离的一种推广

8种相似度度量方式的原理及实现

计算公式

$$dist(A,B)=\sqrt[p]{\sum_{i=1}^n|A_i-B_i|^p}$$

试用场景

  • 当 $p=1$ 时,就是曼哈顿距离
  • 当 $p=2$ 时,就是欧氏距离
  • 当 $p→∞$ 时,就是切比雪夫距离

python实现

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

"""
ord=1: 一范数
ord=2: 二范数
ord=np.inf: 无穷范数
"""
d = np.linalg.norm(vec1-vec2, ord=arg)

汉明距离(Hamming Distance)

在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个数

8种相似度度量方式的原理及实现

计算公式

$$dist(A,B)=\sum_{i=0}^n{A[i]\bigoplus B[i]}$$

试用场景

  • 信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)

python实现

import numpy as np

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = len(np.nonzero(vec1-vec2)[0])
# 或者
d = np.shape(np.nonzero(vec1-vec2)[0])[0]

余弦相似度(Cosine Similarity)

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度

8种相似度度量方式的原理及实现

计算公式

$$\cos(\theta)=\cfrac{A\cdot B}{|A||B|}$$
or
$$\cos(\theta)=\cfrac{\sum_{i=1}^nA_iB_i}{\sqrt{\sum_{i=1}^nA_i^2}\sqrt{\sum_{i=1}^nB_i^2}}$$

试用场景

  • 衡量两个向量方向的差异

python实现

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*(np.linalg.norm(vec2)))

皮尔森相关系数(Pearson Correlation Coefficient)

用于度量两个变量之间的相关程度

8种相似度度量方式的原理及实现

计算公式

$$P(A,B)=\cfrac{\sum_{i=1}^n(A_i-\overline A)(B_i-\overline B)}{\sqrt{\sum_{i=1}^n(A_i-\overline A)^2\sum_{i=1}^n(B_i-\overline B)^2}}$$

试用场景

  • 反映两个变量是正相关还是负相关

python实现

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

p = np.corrcoef(vec1, vec2)

杰卡德相似系数(Jaccard Similarity Coefficient)及杰卡德距离(Jaccard Distance)

用于比较有限样本集之间的相似性与差异性

8种相似度度量方式的原理及实现

杰卡德相似系数计算公式

$$J(A,B)=\cfrac{|A\bigcap B|}{|A\bigcup B|}$$

杰卡德距离计算公式

$$J_\delta(A,B)=1-J(A,B)=\cfrac{|A\bigcup B|-|A\bigcap B|}{|A\bigcup B|}$$

试用场景

  • 比较文本相似度,用于文本查重与去重;
  • 计算对象间距离,用于数据聚类或衡量两个集合的区分度等。

python实现

import numpy as np
import scipy.spatial.distance as dist

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = dist.pdist(np.array([vec1, vec2]), "jaccard")


参考链接

点赞
收藏
评论区
推荐文章
御弟哥哥 御弟哥哥
4年前
Android RecyclerView如何获取滑动距离
获取RecyclerView滑动的距离。本文演示如何获取RecyclerView的滑动距离。要实现这个功能,需要给RecyclerView添加滑动时监听RecyclerView.OnScrollListener。recyclerView.addOnScrollListener(newRecyclerView.OnScrollListene
Stella981 Stella981
3年前
CGAL HelloWorld
点和线段如何创建点和线段,并计算两点之间的距离、点到线段的距离、点与线段的位置关系和中点。定义Kernel(几何图元)操作predicate(位置,距离和中点)Codeinclude<iostreaminclude<CGAL/Simple_cartesian.hty
Stella981 Stella981
3年前
Codeforces 1005F Berland and the Shortest Paths 【最短路树】【性质】
其实是一道裸题,如果没学过最短路树的话会比较难做,要想很久想到关键性质才能做出来。最短路树顾名思义,就是从一个图中生成出来一棵树,使得每个顶点到root的距离是单源最短路。如果有这样的树的话,那可见这样的树是符合题意的。怎么生成这样的树呢?关键在于记录前驱father,一个距离root最短路是6的点必定从一个距离root最短路是5的点到达(这两个点之
Wesley13 Wesley13
3年前
Java中当前对象引用
题:计算机画图时,有点的概念,每个点由它的横坐标x和纵坐标y描述。写一个类。求两个点之间的曼哈顿距离横向距离纵向距离例如,一个点(0,0)和另一个点(1,1)的曼哈顿距离为2packagetest;publicclassPoint{
Wesley13 Wesley13
3年前
Java调用百度地图API
本实战代码将使用百度地图的接口来实现以下功能: 1.确定输入地址的坐标 2.两个坐标的距离其他的话,还要使用百度账户申请相关的api,具体见:http://lbsyun.baidu.com/index.php?titlewebapi示例代码:importcom.alibaba.fastjson.JSON;im
Stella981 Stella981
3年前
FreeType字体知识
1.字形度量顾名思义,字形度量是对应每一个字形的特定距离,以此描述如何对文本排版。通常一个字形有两个度量集:用来排版水平文本排列的字形(拉丁文、西里尔文、阿拉伯文、希伯来文等等)和用来排版垂直文本排列的字形(中文、日文、韩文等等)。要注意的是只有很少的字体格式提供了垂直度量。你可以使用宏FT_HAS_VERTICAL测试
Stella981 Stella981
3年前
ModelArts 与HiLens Kit联合开发丨行人社交距离风险提示Demo
摘要:本Demo使用YOLOv3\_Resnet18模型来检测的视频流中的行人,获取行人坐标(即图中蓝色方框),然后计算所有检测到的人之间的相互“距离”。作者:华为云EI专家厉天一前情提要听到行人社交距离风险提示是不是觉得有点不太明白,简单来说,就是通过某一角度的视觉信息,判断行人的社交距离情况,让我们直接看
Wesley13 Wesley13
3年前
1162. 地图分析
你现在手里有一份大小为 NxN的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。我们这里说的距离是『曼哈顿距离』( ManhattanDistance):(x0,y
Wesley13 Wesley13
3年前
KNN算法详解
  简单的说,K近邻算法是采用不同特征值之间的距离方法进行分类。  该方法优点:精确值高、对异常值不敏感、无数据输入假定  缺点:计算复杂度高、空间复杂度高  适用范围:数据型和标称型  现在我们来讲KNN算法的工作原理:存在一个样本数据集,也称作训练样本集,并且样本中每条数据都存在标签。将新输入的没有标签的数据与训练样本数据集中
Wesley13 Wesley13
3年前
Java web 前端面试知识点总结
分享一下我的面试知识点总结: 耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一
Wesley13 Wesley13
3年前
2. 文本相似度计算
1\.文本相似度计算文本向量化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fhuangyc%2Fp%2F9785420.html)2\.文本相似度计算距离的度量(https://www.oschina.net/a
雾绡继承
雾绡继承
Lv1
过尽征鸿来尽燕,故园消息茫然。
文章
4
粉丝
0
获赞
0