K近邻法
k近邻法是一种基本分类(定性)与回归(定量)方法,它通过选择目标实例的k个最近邻实例,使用多数表决(定性分类)或均值计算(定量回归)等方法对目标实例进行预测。k近邻的回归是在分类基础上的拓展,因此我们仅对分类法进行分析。
上述内容可以说明k近邻法的几个关键问题
- k值的选择,即选择几个最近邻进行判断合适
- 距离度量,即怎样算最近邻实例
- 分类决策规则,即为什么要使用多数表决方法
- k-d树,数据的组织与查找算法。通过上述内容可以发现,k近邻法没有明显的函数可以利用实例的特征向量将实例映射到特定类别中,因此需要维护大量数据并进行实时处理,这要求我们对数据的组织与处理进行合理安排
k值的选择
k值通常采用交叉验证法来确定。交叉验证法将样本随机划分为训练集和测试集,通过对比不同k值时测试集的分类准确率来确定k值。一般k值取一个比较小的数值(3~10)。
距离度量
距离度量的选择有很多,对模型的准确率有很大的影响,应该根据实际情况进行选择。常见的距离度量方法
- 欧式距离:适用于低维数据且向量大小非常重要时
- 曼哈顿距离:当数据集具有离散或二进制属性时
分类决策规则
分类决策规则一般采用多数表决法,多数表决法的数学原理如下所示
设分类的损失函数为0-1损失函数,分类函数为
f
(
X
)
f(X)
f(X),那么误分类的概率为
P
(
Y
≠
f
(
X
)
)
=
1
−
P
(
Y
=
f
(
X
)
)
(1)
P(Y\neq f(X))=1-P(Y=f(X)) \tag 1
P(Y=f(X))=1−P(Y=f(X))(1)
目标实例的k个最近邻构成集合
N
k
(
x
)
N_k(x)
Nk(x),设涵盖该集合的区域所属类别为
c
j
c_j
cj,那么对k个最近邻的误分类率为
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
)
(2)
1/k\sum_{x_i\in N_k(x)} I(y_i\neq c_j)=1-1/k\sum_{x_i\in N_k(x)} I(y_i=c_j) \tag 2
1/kxi∈Nk(x)∑I(yi=cj)=1−1/kxi∈Nk(x)∑I(yi=cj)(2)
其中
I
(
x
)
I(x)
I(x)为指示函数,若x为true,
I
(
x
)
=
1
I(x)=1
I(x)=1,反之为0
要使误分类率最小,就要使 1 / k ∑ x i ∈ N k ( x ) I ( y i = c j ) 1/k\sum_{x_i\in N_k(x)} I(y_i=c_j) 1/k∑xi∈Nk(x)I(yi=cj)最大,等价于 c j c_j cj为k个最近邻中相同类最多的类,即多数表决
由(2)可知,多数表决规则等价于经验风险最小化
k-d树
k-d树是二叉树,表示对输入空间的一个划分。构造k-d树相当于不断地用垂直于坐标轴的超平面将输入空间进行切分,构成一系列的超矩形区域。可以看到,k-d树是基于欧式距离的,在搜索时的距离度量也是欧式距离,对于采用其他距离度量的情形并不直接适用。
构造
k-d树最典型的构造方法为随着树的深度轮流选择坐标轴,因此树的深度d和选择的坐标轴维度n的关系为
n
=
d
m
o
d
N
+
1
n=d\ mod\ N+1
n=d mod N+1
其中根结点的深度为0,即
d
≥
0
d\geq 0
d≥0;N为输入空间的维度,即
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
.
.
.
x
i
(
N
)
)
T
x_i=(x_i^{(1)},x_i^{(2)},...x_i^{(N)})^T
xi=(xi(1),xi(2),...xi(N))T
通常,选择训练实例点在选定坐标轴的中位数为切分点 x c u t x_{cut} xcut,这样得到的k-d树是平衡的,但平衡的k-d树在搜索时未必效率最优。 x i ( n ) < x c u t ( n ) x_i^{(n)}<x_{cut}^{(n)} xi(n)<xcut(n)的点划归左子树; x i ( n ) > x c u t ( n ) x_i^{(n)}>x_{cut}^{(n)} xi(n)>xcut(n)的点划归右子树,切分点放入根结点。对根结点的左右子树递归地执行以上算法,直至划分完全。
搜索
- 找到目标点x所属超矩形区域:从根结点出发,根据深度d选定坐标轴维度n与分支结点 x n o d e x_{node} xnode进行对比,当 x ( n ) < x n o d e ( n ) x^{(n)}<x_{node}^{(n)} x(n)<xnode(n)时搜索左子树;否则搜索右子树,直到叶子结点。
- 以此叶子结点为“当前最近点”
- 寻找最近点:以目标点x和“当前最近点”的距离(r)为半径做超球体,检查父结点 x f x_f xf另一子树的超矩形区域与超球体是否相交(若父结点深度为d,对应的超平面垂直的坐标轴维度为n,当 ∣ x f ( n ) − x ( n ) ∣ ≤ r |x_f^{(n)}-x^{(n)}|\leq r ∣xf(n)−x(n)∣≤r时,两个区域相交),相交时依次查访各个子区域是否有结点与目标结点的距离小于超球体半径,有的话设置该结点为“当前最近点”并更新超球体区域继续探寻;没有的话回退上层结点继续查访相交区域,直至根结点。
- 依次寻找其他最近点:参照以上步骤,在搜索时忽略已找到的最近点寻找次最近点