原理
k近邻法 k-nearest neighbor, k-NN 是一种基本分类与回归方法。
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
1
,
y
1
)
,
⋯
,
(
x
1
,
y
1
)
}
T =\left \{ (x_{1},y_{1}),(x_{1},y_{1}),\cdots ,(x_{1},y_{1}) \right \}
T={(x1,y1),(x1,y1),⋯,(x1,y1)}
实例的特征向量
x
i
∈
χ
⊆
ℜ
n
x_{i}\in \chi \subseteq \Re ^{n}
xi∈χ⊆ℜn
实例的类别
y
i
∈
Y
=
c
1
,
c
2
,
⋯
c
k
,
i
=
1
,
2
,
⋯
N
y_{i}\in Y = c_{1},c_{2},\cdots c_{k},i=1,2,\cdots N
yi∈Y=c1,c2,⋯ck,i=1,2,⋯N
输出:实例 x 所属的类 y
y
=
a
r
g
max
c
j
∑
x
i
∈
N
k
(
x
)
I
(
u
i
=
c
j
)
y = arg \max_{cj} \sum_{x_{i}\in N_{k}(x)}^{}I(u_{i} = c_{j})
y=argcjmaxxi∈Nk(x)∑I(ui=cj)
i
=
1
,
2
,
⋯
,
N
;
j
=
1
,
2
,
⋯
,
K
i=1,2,\cdots ,N; j=1,2,\cdots ,K
i=1,2,⋯,N;j=1,2,⋯,K
根据距离度量,涵盖实例 x 最近邻的 k 个点的邻域记做
N
k
(
x
)
N_{k}(x)
Nk(x)
简述步骤
- 给定一个训练数据集,有各自的分类标签。在训练过程中,分类器获取训练数据并简单地记住它
- 对于新的输入实例 X,kNN将其与所有训练数据进行比较,通过距离度量,在训练数据集中选取离它最近的 k 个实例
- 找到这k个实例所属种类最多的类别,则将该输入实例分到这个类中
三要素
距离度量
设特征空间
χ
\chi
χ是
n
n
n维实数向量空间
ℜ
n
\Re ^{n}
ℜn ,
x
i
,
x
j
∈
χ
x_{i},x _{j}\in\chi
xi,xj∈χ
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
⋯
x
i
(
n
)
)
T
x_{i} = (x_{i}^{(1)},x_{i}^{(2)},\cdots x_{i}^{(n)} )^{T}
xi=(xi(1),xi(2),⋯xi(n))T
x
j
=
(
x
j
(
1
)
,
x
j
(
2
)
,
⋯
x
j
(
n
)
)
T
x_{j} = (x_{j}^{(1)},x_{j}^{(2)},\cdots x_{j}^{(n)} )^{T}
xj=(xj(1),xj(2),⋯xj(n))T
x
i
,
x
j
x_{i},x_{j}
xi,xj的距离定义为
L
p
(
x
i
,
x
j
)
=
(
∑
l
=
1
n
∣
x
i
(
l
)
−
x
j
(
l
)
∣
)
1
p
L_{p}(x_{i},x_{j}) = (\sum_{l=1}^{n} \left | x_{i}^{(l)} - x_{j}^{(l)} \right | )^{\frac{1}{p} }
Lp(xi,xj)=(l=1∑n∣∣∣xi(l)−xj(l)∣∣∣)p1
即
L
p
L_{p}
Lp距离
当p=1是为曼哈顿距离;p=2时为欧氏距离
k 值的选择
- K选择较小的值
- 近似误差(训练集的误差)减小,估计误差(预测时的误差)增大
- 噪声敏感
- 模型变复杂,容易过拟合
- K选择较大的值
- 减少估计误差,近似误差增大
- 整体模型变简单
特殊情况 k=1时,称为最近邻算法
k近邻法没有显式的学习过程
分类决策规则
分类函数
f
:
ℜ
n
→
c
1
,
c
2
,
⋯
c
K
f:\Re ^{n}\to c_{1},c_{2},\cdots c_{K}
f:ℜn→c1,c2,⋯cK
误分类率
P
(
Y
≠
f
(
X
)
=
1
−
P
(
Y
=
f
(
X
)
)
P(Y\ne f(X)=1-P(Y=f(X))
P(Y=f(X)=1−P(Y=f(X))
1
k
∑
x
i
∈
N
k
(
x
)
I
(
y
i
≠
c
j
)
=
1
−
1
k
∑
x
i
∈
N
k
(
x
)
I
(
y
i
=
c
j
)
\frac{1}{k} \sum_{x_{i}\in N_{k}(x)} I(y_{i}\ne c_{j}) = 1 - \frac{1}{k} \sum_{x_{i}\in N_{k}(x)} I(y_{i}= c_{j})
k1xi∈Nk(x)∑I(yi=cj)=1−k1xi∈Nk(x)∑I(yi=cj)
f
(
X
)
f(X)
f(X)为分类函数
kd树
- kd树是一种对 K 维空间中的实例点进行存储以便对其进行快速检索的树形数据结构
- kd树是二叉树,表示对 K 维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。
公式 l = j ( m o d k ) + 1 l= j( \bmod k)+1 l=j(modk)+1
其中 j j j为树的深度, k k k是数据总维度,得到的 l l l是下一次切分所选择的维度。
注:kNN的k值选择和kd树两者的k之间没什么关系,kNN中的k是指在选取k个邻近的点进行表决,而kd-tree中的k是指一个样本数据的维度
查询
- 寻找当前最近点
- 从根节点出发,递归访问 kd 树,找出包含 x 的叶节点
- 以此节点为 “当前最近点”
- 回溯
- 若该节点比 “当前最近点” 距离目标点更近,更新 “当前最近点”
- 当前最近点一定存在于该节点一个子结点对应的区域,检查子节点的父节点的另一子节点对应的区域是否有更近的点
- 当回退回根节点时,搜索结束,最后的“当前最近点”即为最近邻点
kd 树搜索的平均计算复杂度是 O ( log N ) O(\log{N} ) O(logN)