1 概述

两个向量之间的距离(此时向量作为n维坐标系中的点)计算,在数学上称为向量的距离(Distance),也称为样本之间的相似性度量(Similarity Measurement)。它反映为某类事物在距离上接近或远离的程度。直觉上,距离越近的就越相似,越容易归为一类;距离越远越不同。

2 常用距离及其python实现

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

严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义。两个n维变量A(x11,x12,...,x1n)与B(x21,X22,…,X2n)间的闵可夫斯基距离定义为:

其中p是一个变参数,根据变参数的不同,闵可夫斯基距离可以表示一类的距离。

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

2.2 欧氏距离(Euclidean Distance)

欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的欧氏距离如下:

表示为向量运算的形式:

Python 实现欧式距离:

# 欧式距离
import numpy as np
v1 = np.mat([1,2,3])
v2 = np.mat([4,5,6])
print(np.sqrt((v1 - v2)*(v1 - v2).T)) 输出结果为:[[5.19615242]]

2.3 曼哈顿距离(Manhattan Distance)

从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数),而这也是曼哈顿距离名称的来源。曼哈顿距离也称为城市街区距离(City Block distance),如下图所示。

两个n维向量A(x1,x12,…,x1n)与B(x21,x22,…,x2n)间的曼哈顿距离:

Python实现曼哈顿距离如下:

#曼哈顿距离
import numpy as np
v1 = np.mat([1,2,3])
v2 = np.mat([4,5,6])
print(np.sum(abs(v1 - v2))) 输出结果为:9

2.4 切比雪夫距离(Chebyshev Distance)

国际象棋玩过吗?国王走一步能够移动到相邻的8个方格中的任意一个,如下图所示。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max(|x2-x1|,|y2-y1|)步。有一种类似的距离度量方法叫作切比雪夫距离(L∞范数)。

两个n维向量A(x1,x12,…,x1n)与B(x21,x22,…,x2n)间的切比雪夫距离:

这个公式的另一种等价形式是:

Python实现切比雪夫距离如下;

# 契比雪夫距离
import numpy as np
v1 = np.array([1,2,3])
v2 = np.array([4,7,5])
print(abs(v1 - v2).max()) 输出结果为:5

2.5 夹角余弦(Cosine)

几何中的夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。对于两个n维样本点A(x11,x12,…,x1n)与B(x21,x22,…x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

即:

夹角余弦取值范围为[-1,1]。夹角余弦越大,表示两个向量的夹角越小;夹角余弦越小,表示两个向量的夹角越大。当两个向量的方向重合时,夹角余弦取最大值1;当两个向量的方向完全相反时,夹角余弦取最小值-1。

Python实现夹角余弦如下:

# 夹角余余弦
import numpy as np
v1 = np.array([1,2,3])
v2 = np.array([4,7,5])
cosV12 = np.dot(v1,v2)/(np.linalg.norm(v1) * np.linalg.norm(v2))
print(cosV12) 输出结果为:0.9296696802013682

2.6 汉明距离(Hamming Distance)

汉明距离的定义:两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。

Python实现汉明距离如下:

#汉明距离
import numpy as np
matV = np.mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]])
smstr = np.nonzero(matV[0]-matV[1])
print(smstr)
print(np.shape(smstr[0])[0]) 输出结果为:
(array([0, 0, 0, 0, 0, 0], dtype=int64), array([0, 2, 3, 5, 6, 7], dtype=int64))
6

补充:np.nonzero()返回值为元组, 两个值分别为两个维度的下标值,即:(0,0),(0,2),(0,3),(0,5),(0,6),(0,7)为非零值,。

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

杰卡德相似系数:两个集合A和B的交集元素在A、B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(4,B)表示。杰卡德相似系数是衡量两个集合的相似度的一种指标。

杰卡德距离:与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance),杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。杰卡德距离可用如下公式表示:

样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如,A(0111)和B(1011)。我们将样本看成一个集合,1表示集合包含该元素,0表示集合不包含该元素。

  • P:样本A与B都是1的维度的个数。
  • g:样本A是1、样本B是0的维度的个数。
  • r:样本A是0、样本B是1的维度的个数。
  • s:样本A与B都是0的维度的个数。

那么样本A与B的杰卡德相似系数可以表示为:

Python实现杰卡德距离如下:

# 杰卡德距离
import numpy as np
import scipy.spatial.distance as dist
matV = np.mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]])
print("dist.jaccard:",dist.pdist(matV,"jaccard")) 输出结果为:dist.jaccard: [0.75]

3 补充

细心的同学可能会发现上边的代码,有的使用np.mat(),有的使用np.array(),那么两者之间的区别是什么呢?

Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND)。Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。

在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。相反的是在numpy里面arrays遵从逐个元素的运算,c*d运算相当于matlab里面的c.*d运算,而矩阵相乘,则需要numpy里面的dot命令 。

import numpy as np

a=np.mat('4 3; 2 1')
b=np.mat('1 2; 3 4') c=np.array([[4, 3], [2, 1]])
d=np.array([[1, 2], [3, 4]]) print(a*b)
# [[13 20]
# [ 5 8]] print(c*d)
# [[4 6]
# [6 4]] print(np.dot(c,d))
# [[13 20]
# [ 5 8]]

matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H 得到共轭矩阵, 加 .I 得到逆矩阵。

** 运算符的作用也不一样 ,当a是个matrix时,a2返回的是a*a,相当于矩阵相乘。当c是array,c2相当于,c中的元素逐个求平方。

import numpy as np

a=np.mat('4 3; 2 1')
c=np.array([[4, 3], [2, 1]]) print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]

那么问题就出来了,如果一个程序里面既有matrix 又有array,会让人脑袋大。但是如果只用array,你不仅可以实现matrix所有的功能,还减少了编程和阅读的麻烦。

机器学习中常用的距离及其python实现的更多相关文章

  1. 机器学习中的K-means算法的python实现

    <机器学习实战>kMeans算法(K均值聚类算法) 机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行 ...

  2. 面试中常用排序算法的python实现和性能分析

    这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...

  3. ML:机器学习中常用的Octave语句

    coursera上吴恩达的机器学习课程使用Octave/Matlab实现算法,有必要知道Octave简单的语句.最重要的:在遇到不会的语句,使用'''help '''或者'''doc '''查看官方文 ...

  4. python机器学习的常用算法

    Python机器学习 学习意味着通过学习或经验获得知识或技能.基于此,我们可以定义机器学习(ML)如下 - 它可以被定义为计算机科学领域,更具体地说是人工智能的应用,其为计算机系统提供了学习数据和从经 ...

  5. 【转载】Python编程中常用的12种基础知识总结

    Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...

  6. Python编程中常用的12种基础知识总结

    原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...

  7. 机器学习中应用到的各种距离介绍(附上Matlab代码)

    转载于博客:各种距离 在做分类时常常需要估算不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法就是计算样本间的"距离"(Distance). ...

  8. python数据分析中常用的库

    Python是数据处理常用工具,可以处理数量级从几K至几T不等的数据,具有较高的开发效率和可维护性,还具有较强的通用性和跨平台性,这里就为大家分享几个不错的数据分析工具,需要的朋友可以参考下 Pyth ...

  9. 机器学习中的 7 大损失函数实战总结(附Python演练)

    介绍 想象一下-你已经在给定的数据集上训练了机器学习模型,并准备好将它交付给客户.但是,你如何确定该模型能够提供最佳结果?是否有指标或技术可以帮助你快速评估数据集上的模型? 当然是有的,简而言之,机器 ...

随机推荐

  1. UVALive7461 - Separating Pebbles 判断两个凸包相交

    //UVALive7461 - Separating Pebbles 判断两个凸包相交 #include <bits/stdc++.h> using namespace std; #def ...

  2. ransformResourcesWithMergeJavaResForDebug问题

    错误内容: Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > java.i ...

  3. Java 虚拟机 - ClassLoader

    ClassLoader定义 ClassLoader种类 BootStrapClassLoader无法在IDEA里面查看源代码,只能看JVM 源码才能找到. ExtClassLoader,会从Syste ...

  4. curl 一个使用例子

    #include <iostream> #define Main main #include <string> #include <assert.h> #inclu ...

  5. 数论+线性dp——cf1174A

    直接推公式没有推出来 看了题解才会做.. 首先能够确定前面几个数的gcd一定是2^j * 3^k, 其中k<=1 那么可以用dp[i][j][k]来表示到第i位的gcd是2^j*3^k f(j, ...

  6. MyBatis基础-CRUD

    一.mybatis  环境搭建步骤 第一步:创建 maven 工程第二步:导入坐标第三步:编写必要代码(实体类和持久层接口)第四步:编写 SqlMapConfig.xml第五步:编写映射配置文件第六步 ...

  7. transient在java中的作用

    java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...

  8. error LNK1104: 无法打开文件“C:\Users\Administrator\Desktop\....\\xxxx.exe”

    1.错误原因:项目在在打开前已经打开了win32里面的程序,并且运行.  解决方法:关闭直接在win32中运行的程序,再点击调试 2.暂时不知道原因,打开程序还会报无权限创建可执行文件.如下图所示 解 ...

  9. spring加载属性配置文件内容

    在spring中提供了一个专门加载文件的类PropertyPlaceholderConfigurer,通过这个类我们只需要给定需要加载文件的路径就可以 通过该类加载到项目,但是为了后面在程序中需要使用 ...

  10. python3爬虫lxml模块的安装

    1:在下载lxml之前,要先查看python的版本信息, 在CMD命令行输入python 再输入import pip; print(pip.pep425tags.get_supported()) -- ...