综述
k-NN: k-nearest neighbor
输入: 实例的特征向量
输出: 实例的类别(可以有多类)
三要素: k值的选择, 距离度量, 分类决策规则
1. k近邻算法
该算法没有显式的学习过程.
算法描述: 给定一个训练集, 对新的输入实例, 在训练数据集中找出与该实例距离最近的k个实例, 这k个实例的多数属于哪个类, 那么这个新的输入实例就属于哪个类. (当k=1时, k近邻算法变为最近邻算法)
输入: 训练数据集
T={(x1,y1),...,(xN,yN)}
T
=
{
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
}
(其中
xi∈χ⊆Rn
x
i
∈
χ
⊆
R
n
为实例的特征向量,
yi∈Y={c1,...,cK}
y
i
∈
Y
=
{
c
1
,
.
.
.
,
c
K
}
为实例的类别)和实例特征向量x.
输出: 实例x所属的类y.
(1) 根据给定的距离度量, 找出T中距离x最近的k个点, 把涵盖这k个点的x的邻域记作
Nk(x)
N
k
(
x
)
(2) 在
Nk(x)
N
k
(
x
)
中根据分类决策规则(eg.多数表决)决定x的类别y:
y=argmaxcj∑xi∈Nk(x)I(yi=cj)
y
=
a
r
g
max
c
j
∑
x
i
∈
N
k
(
x
)
I
(
y
i
=
c
j
)
2. k近邻模型
k近邻模型实质上是对特征空间进行划分.
2.1 模型
三个基本要素: 距离度量, k值的选择, 分类决策规则.
2.2 距离度量
Lp距离
Lp(xi,xj)=(∑l=1n|xli−x(l)j|p)1p
L
p
(
x
i
,
x
j
)
=
(
∑
l
=
1
n
|
x
i
l
−
x
j
(
l
)
|
p
)
1
p
p=2时, Lp距离称为欧式距离
p=1时, Lp距离称为曼哈顿距离
p=∞时, Lp距离表示各个坐标距离的最大值:
L∞(xi,xj)=maxl|x(l)i−x(l)j|
L
∞
(
x
i
,
x
j
)
=
max
l
|
x
i
(
l
)
−
x
j
(
l
)
|
2.3 k值的选择
近似误差: 模型对已知的训练数据的分类误差.
估计误差: 模型对未知的测试数据的分类误差.
2.3.1 选择较小的k值
- 近似误差减小.
- 估计误差增大, eg.如果邻近的点恰巧是噪声, 就会预测错误.
- 模型变的复杂, 容易发生过拟合.
2.3.2 选择较大的k值
- 近似误差增大, 因为与实例相距很远的实例点也被考虑在内.
- 估计误差减小.
- 模型变得简单.
2.4 分类决策规则
多数表决: 等价于经验风险(模型关于训练集的平均损失)最小化
3. k近邻法的实现: kd树
实现k近邻算法, 主要考虑的问题是如何进行快速k近邻搜索. kd树可以有效减少搜索的计算量.
适用场景: 训练实例数远大于空间维数.
3.1 构造kd树
算法描述
输入: k维空间的数据集
T={x1,...,xN}
T
=
{
x
1
,
.
.
.
,
x
N
}
, 其中
xi=(x(1)i,...,x(k)i)T
x
i
=
(
x
i
(
1
)
,
.
.
.
,
x
i
(
k
)
)
T
输出: kd树
(1) 开始阶段: 构造根节点, 根节点对应于包含T的k维空间的超矩形区域. 选择
x(1)
x
(
1
)
为坐标轴, 找到T中所有实例的
x(1)
x
(
1
)
的中位数, 以此作为切分点. 用过切分点且与
x(1)
x
(
1
)
坐标轴垂直的超平面把根结点对应的超矩形区域一分为二, 生成深度为1的两个子节点(对应两个子区域).
(2) 重复阶段: 对深度为j的节点, 选择
x(l)
x
(
l
)
为切分的坐标轴(
l=j(modk)+1
l
=
j
(
m
o
d
k
)
+
1
), 切分方法与开始阶段的相同. 节点的名字为落在切分平面上的实例的名字.
(3) 直到两个子节点(区域)没有实例的时候停止.
算法举例
3.2 搜索kd树
以最近邻为例讨论.
算法描述
输入: 已构造的kd树和目标点x.
输出: x的最近邻.
(1) 在kd树中找到包含目标点x的叶结点: 从根结点出发, 一层一层地向下访问kd树, 每一层都对应一个维度
x(l)
x
(
l
)
, 在这个维度上比较x和切分点, 如果x小, 就把x移动到左子节点, 否则移动到右子节点. 直到到达叶结点为止.
(2) 以此叶节点作为”当前最近点”
(3) 递归地向上搜索, 对每个节点进行如下操作: 检查该子节点的父节点的另一个子节点对应的区域中是否有更近的点, 即检查另一子节点的区域是否与球体相交(该球体以目标点为圆心, 以目标点和”当前最近点”间的距离为半径). 如果相交, 则把”当前最近点”变为该点.
(4) 当回到根节点的时候搜索结束. 最后的”当前最近点”即为x的最近邻点.
算法举例
给定一个kd树, 根节点是A, 子结点是B,C等. 另有一个输入实例点S, 求S的最近邻.
搜索方法:
找到包含S的叶节点D, 则真正的最近邻一定在上图中圆圈的内部(但此时计算机还不知道圈内有E)
返回D的父节点B, B区域和圆有交集. 在B的另一子节点F的区域中搜索最近邻, 因为F区域和圆不想交, 故F不是最近邻.
返回B的父节点A, A的子节点C的区域和圆相交. E在圈内, 故E为最近邻.