概述
- 是基本的回归分类模型,此处只讨论分类
- 输入:特征向量
- 输出:分类类别,可以为多类
- KNN没有显示学习过程
- KNN的三个基本要素
- k值选择
- 距离度量
- 分类决策规则
模型
模型三要素:k值选择, 距离度量,分类决策规则
模型
当训练集,距离度量,k值,分类决策规则确定后,对于任何一个新的输入,其分类是确定的的。相当于这些要素间将特征空间划分为一些子空间,确定了每个子空间里每个点的类别。
特征空间中,每个训练点 x i x_i xi,距离该点比其他点更近的所有点组成的一个区域,叫做单元(cell),每个训练实例有一个单元,所有训练实例点的单元构成对特征空间的一个划分。
距离度量
一般使用欧氏距离,也可使用 L p L_p Lp距离,或Minkowski距离。
-
L
p
距
离
L_p距离
Lp距离
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 ∣ p ) 1 p , p ≥ 1 L_p(x_i,x_j)=(\sum^n_{l=1}|x_i^{l}-x_j^{l}|^{p})^{1\over p} , p \geq 1 Lp(xi,xj)=(l=1∑n∣xil−xjl∣p)p1,p≥1 p=1时,是曼哈顿距离;p=2时,是欧式距离; p = ∞ p=\infty p=∞时,是各个坐标距离的最大值
k值选择
k小的话,近似误差会很小,只有较接近输入的才会起作用,但估计误差会增大,对邻近的实例很敏感,如果邻近是噪声,则会出错。k小的话,模型比较复杂,易过拟合。
k值较大,减少了估计误差,但近似误差会增大。k值较大,意味着模型较简单。
一般取较小值,通过交叉验证选择最优的k值。
分类规则
常见为多数表决。
多数表决规则(majority voting rule),设损失函数为0-1损失函数,误分类的概率为
1
k
∑
x
i
∈
N
k
(
x
)
I
(
y
i
!
=
c
l
)
=
1
−
1
k
∑
x
i
∈
N
k
(
x
)
I
(
y
i
=
c
l
)
{1\over k}\sum_{x_i\in N_k(x)}I(y_i!=c_l)=1-{1\over k}\sum_{x_i\in N_k(x)}I(y_i=c_l)
k1xi∈Nk(x)∑I(yi!=cl)=1−k1xi∈Nk(x)∑I(yi=cl)其中l为输入的类别,类别共k类。
要是误分类率最小即经验风险最小,就要使
1
k
∑
x
i
∈
N
k
(
x
)
I
(
y
i
=
c
l
)
{1\over k}\sum_{x_i\in N_k(x)}I(y_i=c_l)
k1∑xi∈Nk(x)I(yi=cl)最大,所以多数表决规则等价于经验风险最小化
算法
对于新输入的实例,在训练集上找到与该实例最近的k个实例,这k个实例的多数属于某个类,这个行输入的实例就属于哪个类。
k邻近算法
输入:训练数据集
T
=
(
x
1
,
y
1
)
,
.
.
.
,
(
x
n
,
y
n
)
T={(x_1,y_1),...,(x_n,y_n)}
T=(x1,y1),...,(xn,yn),x为特征向量,
y
i
y_i
yi为类别
∈
c
1
,
c
2
,
.
.
.
,
c
n
\in{c_1,c_2,...,c_n}
∈c1,c2,...,cn;实例特征向量x;
输出 :实例x所属的类别y
- 根据给定的距离度量,在训练集T中找出与x最近的k个点,涵盖k个点的x的领域记做N(x),
- 在 N k ( x ) N_k(x) Nk(x)中根据分类决策规则决定x的类别y: y = a r g m i n c 1 ∑ x i ∈ N k ( x ) I ( y i = c i ) , i = 1 , 2... , N ; j = 1 , 2 , . . , K y=argmin_{c_1} \sum _{x_i\in N_k(x)}I(y_i=c_i),i=1,2...,N;j=1,2,..,K y=argminc1xi∈Nk(x)∑I(yi=ci),i=1,2...,N;j=1,2,..,K I I I为指示函数,当 ( y i = c i ) (y_i=c_i) (yi=ci)时 I = 1 I=1 I=1,当 ( y i ! = c i ) (y_i!=c_i) (yi!=ci)时 I = 0 I=0 I=0。
实现 -kd树
实现k邻近,主要考虑对训练实例的k邻近的搜索,尤其在大数据量或特征维数较大时。
kd树
kd树是二叉树,表示对k维空间的一个划分。kd树的每个接单对应k维超矩形区域。
构造kd树:根节点对应整个空间,通过递归,生成子节点,划分区域。
构造平衡kd树
输入:k维空间数据集
T
=
{
x
1
,
x
2
,
.
.
.
,
x
n
}
T=\{x_1,x_2,...,x_n\}
T={x1,x2,...,xn},其中
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
,
x
i
k
)
T
x_i=(x_i^1,x_i^2,...,x_i^k)^T
xi=(xi1,xi2,...,xik)T
输出:kd树
1.构造根节点,选择
x
1
x^1
x1为坐标轴,以T中所有实例的
x
1
x^1
x1坐标的中位数为切分点,将根节点对应的超矩形空间一分为二,切分的超平面通过切分点,且与
x
1
x^1
x1轴垂直。生成两个深度为1的节点,左节点对应小于切分点的子区域,右节点对应大于切分点的区域。将落在切分超平面上的实例保存在根节点上。
2. 重复,以深度为j的节点,选择
x
l
x^l
xl为切分的坐标轴,
l
=
j
%
k
+
1
l=j\%k+1
l=j%k+1,以该节点区域汇总所有实例的
x
l
x^l
xl坐标中位数为切分点,将该区域切分成两个。
3. 直到两个区域没有实例存在,停止。
通过中位数切割,树是平衡的(两边节点相等),但树平衡不代表搜索的效率是最优的。
搜索最邻近过程
- 从根节点出发,找到包含目标的叶子节点,以此叶子为最近点
- 递归向上退
- 如果该节点更近,更新最近邻
- 当前最近一点一点存在于该节点的一个子节点对于的区域,检查该子节点的父节点的其他子节点对于的区域是否有跟接近的点。
- 回到根节点,结束 。
kd树适合训练数据远大于空间维数时的k近邻搜索,当两者接近时,效率会下降,几乎接近线性搜索。