参考资料:
1.李航《统计学习方法》
2.github: https://github.com/fengdu78/lihang-code
k
k
k近邻方法(k-nearest neighbor,KNN)是一种基本的分类与回归的方法.
k
k
k近邻法的输入为实例的特征向量,对应于特征空间的点;
输出为实例的类别,可取多类.
k
k
k近邻法假设给定一个训练数据集,其中的实例类别已定,分类时,对于新的实例,根据其
k
k
k个最近邻的
训练实例的类别,通过多数表决等方式进行预测
k k k近邻法不具有显示的学习过程,k值的选择、距离度量以及分类决策规则是 k k k近邻方法的三个基本要素
算法 k k 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
∈
χ
⊆
R
n
为
实
例
的
特
征
向
量
,
y
∈
Y
=
{
c
1
,
c
2
,
.
.
.
,
c
K
}
为
实
例
的
类
别
,
i
=
1
,
2
,
.
.
,
N
x_{i}\in \chi \subseteq R^{n}为实例的特征向量, y\in Y =\{c_{1},c_{2},...,c_{K}\}为实例的类别,i=1,2,..,N
xi∈χ⊆Rn为实例的特征向量,y∈Y={c1,c2,...,cK}为实例的类别,i=1,2,..,N; 实例特征向量
x
x
x.
输出: 实例 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
max
c
j
∑
x
i
∈
N
k
(
x
)
I
(
y
i
=
c
j
)
,
i
=
1
,
2
,
3
,
.
.
.
N
;
j
=
1
,
2
,
.
.
.
,
K
.
y=arg\max \limits_{c_{j}}\sum _{x_{i}\in {N_{k}(x)}} I(y_{i}=c_{j}) ,i=1,2,3,...N;j=1,2,...,K.
y=argcjmaxxi∈Nk(x)∑I(yi=cj),i=1,2,3,...N;j=1,2,...,K.
其中
I
I
I为指示函数,即当
y
i
=
c
j
时
,
I
=
1
,
否
则
,
I
=
0
y_{i}=c_{j}时,I=1,否则,I=0
yi=cj时,I=1,否则,I=0
当 k = 1 k=1 k=1时,称为最近邻算法,对于输入的实例点 x x x,最近邻法将训练数据集中与 x x x最邻近的点的类作为 x x x的分类。
k k k近邻法的模型对应于特征空间的一个划分
距离度量
特征空间中两个实例点的距离是两个实例点相似程度的反映
设特征空间 χ 是 n 为 实 数 向 量 空 间 R n , x i , x j ∈ χ , x i = ( x i 1 , x i 2 , . . . , x i n ) T , x j = ( x j 1 , x j 2 , . . . , x j n ) T \chi是n为实数向量空间R^{n},x_{i},x_{j}\in \chi, x_{i}=(x_{i}^{1},x_{i}^{2},...,x_{i}^{n})^T,x_{j}=(x_{j}^{1},x_{j}^{2},...,x_{j}^{n})^T χ是n为实数向量空间Rn,xi,xj∈χ,xi=(xi1,xi2,...,xin)T,xj=(xj1,xj2,...,xjn)T, x i , x j 的 L p 距 离 定 义 为 : x_{i},x_{j}的L_{p}距离定义为: xi,xj的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 1p} Lp(xi,xj)=(l=1∑n∣xil−xjl∣p)p1
这里 p ≥ 1. 当 p = 2 时 , 称 为 欧 式 距 离 , p = 1 时 , 称 为 曼 哈 顿 距 离 , 当 p = inf 时 , 它 是 各 个 坐 标 距 离 的 最 大 值 p \geq 1.当p=2时,称为欧式距离,p=1时,称为曼哈顿距离,当p=\inf 时,它是各个坐标距离的最大值 p≥1.当p=2时,称为欧式距离,p=1时,称为曼哈顿距离,当p=inf时,它是各个坐标距离的最大值
L inf ( x i , x j ) = max l ∣ x i l − x j l ∣ ) L_{\inf}(x_{i},x_{j})=\max_{l}{|x_{i}^{l}-x_{j}^{l}|}) Linf(xi,xj)=lmax∣xil−xjl∣)
k k k值的选择
k k k值的选择会对 k k k近邻法的结果产生重大影响
如果选择较小的 k k k值就相当于用较小的邻域中的训练实例进行预测,学习的近似误差会减小,但是学习的估计误差会增大,预测结果会对邻近的实例点非常敏感,如果临近点恰好是噪声,预测就会出错
如果选择较大的 k k k值,就相当于用较大邻域中的训练实例进行预测,学习的近似误差会增大,但是学习的估计误差会减小,这时与输入实例较远的训练实例也会对预测起作用,使预测出错
k k k值的增大意味着模型整体变得简单,如果 k = N k=N k=N,那么无论输入实例是什么,都将简单地预测他属于训练实例中最多的类
在实际应用中, k k k一般选取比较小的数值,通常采用交叉验证法来选取最优的 k k 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
)
\frac{1}{k}\sum_{x_{i}\in N_{k}(x)}I(y_{i}\not= 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)
要使得误分类类别最小,即经验风险最小,就要使
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} = c_{j}
k1∑xi∈Nk(x)I(yi=cj最大,所以多数表决规则等价于经验风险最小化
k k k近邻法的实现 k d kd kd树
主要考虑问题:如何对训练数据进行快速的 k k k近邻搜索
k k k近邻最简单的实现方法就是线性扫描,但当训练集很大时,计算非常耗时
考虑使用特殊的结构存储训练数据,以减少计算距离的次数
k d 树 kd树 kd树 :是一种对 k k k维空间中的实例点进行存储一遍对其进行快速检索的树形数据结构, k d kd kd树是二叉树,表示对 k k k维空间的一个划分
算法(构造平衡 k d kd kd树)
输入:
k
维
空
间
数
据
集
T
=
{
x
1
,
x
2
,
.
.
.
,
x
N
}
,
其
中
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
.
.
.
,
x
i
(
k
)
)
T
k维空间数据集T=\{x_{1},x_{2},...,x_{N}\},其中x_{i}=(x_{i}^{(1)},x_{i}^{(2)},...,x_{i}^{(k)})^T
k维空间数据集T={x1,x2,...,xN},其中xi=(xi(1),xi(2),...,xi(k))T
输出:
k
d
kd
kd树
(1)开始:构造根节点,以根节点对应于包含T的 k k k维空间的超矩形区域,选择 x ( 1 ) x^{(1)} x(1)为坐标轴,以 T T T中所有实例的 x ( 1 ) x^{(1)} x(1)坐标的中位数为切分点,,由根节点生成深度为1的左右子节点,左边小于 x ( 1 ) x^{(1)} x(1),右边大于 x ( 1 ) x^{(1)} x(1);
(2)重复,对深度为 j j j的节点,选择 x ( l ) x^{(l)} x(l)为坐标轴, l = j ( m o d k ) + 1 l=j(mod k)+1 l=j(modk)+1,以该结点的区域中的所有实例的 x ( l ) x^{(l)} x(l)坐标的中位数为切分点,将结点对应的超平面矩形区域切分成两个子区域;
(3)直到两个子区域没有实例存在时停止.
example
根据训练集
T
=
{
(
2
,
3
)
T
,
(
5
,
4
)
T
,
(
9
,
6
)
T
,
(
4
,
7
)
T
,
(
8
,
1
)
T
,
(
7
,
2
)
T
}
T=\{(2,3)^T,(5,4)^T,(9,6)^T,(4,7)^T,(8,1)^T,(7,2)^T\}
T={(2,3)T,(5,4)T,(9,6)T,(4,7)T,(8,1)T,(7,2)T}
构造平衡
k
d
kd
kd树
解:取 x ( 1 ) x^{(1)} x(1)的数值,进行从小到大排序:2,4,5,7,8,9,选取中位数7,以(7,2)为根节点将数据分成两类:(2,3),(5,4),(4,7)和(8,1),(9,6),对左子树再次取 l = 1 m o d 2 + 1 = 2 , x ( 2 ) l=1mod2 +1 =2,x^{(2)} l=1mod2+1=2,x(2)的数值,从小到大排序:3,4,7选择中位数4,则左边构造完毕,对右子树取 x ( 2 ) x^{(2)} x(2)的数值:1,6,取6作为中位数,则右子树构造完毕.
算法 (用 k d kd kd树进行最近邻搜索)
输入:已知构造的
k
d
kd
kd树;目标点
x
x
x
输出:
x
x
x的最近邻
(1)在
k
d
kd
kd树中找到包含目标点
x
x
x的叶节点:从根节点出发,递归地向下访问
k
d
kd
kd树,若目标点当前为的坐标小于切分点坐标,则移动到左子树,否则右子树,直到子结点为叶结点为止
(2)以此叶节点为当前最近点
(3)递归地向上回退
(a)如果该节点保存的实例点比当前最近点距离目标点更近,则以该实例点为当前最近点;
(b)当前最近点一定存在于该节点一个子结点对应的区域,检查该子结点的父节点的另一子结点对应的区域是否有更近的点
(4)当回退到根结点时,搜索结束,最后的当前最近点,就是
x
x
x的最近邻点
如果实例点是随机分布的,
k
d
kd
kd树搜索的平均计算复杂度为
O
(
l
o
g
N
)
O(logN)
O(logN)
kd树更适用于训练是实例数远大于空间维数的k近邻搜索
example
以 T = { ( 2 , 3 ) T , ( 5 , 4 ) T , ( 9 , 6 ) T , ( 4 , 7 ) T , ( 8 , 1 ) T , ( 7 , 2 ) T } T=\{(2,3)^T,(5,4)^T,(9,6)^T,(4,7)^T,(8,1)^T,(7,2)^T\} T={(2,3)T,(5,4)T,(9,6)T,(4,7)T,(8,1)T,(7,2)T}构造的平衡 k d kd kd树为例,求出 x = ( 3 , 4.5 ) x=(3,4.5) x=(3,4.5)的最近邻点
解:假设(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)对应的点表示为A,B,C,…,F, 则构造的平衡二叉树的先序遍历和中序遍历分别为:FBADCE,ABDFEC.
1.从根节点(7,2)出发,找出(3,4.5)对应的第一个最近点(4,7)
2.分别计算(4,7)的父节点(5,4)与(4,7)分别距离(3,4.5)的距离(采用欧式距离),更新(5,4)为当前最近点
3.计算(2,3)对应的区域是否与(5,4)为中心,(5,4)与(3,4.5)之间的距离为半径的超球体相交,发现相交, 计算(2,3)到(3,4.5)的距离,更新(2,3)为当前最近邻点
4.搜索结束,(2,3)为最近邻点