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)=a∈Amaxb∈Bmin∥a−b∥
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)=b∈Bmaxa∈Amin∥b−a∥
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. ]])