理论

1 欧式距离
欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.
欧式空间是一个非常专业的名词,对于我们编程来说,就等价理解成N维空间即可。

特别要指出的是,一般的,我们可以将N维中的一个测试点与多个样本点间的计算从循环N次计算,转化为一次性计算,见下面的例子。

import numpy as np
vector1 = np.mat([1,2,3])
vector2 = np.mat([4,5,6])
distance = np.sqrt((vector1-vector2)*((vector1-vector2).T))
print(distance)
##############################
[[5.19615242]]# 如果想要计算多维空间中,某个点与其他多个点之间的距离,实现快速计算
vector1 = np.array([1,2,3])vector2 = np.array([[4,5,6],[7,8,9],[10,11,12]])diffMat = np.tile(vector1, (vector2.shape[0], 1)) - vector2
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
o_distances = sqDistances ** 0.5
print(o_distances)
#########################################
[ 5.19615242 10.39230485 15.58845727]

2 杰卡德距离
与杰卡德距离相应的一个词叫做杰卡德相似系数,常用于衡量样本的相似度。
从这一点上看来,比较适合用来做图片识别的工作,但是具体效果如何,还要实际运用实验。

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

P:样本A与B都是1的维度的个数

q:样本A是1,样本B是0的维度的个数

r:样本A是0,样本B是1的维度的个数

s:样本A与B都是0的维度的个数

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

这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。
而样本A与B的杰卡德距离表示为:

J=pp+q+rJ = \frac {p} {p + q +r}J=p+q+rp​

import scipy.spatial.distance as dist  # 导入scipy距离公式
matV = np.array([[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 汉明距离

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

从它计算的数据形式上看,汉明距离也可以用于二值处理后的图像。

matV = np.array([[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]);
len(smstr[0])
####################################
6

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

vector1 = np.mat([1,2,3])
vector2 = np.mat([4,5,6])
print(sum(abs(vector1-vector2)))
########################################33
[[3 3 3]]

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

如果下一个落脚点在起始点的水平位置,那么最少步数是横坐标的差值的绝对值;
如果在垂直位置,那么最少步数是纵坐标的差值的绝对值。
如果是非水平非垂直位置,大家自己试一试。试过之后会发现,还是差不过横坐标差值的绝对值,或者是纵坐标差值的绝对值。

vector1 = np.array([1,2,3])
vector2 = np.array([4,7,5])
print(abs(vector1-vector2).max())
################################

6 余弦距离

几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异.

vector1 = np.array([1,2,3])
vector2 = np.array([4,7,5])
print(vector1,vector2)
cosV12 = np.dot(vector1,vector2)/(np.linalg.norm(vector1)*np.linalg.norm(vector2))
print(cosV12)
########################################
[1 2 3] [4 7 5]
0.9296696802013682

试验结果

1 欧式距离
准确率:0.9451
F1-Score:0.9718
用时: 2.78871

2 曼哈顿距离
准确率:0.7238
F1-Score:0.8398
用时: 3.12456

3 3切比雪夫距离
准确率:0.1281
F1-Score:0.2271
用时: 2.77712

4 余弦距离
准确率:0.0715
F1-Score:0.1335
用时: 20.69178

5 杰卡德
准确率:0.0998
F1-Score:0.1815
用时: 30.39309
6 汉明距离
准确率:0.9451
F1-Score:0.9718
用时: 1150.58714

可以看出,欧式距离、汉明距离、曼哈顿距离的实验效果都不错,其他的相对来说,比较差劲。另外,六种方法中最费时间的就是汉明距离。

小问题

1 np.tile
np.tile(a, (b,c)) 的介绍

tile有平铺的意思。
在numpy中,np.tile(a,(2))函数的作用就是将函数将函数沿着X轴扩大两倍。如果扩大倍数只有一个,默认为X轴。
np.tile(a,(2,1))第一个参数为Y轴扩大倍数,第二个为X轴扩大倍数

np.tile(vector1, (vector2.shape[0], 1))
#######################################
array([[1, 2, 3],[1, 2, 3],[1, 2, 3]])

参考文章

2 numpy中的nonzero

nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数。它的返回值是一个长度为a.ndim(数组a的轴数)的元组,元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。

matV = np.array([[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)
len(smstr[0])
##############################################
(array([0, 2, 3, 5, 6, 7]),)
6

参考文章

3 np.linalg.norm(求范数)
x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)

参考文章

KNN算法的距离公式相关推荐

  1. 近邻算法常用距离公式与推导(内附证明)初中生也能看懂

    前言: 今天心血来潮想做一期关于距离计算公式的博文,思来想去什么办法才能证明自己理解了呢,一想如果自己能用大白话把这些公式讲出来,还能让别人听懂,那么自己应该就算是掌握了.为了挑战一下难度博主还将这些 ...

  2. 机器学习之KNN算法原理

    机器学习之KNN算法原理 1 KNN算法简介 2 算法思想 3 多种距离度量公式 ① 欧氏距离(Euclidean distance) ② 曼哈顿距离(Manhattan distance) ③ 闵式 ...

  3. 算法图解第十章笔记与习题(KNN算法)

    算法图解第十章笔记与习题(KNN算法) 文章目录 算法图解第十章笔记与习题(KNN算法) 10.1 KNN算法 10.2特征提取 10.3 回归 10.4 小结 练习 习题10.1: 习题10.2: ...

  4. 深入浅出KNN算法(二) sklearn KNN实践

    上次介绍了KNN的基本原理,以及KNN的几个窍门,这次就来用sklearn实践一下KNN算法. 一.Skelarn KNN参数概述 要使用sklearnKNN算法进行分类,我们需要先了解sklearn ...

  5. KNN算法(二) sklearn KNN实践

    上次介绍了KNN的基本原理,以及KNN的几个窍门,这次就来用sklearn实践一下KNN算法. 一.Skelarn KNN参数概述 要使用sklearnKNN算法进行分类,我们需要先了解sklearn ...

  6. KNN算法详解及实现

    KNN算法详解及实现 k近邻法(k-nearest neighbor,k-NN)是一种基本的分类和回归方法,是监督学习方法里的一种常用方法.k近邻算法假设给定一个训练数据集,其中的实例类别已定.分类时 ...

  7. KNN算法原理与python实现

    文章目录 KNN算法原理 KNN算法介绍 KNN算法模型 距离度量 k值的选择 分类的决策规则 KNN算法python实现 手写数字识别 sklearn代码实现 参考文献 KNN算法原理 KNN算法介 ...

  8. 分类算法matlab实例,数据挖掘之分类算法---knn算法(有matlab例子)

    knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.注意,不是聚类算法.所以这种分类算法 必然包括了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒 ...

  9. 【机器学习】KNN算法实现手写板字迹识别

    文章目录 [机器学习]KNN算法实现手写板字迹识别 1. 前言 2. 实验背景 3. 测试过程 3.1 手写板及测试数据的制作 3.2 加载训练数据并进行KNN模型搭建 3.3 结果预测 4. 总结 ...

最新文章

  1. 计算机虚拟网络毕业论文,计算机毕业论文——基于WEB的虚拟计算机网络实验平台.doc...
  2. php正则过滤html标签_空格_换行符的代码,php正则过滤html标签、空格、换行符的代码(附说明)_php技巧...
  3. python画图简单代码-用python进行简单的画图操作
  4. 移动端banner css3(@keyframes )实现
  5. Android性能优化之一:ViewStub
  6. Winsock编程宝典(转帖)
  7. Moose File System分布文件系统测试
  8. 01_Java概述_public class和class的区别1
  9. cuSPARSE库:(十五)已经弃用的函数(1)
  10. 让低版本浏览器支持html5的标签
  11. UNIX编程艺术学习笔记-1
  12. ARM Linux ELF加壳方案
  13. 2022-2027年中国酒店餐饮行业市场调研及未来发展趋势预测报告
  14. 在AVD上运行程序时,程序闪退并报错unfortunately,xx has stopped
  15. RK3399 Android7.1修改安兔兔等读到的cpu最大频率为1.992GHz
  16. android手机号码恢复,安卓手机通讯录怎么恢复?教你恢复小妙招
  17. android平板哪个好用吗,明明知道iPad更实用,却坚持买安卓平板,是一种什么心态?...
  18. 牛视源码定制,抖音矩阵系统。come here
  19. Nodejs-npm
  20. Mac OS开发者软件清单

热门文章

  1. LightGBM详解
  2. 黑站利器——中国菜刀
  3. 怎么解压linux ext4文件,ext4解包和重新打包
  4. Java中的Unsafe类
  5. 复杂环境下结构光光条中心的几种提取方法
  6. python fileinput_Python文件替代fileinput模块
  7. 史上最强模型 GPT-4 上线:一张手绘草图能生一个网站、60 秒搞定一个游戏开发!...
  8. Java人的第一把锁——synchronized
  9. 【Java 8 新特性】Java Comparator.comparing | 提取对象属性,按照指定规则排序
  10. 【FlutterFlame游戏 - 拾伍】粒子系统 | ParticleSystemComponent