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

前言:
今天心血来潮想做一期关于距离计算公式的博文,思来想去什么办法才能证明自己理解了呢,一想如果自己能用大白话把这些公式讲出来,还能让别人听懂,那么自己应该就算是掌握了。为了挑战一下难度博主还将这些距离公式自己证明了一遍,为了简单易懂将全使用初中就学过的知识来进行推导,这里主要讲了六个常用的距离计算公式,距离公式在机器学习的近邻算法中会经常使用,万物都有起源,了解了原理再怎么变化也都不难,所以基础很重要。好了话不多说,开始吧:

一. 欧式距离

  • 其实这个名字听起来很高大上,但是其实你在初中的时候就用过了,只是那时还没给他一个官方的名字。你肯定做过这样的题,在直角坐标系中给定两点A(x1,y1),B(x2,y2)A(x_1,y_1),B(x_2,y_2)然后让你计算两个点之间的距离。老师肯定也教过你这个公式 d=(x1x2)2+(y1y2)2d=\sqrt{(x_1 - x_2)^2+(y_1-y_2)^2}。通过公式代入两个点的坐标,这样可以很轻而易举的就算出两点之间的距离,但是你知道公式是怎么来的吗,不知道吧?那让们来推导一遍:

  • 一维时:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    当坐标轴只有一个维度时计算两点的距离非常简单,只需要用d=x1x2d=|x_1-x_2|即可得到两点之间的距离。

  • 二维时:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    根据画图显然我们知道

    AC=y2y1|AC| = |y_2-y_1|

    BC=x2x1|BC| =|x_2-x_1|

    再由勾股定理 c2=a2+b2c^2=a^2+b^2

    AB2=AC2+BC2|AB|^2=|AC|^2+|BC|^2

    AB=AC2+BC2|AB|=\sqrt{|AC|^2+|BC|^2}

那么我们就有了二维平面上两点的距离公式:
d=(x1x2)2+(y1y2)2d=\sqrt{(x_1 - x_2)^2+(y_1-y_2)^2}

  • 三维时:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    在这个三维坐标系中我们要求AB两点之间的距离,在上图中博主为了方便理解添加了辅助平面,和辅助线,从图中我们可以看出:
    AC=z1z2|AC|=|z_1-z_2|

    DC=y1y2|DC|=|y_1-y_2|

    DB=x1x2|DB|=|x_1-x_2|
    还可以看出BDCE是在一个平面上的

    那么在RtBDCRt\triangle BDC中可由勾股定理得:

    BC=DB2+DC2=(y1y2)2+(x1x2)2|BC|=\sqrt{|DB|^2+|DC^2|}=\sqrt{(y_1-y_2)^2+(x_1-x_2)^2}

    同理在RtABCRt\triangle ABC中可得:

    AB=BC2+AC2=(x1x2)2+(y1y2)2+(z1z2)2|AB|=\sqrt{|BC|^2+|AC|^2}= \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}

    于是我们就得到了三维坐标系中的两点距离公式为:

    d=(x1x2)2+(y1y2)2+(z1z2)2d= \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}

  • 多维时:
    由于我们处在三维的空间中,在纸上也最多只能表示到三维,但是通过我们前面对三个维度中的距离公式分析,我们将三个维度的距离公式整理一下
    一维(这里稍微变下形):d1=(x1x2)2d_1=\sqrt{(x_1-x_2)^2}
    二维:d2=(x1x2)2+(y1y2)2d_2=\sqrt{(x_1 - x_2)^2+(y_1-y_2)^2}
    三维:d3=(x1x2)2+(y1y2)2+(z1z2)2d_3= \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}
    总结一下上面规律那么我们就可以把维度推广到 n 维:
    dn=(x1x2)2+(y1y2)2++(n1n2)2d_n=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+\cdots+(n_1-n_2)^2}
    在整理一下便是标准的欧式公式了:
    dist(X,Y)=i=1n(XiYi)2\displaystyle dist(X,Y)=\sum_{i=1}^n\sqrt{(X_i-Y_i)^2}

二.曼哈顿距离

  • 曼哈顿距离是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。这个距离公式的产生是根据当时曼哈顿这种城市交通道路错综复杂的情况下,我们出租车记表的距离,当然我们也来简单的推导一下:

  • 一维时:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    很明显在这样的道路上我们AB两个地点的距离便是:
    d1=x1x2d_1=|x_1-x_2|

  • 二维时:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    因为道路的周边是高楼,出租车只能跟着道路行驶,那么A到B之间的最短路径只能是:
    d2=x1x2+y1y2d2=|x_1-x_2|+|y_1-y_2|

  • 三维时:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    图中我们处在一个三维的空间中,现在有AB两个点,我们用曼哈顿距离来表示AB之间的距离可以表示为:
    d3=x1x2+y1y2+z1z2d3=|x_1-x_2|+|y_1-y_2|+|z_1-z_2|

  • n维时:
    根据前面我们找到的规律,可以很轻松的就推导出n维时曼哈顿距离公式为:
    dn=x1x2+y1y2++n1n2d_n=|x_1-x_2|+|y_1-y_2|+\cdots+|n_1-n_2|
    简化合并一下
    dist(X,Y)=i=0nXiYi\displaystyle dist(X,Y)=\sum_{i=0}^n|X_i-Y_i|

三.切比雪夫距离

  • 什么是切比雪夫距离
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    玩过国际象棋的小伙伴应该都知道,在国际象棋中,皇后是走的米字形,也就是说它可以往8个方向移动任意步数,
    切比雪夫距离表示的就是棋盘中两个皇后之间的最短距离;
    举几个例子你就明白了:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    这时两个皇后之间的最短距离就是斜线格数也就是两个,此时两个皇后在横坐标轴上的距离差为2,纵坐标轴上的距离之差为2
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    在这种情况下显然红色路线是走不通的,绿色的线路就是两个皇后的最短距离了,距离为 4 ,此时两个皇后横坐标轴方向的距离差为1,纵坐标轴的距离差为 4.
    所以就推广出了棋盘中的两个皇后的最短距离为:
    d=max(x1x2,y1y2)d=max(|x_1-x_2|,|y_1-y_2|)
    那么我们再把它推广到n维的情况就是切比雪夫距离:
    dist(X,Y)=max({XiYi  i[1,n) })\displaystyle dist(X,Y)=\max(\{|X_i-Y_i|\ \ i\in[1,n)\ \})

四. 闵可夫斯基距离

  • 对于闵可夫斯基距离来说,与其说它是一个距离公式倒不如说它是一组距离公式,为什么这么说呢?
  • 看他的定义就知道了
    dist(X,Y)=i=1nXiYipp   \displaystyle dist(X,Y)=\sqrt[p\ \ \ ]{\sum_{i=1}^n|X_i-Y_i|^p}
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    在二维平面中我们能够很轻易的就可以表示出前面三种距离,根据上图你可以很清晰的看出它们之间的关系,对于闵可夫斯基距离举例来说,我们发现了它有三个性质:
    (1)p=1p=1 时 闵可夫斯基距离就会变成:
    dist(X,Y)=i=1nXiYi11   =i=1nXiYi\displaystyle dist(X,Y)=\sqrt[1\ \ \ ]{\sum_{i=1}^n|X_i-Y_i|^1}=\sum_{i=1}^n|X_i-Y_i|
    是不很熟悉?其实这就是曼哈顿距离公式
    (2)p=2p=2 时 闵可夫斯基距离就会变成:
    dist(X,Y)=i=1nXiYi22   =i=1nXiYi2\displaystyle dist(X,Y)=\sqrt[2\ \ \ ]{\sum_{i=1}^n|X_i-Y_i|^2}=\sqrt{\sum_{i=1}^n|X_i-Y_i|^2}
    那么就是欧式距离公式
    (2)pp\rightarrow\infty 时 闵可夫斯基距离就会变成:
    dist(X,Y)=i=1nXiYi=max({XiYi  i[1,n) })\displaystyle dist(X,Y)=\sqrt[\infty ]{\sum_{i=1}^n|X_i-Y_i|^\infty}=\max(\{|X_i-Y_i|\ \ i\in[1,n)\ \})
    它通过极限的思想可以推到出,当趋近于无穷时候就是切比雪夫距离公式

五. 杰卡德距离

  • 这个距离公式常用于相关性的计算,比如大名鼎鼎的协同过滤算法中就有它的身影
  • 在计算A,B两个集合它们之间的交集占它们的并集的比例时,我们就称这个比例为两个集合的相似数。
    也就是杰卡德相似系数公式:
    J(A,B)=ABABJ(A,B)=\frac{|A \cap B|}{|A\cup B|}
  • 与杰卡德相似系数相反,用两个集合不同元素的个数占两个集合并集个数的比例来表示两个集合的区分度。
    也就是杰卡德距离公式:
    Jδ=1J(A,B)=ABABABJ_\delta=1-J(A,B)=\frac{|A\cup B|-|A \cap B|}{|A\cup B|}

六. 余弦距离公式

  • 这个公式应该很多小伙伴都很熟悉,高中就学过余弦定理,正弦定理,由于文章开头就立下誓言就算时初中也能听懂,这里就普及一下余弦定理,和正弦定理,会的小伙伴也可以跟着巩固一下,我会使用初中就学过的知识进行推导:

  • 正弦定理:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    如图现在我们有一个ABC\triangle ABC,然后现在需要在其外部做一个外接圆,圆心为O点,圆的半径为R。
    作辅助线:
    连接BO并延长这条线与圆相较于D点,然后连接AD;
    证明:
    ∵ BD为圆的直径,所以BAD=90°\angle BAD=90\degree

    ∴ 在RtBADRt\triangle BAD中,sinD=ABBD=AB2R\sin{\angle{D}}=\frac{|AB|}{|BD|}=\frac{|AB|}{|2R|}

    2R=ABsinD\displaystyle 2R=\frac{|AB|}{\sin{\angle{D}}}

    ∵ 在圆中同一个弧对应的圆周角相等

    AB\overset{\frown} {AB}对应的圆周角D=C\angle{D}=\angle{C}

    ∴ 再联合前面的推论有 sinC=sinD=AB2R\sin{\angle{C}}=\sin{\angle{D}}=\frac{|AB|}{|2R|}

    2R=ABsinC\displaystyle 2R=\frac{|AB|}{\sin{\angle{C}}}

    同理如果再做辅助线AO延伸到与圆相交于E点,再连接CE,也就可以证明出:

    2R=ACsinB\displaystyle 2R=\frac{|AC|}{\sin{\angle{B}}}

    如果作辅助线CO并延伸到于圆相交于点F,再连接BF,那么也可以证明出:

    2R=BCsinA\displaystyle 2R=\frac{|BC|}{\sin{\angle{A}}}

    那么再联合三条推论,就可得出正弦定理:

    2R=BCsinA=ACsinB=ABsinC\displaystyle 2R=\frac{|BC|}{\sin{\angle{A}}}=\frac{|AC|}{\sin{\angle{B}}}=\frac{|AB|}{\sin{\angle{C}}}

  • 余弦定理:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂
    现在我们有一个ABC\triangle{ABC}
    先作辅助线:
    过定点A作一条垂线,与BC相交于D点,ADBCAD\perp BC
    证明:
    ∵ 在RtADCRt\triangle{ADC}中,DC=AC×cosC|DC|=|AC|\times\cos{\angle{C}}

    BD=BCDC=BCAC×cosC|BD|=|BC|-|DC|=|BC|-|AC|\times\cos{\angle{C}}

    ∵ 在RtADCRt\triangle{ADC}中,AD=AC×sinC|AD|=|AC|\times\sin{\angle{C}}

    又∵ 在RtADBRt\triangle{ADB}中,AB2=AD2+BD2|AB|^2=|AD|^2+|BD|^2

    AB2=(AC×sinC)2+(BCAC×cosC)2|AB|^2=(|AC|\times\sin{\angle{C}})^2+(|BC|-|AC|\times\cos{\angle{C}})^2

    AB2=AC2×sinC2+BC22×BC×AC×cosC2+AC2×cosC2|AB|^2=|AC|^2|\times\sin{\angle{C}}^2+|BC|^2-2\times|BC|\times|AC|\times\cos{\angle{C}}^2+|AC|^2\times\cos{\angle{C}}^2

    AB2=AC2×(sinC2+cosC2)2×BC×AC×cosC2+BC2|AB|^2=|AC|^2\times(\sin{\angle{C}}^2+\cos{\angle{C}}^2)-2\times|BC|\times|AC|\times\cos{\angle{C}}^2+|BC|^2

    AB2=AC22×BC×AC×cosC2+BC2|AB|^2=|AC|^2-2\times|BC|\times|AC|\times\cos{\angle{C}}^2+|BC|^2

    再把其中的边用一个小写字母表示就变成了标准的余弦公式了:

    c2=a2+b22abcosC\displaystyle c^2=a^2+b^2-2ab\cos{C}

    变下形:

    cosC=a2+b2c22ab\displaystyle \cos{C}=\frac{a^2+b^2-c^2}{2ab}

    现在有了上面的公式,我们再回到直角坐标系中来看:
    近邻算法常用距离公式与推导(内附证明)初中生也能看懂

根据前面讲的欧式公式我们很轻易的求出下面几个向量的长度:

AB=(x1x2)2+(y1y2)2|\overrightarrow{A B}|=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

OB=(x20)2+(y20)2|\overrightarrow{O B}|=\sqrt{(x_2-0)^2+(y_2-0)^2}

OA=(x10)2+(y10)2|\overrightarrow{O A}|=\sqrt{(x_1-0)^2+(y_1-0)^2}

那么我们再根据余弦定理公式可得:

cosBOA=OA2+OB2AB22×OB×OA\displaystyle \cos{\angle{BOA}}=\frac{|\overrightarrow{O A}|^2+|\overrightarrow{O B}|^2-|\overrightarrow{A B}|^2} {2\times|\overrightarrow{O B}|\times|\overrightarrow{O A}|}

cosBOA=(x12+y12)+(x22+y22)((x1x2)2+(y1y2)2)2×x22+y22×x12+y12\displaystyle \cos{\angle{BOA}}=\frac{(x_1^2+y_1^2)+(x_2^2+y_2^2)-((x_1-x_2)^2+(y_1-y_2)^2)}{2\times\sqrt{x_2^2+y_2^2}\times\sqrt{x_1^2+y_1^2}}

再整理一下就变成了二维平面上的余弦距离公式了(也称向量夹角公式)

cosBOA=x1x2+y1y2x22+y22x12+y12\displaystyle \cos{\angle{BOA}}=\frac{x_1x_2+y_1y_2}{\sqrt{x_2^2+y_2^2}\sqrt{x_1^2+y_1^2}}

把上面的公式推广到 n维:

cos(θ)=i=1nXiYii=1nXii=1nYi\displaystyle \cos{(\theta)}=\frac{\sum_{i=1}^n{X_iY_i}}{\sqrt{\sum_{i=1}^n{X_i}}\sqrt{\sum_{i=1}^n{Y_i}}}

上面这个就是通用的余弦距离公式了。
其实它又被称为余弦夹角公式,主要在几何中可以用来衡量两个向量方向的差异。

最后说的话:
如果你觉得这篇文章还不错,对你有帮助不妨点个赞再走呗(●’◡’●)!
如有发现错误,还请小伙伴指出来,不胜感激!