Hausdorff 距离

1. 定义

给定欧氏空间中的两点集 A = { a 1 , a 2 , . . . } \rm A=\left \{a_1, a_2,... \right\} A={a1,a2,...} B = { b 1 , b 2 , . . . } \rm B=\left \{b_1, b_2,... \right\} B={b1,b2,...} H a u s d o r f f {\rm Hausdorff} Hausdorff 距离就是用来衡量这两个集合间的距离,定义其公式为:
H ( A , B ) = m a x [   h ( A , B ) , h ( B , A )   ] {\rm H\left (A,B\right)}={\rm max}\left [\:h(A,B), h(B,A)\: \right] H(A,B)=max[h(A,B),h(B,A)]
其中, h ( A , B ) = m a x a ∈ A   m i n b ∈ B ∥ a − b ∥ \rm h\left(A,B\right)=\underset{a\in A}{max} \: \underset{b\in B}{min} \left \|a-b \right \| h(A,B)=aAmaxbBminab h ( B , A ) = m a x b ∈ B   m i n a ∈ A ∥ b − a ∥ \rm h\left(B,A\right)=\rm\underset{b\in B}{max} \: \underset{a\in A}{min} \left \|b-a \right \| h(B,A)=bBmaxaAminba H ( A , B ) \rm H \left(A,B\right) H(A,B) 称为双向 H a u s d o r f f {\rm Hausdorff} Hausdorff距离 h ( A , B ) \rm h \left(A,B\right) h(A,B)称为从集合 A \rm A A到集合 B \rm B B的单向 H a u s d o r f f {\rm Hausdorff} Hausdorff距离,同理, h ( B , A ) {\rm h \left(B,A\right)} h(B,A)称为从集合 B {\rm B} B到集合 A {\rm A} A的单向 H a u s d o r f f {\rm Hausdorff} Hausdorff距离。

2. 通过例子理解该定义

详见该篇blog中的例子:
https://blog.csdn.net/maizousidemao/article/details/105030333?ydreferer=aHR0cHM6Ly9ibG9nLnNjaWVuY2VuZXQuY24v

理解 H a u s d o r f f {\rm Hausdorff} Hausdorff衡量距离的计算逻辑后,在使用时,可以直接用Python包👇🏻
(看完例子还不懂怎么计算的,看下面的解释)

3. 用Python计算 H a u s d o r f f {\rm Hausdorff} Hausdorff距离

  • 导入第三方包👇🏻
from scipy.spatial.distance import directed_hausdorff
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import euclidean_distances
  • 官方给出的算例,给定两个集合 u \rm u u v \rm v v👇🏻
u = np.array([(1.0, 0.0),
              (0.0, 1.0),
              (-1.0, 0.0),
              (0.0, -1.0)])
v = np.array([(2.0, 0.0),
              (0.0, 2.0),
              (-2.0, 0.0),
              (0.0, -4.0)])
  • 调用函数directed_hausdorff(u,v),求得单向 H a u s d o r f f {\rm Hausdorff} Hausdorff距离,并计算双向 H a u s d o r f f {\rm Hausdorff} Hausdorff距离👇🏻
directed_hausdorff(u,v)  # 计算u到v的单向Hausdorff距离
--->输出为:(2.23606797749979, 3, 0)

directed_hausdorff(v,u)  # 计算v到u的单向Hausdorff距离
--->输出为:(3.0, 3, 3)

hausdorff_distance = max(directed_hausdorff(u,v)[0],directed_hausdorff(v,u)[0]) #  计算u与v之间的双向Hausdorff距离
print(hausdorff_distance)
--->输出为:(3.0)

4. 结果解释与理解

(1) 关于directed_hausdorff(u,v)输出值的解释。

  •        \;\;\; 结果 ( 2.236 , 3 , 0 ) (2.236, 3, 0) (2.236,3,0)中,第1个值指 u \rm u u v \rm v v的单向 H a u s d o r f f \rm Hausdorff Hausdorff距离为2.236,第2和3个值指的是,产生距离为2.236的两个数据点分别在集合 u \rm u u和集合 v \rm v v中的位置,如 ( 3 , 0 ) (3,0) (3,0)指的是 u 3 = [ 0 , − 1 ] \rm u_3=[0,-1] u3=[0,1] v 0 = [ 2 , 0 ] \rm v_0=[2,0] v0=[2,0]
  •        \;\;\; 结果 ( 3.0 , 3 , 3 ) (3.0, 3, 3) (3.0,3,3)同理,第1个值指 v \rm v v u \rm u u的单向 H a u s d o r f f \rm Hausdorff Hausdorff距离为3,第2和3个值指的是,产生距离为3的两个数据点分别在集合 u \rm u u和集合 v \rm v v中的位置,如 ( 3 , 0 ) (3,0) (3,0)指的是 v 3 = [ 0 , − 4 ] \rm v_3=[0,-4] v3=[0,4] u 3 = [ 0 , − 1 ] \rm u_3=[0,-1] u3=[0,1]

(2)手算该过程,直观地解释。
在这里插入图片描述
(3) 辅助理解。计算 u \rm u u v \rm v v v \rm v v u \rm u u之间的欧氏距离,更容易了解该过程。下述结果👇🏻一一对应上图中的手算结果。

euclidean_distances(u,v)  # 
---->输出为:
array([[1.        , 2.23606798, 3.        , 4.12310563],
       [2.23606798, 1.        , 2.23606798, 5.        ],
       [3.        , 2.23606798, 1.        , 4.12310563],
       [2.23606798, 3.        , 2.23606798, 3.        ]])
       
euclidean_distances(v,u)
--->输出为:
array([[1.        , 2.23606798, 3.        , 2.23606798],
       [2.23606798, 1.        , 2.23606798, 3.        ],
       [3.        , 2.23606798, 1.        , 2.23606798],
       [4.12310563, 5.        , 4.12310563, 3.        ]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值