简介
以下我们将最远点采样(Farthest Point Sampling)简记为FPS。这种采样方法我觉得非常有趣。个人觉得比随机采样得到的数据能够表现更多的“轮廓性”,其次用的数据集也不像随机采样那么多。首先我们来介绍FPS的算法原理。
算法原理
1. 点与集合的距离
假设
S
=
{
x
1
,
⋯
,
x
N
}
⊂
R
n
S=\left\{x_1,\cdots,x_N\right\}\subset \mathbb{R}^n
S={x1,⋯,xN}⊂Rn 中的一个有限点集合。一般情况,这里的
n
n
n等于1,2, 3。点与点的距离我们知道可以用坐标来表示。比如假设
a
=
(
a
1
,
⋯
,
a
n
)
,
b
=
(
b
1
,
⋯
,
b
n
)
a=(a_1,\cdots,a_n),b=(b_1,\cdots,b_n)
a=(a1,⋯,an),b=(b1,⋯,bn)是
R
n
\mathbb{R}^n
Rn中的两个点,则
a
,
b
a,b
a,b之间的距离
d
(
a
,
b
)
d(a,b)
d(a,b)可以定义成
d
(
a
,
b
)
=
(
a
1
−
b
1
)
2
+
⋯
+
(
a
n
−
b
n
)
2
d(a,b)=\sqrt{(a_1-b_1)^2+\cdots+(a_n-b_n)^2}
d(a,b)=(a1−b1)2+⋯+(an−bn)2
类似地,我们可以定义点与集合的距离。假设点的坐标为
y
=
(
y
1
,
⋯
,
y
n
)
y=(y_1,\cdots,y_n)
y=(y1,⋯,yn),则
y
y
y到
S
S
S的距离
d
(
y
,
S
)
d(y,S)
d(y,S)可以定义成
d
(
y
,
S
)
=
min
x
i
∈
S
d
(
y
,
x
i
)
d(y,S)=\min_{x_i\in S}d(y,x_i)
d(y,S)=xi∈Smind(y,xi)这其实也很好理解,说白了点到集合的距离就是这个点到这个集合里的点的最短的那个距离。这个这个定义不仅仅局限于有限集合,当
S
S
S 是一个无限集合时,只需把上面的
min
\min
min改成
inf
\inf
inf即可。比如当S是直线时候,点到直线的距离就被定义成所作垂线段的距离。
2. FPS算法步骤
FPS的目的是希望在有限集合 S S S里面找一个具有m个元素的子集合 { x i 0 , x i 1 , ⋯ , x i m } \left\{x_{i_0},x_{i_1},\cdots,x_{i_m}\right\} {xi0,xi1,⋯,xim}使得 x i j x_{i_j} xij到集合 { x i 0 , x i 1 , ⋯ , x i j − 1 } \left\{x_{i_0},x_{i_1},\cdots,x_{i_{j-1}}\right\} {xi0,xi1,⋯,xij−1}的距离最大。这里 x i 0 x_{i_0} xi0可以随意。
- 随机取一个点 x i 0 x_{i_0} xi0.
- 在 S − x i 0 S-x_{i_0} S−xi0这个集合里选取一点 x i 1 x_{i_1} xi1使得 d ( x i 1 , x i 0 ) d(x_{i_1},x_{i_0}) d(xi1,xi0)达到最大。
- 我们已经选好了 x i 0 , x i 1 x_{i_0},x_{i_1} xi0,xi1,下面我们开始选择 x i 2 x_{i_2} xi2.记 S 1 = { x i 0 , x i 1 } S_1=\left\{x_{i_0},x_{i_1}\right\} S1={xi0,xi1}。 x i 2 x_{i_2} xi2定义成使得 d ( x , S 1 ) d(x,S_1) d(x,S1)最大的 S − S 1 S-S_1 S−S1中的点。
- 以此类推,我们可以定义 x i 3 , ⋯ , x i m x_{i_3},\cdots,x_{i_m} xi3,⋯,xim.