k近邻法
1、k近邻算法
输入: 训练集数据
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}
T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,
x
i
∈
X
⊆
R
n
x_i \in X \subseteq R^n
xi∈X⊆Rn 是实例的特征向量,
y
i
∈
Y
=
{
c
1
,
c
2
,
.
.
.
,
c
K
}
y_i \in Y = \{c_1,c_2,...,c_K\}
yi∈Y={c1,c2,...,cK} 是实例的类别,
i
=
1
,
2
,
.
.
.
,
N
i=1,2,...,N
i=1,2,...,N
输出:实例
x
x
x 所属的类
y
y
y。
(1)根据给定的距离度量,在训练集
T
T
T 中找出与
x
x
x 最邻近的
k
k
k 个点,涵盖这
k
k
k 个点的
x
x
x 的邻域记作
N
k
(
x
)
N_k(x)
Nk(x);
(2)在
N
k
(
x
)
N_k(x)
Nk(x) 中根据分类决策规则决定(如多数表决)
x
x
x 的类别
y
y
y:
y
=
a
r
g
m
a
x
c
j
∑
x
i
∈
N
k
(
x
)
I
(
y
i
=
c
j
)
,
i
=
1
,
2
,
.
.
.
,
N
;
j
=
1
,
2
,
.
.
.
,
K
y= \underset{c_j}{arg\ max} \sum_{x_i \in N_k(x)} I(y_i=c_j),\ i=1,2,...,N; j=1,2,...,K
y=cjarg maxxi∈Nk(x)∑I(yi=cj), i=1,2,...,N;j=1,2,...,K
其中
I
I
I 是指示函数,当
y
i
=
c
j
y_i=c_j
yi=cj 时
I
I
I 为1,否则
I
I
I 是0。
2、k近邻模型
模型三要素:度量距离、k值、分类决策规则。
- 距离度量
距离反应了两个实例点之间相似程度。常见距离有 L p L_p Lp 距离、Minkowski距离、欧式距离。
X X X 是 n 维实数向量空间 R n R^n Rn, 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-
L
p
L_p
Lp距离定义为:
L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p ) 1 p L_p(x_i,x_j)=(\sum_{l=1}^{n}|x_i^{(l)}-x_j^{(l)}|^p)^{\frac{1}{p}} Lp(xi,xj)=(l=1∑n∣xi(l)−xj(l)∣p)p1 - 曼哈顿距离,上式中 p = 1 p=1 p=1
- 欧式距离,上式中 p = 2 p=2 p=2
- 当
p
=
∞
p=\infty
p=∞ 时是各个坐标距离的最大值,即
L ∞ ( x i , x j ) = m a x l ∣ x i ( l ) − x j ( l ) ∣ L_{\infty}(x_i,x_j)=\underset{l}{max}|x_i^{(l)}-x_j^{(l)}| L∞(xi,xj)=lmax∣xi(l)−xj(l)∣
-
L
p
L_p
Lp距离定义为:
- k值选择
k值的选择对结果产生重大影响
注: 近似误差,可以理解训练集的训练误差。估计误差,可以理解为对测试集的测试误差。k值 近似误差 估计误差 模型复杂度 说明 k值较小 减小 增大 模型复杂化 对近邻点敏感,容易过拟合 k值较大 增大 减小 模型简单化 邻域中不相似的点干扰分类结果
在应用中一般 k k k 选择较小的值,使用交叉验证法选取最优值。 - 分类决策规则
多数表决规则(等价于经验最小化)
3、k近邻的实现:kd 树
平衡 kd 树构造算法:
输入:k 维空间数据集
T
=
{
x
1
,
x
2
,
.
.
.
,
x
N
}
T=\{x_1,x_2,...,x_N\}
T={x1,x2,...,xN}
输出:kd 树
(1)开始构造根节点,根节点包含所有样例点的超矩形;选择
x
(
1
)
x^{(1)}
x(1) 为坐标轴,以 T 中所有实例
x
(
1
)
x^{(1)}
x(1) 的中位数为切分点,将根节点对应的超矩形切分为两个子区域。切分由过
x
(
1
)
x^{(1)}
x(1) 中位数的点且垂直于
x
(
1
)
x^{(1)}
x(1) 轴的超平面实现。
以根节点生成深度为1的左、右结点:左子树对应
x
(
1
)
x^{(1)}
x(1) 的坐标小于切分点的子区域,右子树对应
x
(
1
)
x^{(1)}
x(1) 大于切分点的子区域。
将落在超平面上的点放在根节点中。
(2)重复:深度的为 j 的结点,选择
x
l
x_{l}
xl 为切分的坐标轴,其中
l
=
j
m
o
d
k
+
1
l=j\ mod\ k\ + 1
l=j mod k +1 。选择
x
(
l
)
x^{(l)}
x(l) 的中位数作为切分点。
(3)直到两个顶点之间没有实例存在时停止,从而形成 kd 树。
kd 树邻近搜索
输入:kd 树;目标点 x
输出:x 的最近邻点
(1)在 kd 树中搜索包含 x 的叶子结点;
(2)以此叶结点为当前最近叶结点;
(3)递归回退,进行如下操作:
(a)若该结点保存的实例比当前最近结点更靠近目标点,则以该实例为“当前最近点”;
(b)当前最近点一定存在于该结点一个子结点对应的区域内。检查该结点的父结点的另一个子结点对应的区域是否有更近的点。具体来说就是检出另一个结点对应的区域是否与以目标点为中心、目标点到“当前最近点”间的距离为半径的超球体相交。
若相交则移动到另一个结点,接着递归搜索最近邻搜索。
(4)当回退到根节点,搜素结束。