K近邻方法
模型
不具有显式的学习过程,表现为k近邻法的模型对特征空间进行划分形成一个又一个的单元,单元中的实例的类标记是确定的。
1、距离的度量
-
闵氏距离
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 ,曼哈顿距离: L 1 ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ ) L_1(x_i,x_j) = (\sum_{l=1}^n |x_i^{(l)} - x_j^{(l)}|) L1(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣)
-
p = 2,欧式距离: L 2 ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ 2 ) 1 2 L_2(x_i,x_j) = (\sum_{l=1}^n |x_i^{(l)} - x_j^{(l)}|^{2})^{\frac{1}{2}} L2(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣2)21
-
p = ∞ \infty ∞,切比雪夫距离/各个坐标距离最大值: L ∞ ( x i , x j ) = max l ∣ x i ( l ) − x j ( l ) ∣ ) L_{\infty}(x_i,x_j) =\max_{l}|x_i^{(l)} - x_j^{(l)}|) L∞(xi,xj)=maxl∣xi(l)−xj(l)∣)
-
-
马氏距离:是旋转变换缩放之后的欧式距离
- D M ( x ) = ( x − μ ) T Σ − 1 ( x − μ ) D_M(x) = \sqrt{(x-\mu)^T \Sigma^{-1}(x-\mu)} DM(x)=(x−μ)TΣ−1(x−μ)
- D M ( x , y ) = ( x − y ) T Σ − 1 ( x − y ) D_M(x,y) = \sqrt{(x-y)^T \Sigma^{-1}(x-y)} DM(x,y)=(x−y)TΣ−1(x−y)
2、k值的选择
- k值越小,模型越复杂
- k值越大,模型越简单
- k=N,模型失去意义
3、分类决策规则
多数表决
策略
分类误差率最小化,也等价于经验风险最小化
- 分类函数:
f : R n → { c 1 , c 2 , … , c K } f:R^n \to \{c_1,c_2,\dots,c_K\} f:Rn→{c1,c2,…,cK}
- 误分类的概率分布
P ( Y ≠ f ( X ) ) = 1 − P ( Y = f ( X ) ) P(Y \neq f(X)) = 1-P(Y = f(X)) P(Y=f(X))=1−P(Y=f(X))
- 误分类率
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 \neq 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近邻的实现
-
线性扫描:通过计算输入实例与每个训练实例的距离,当数据规模很大时,非常耗时间和资源
-
kd树:使用特殊的结构存储训练数据,减少计算距离的次数,提高搜索效率
2、kd树原理
-
数据存储结构
是 对 k 维 空 间 的 实 例 点 进 行 存 储 以 便 对 其 进 行 快 速 检 索 的 树 形 结 构 k d 树 是 二 叉 树 , 表 示 对 k 维 空 间 的 划 分 构 造 k d 树 相 当 于 不 断 的 垂 直 于 坐 标 轴 的 超 平 面 将 k 维 空 间 进 行 切 分 , 形 成 一 系 列 的 k 维 超 − 矩 形 区 域 k d 树 的 每 一 个 节 点 对 应 一 个 k 维 超 矩 形 区 域 \begin{aligned} &是对k维空间的实例点进行存储以便对其进行快速检索的树形结构\\ &kd树是二叉树,表示对k维空间的划分\\ &构造kd树相当于不断的垂直于坐标轴的超平面将k维空间进行切分,形成一系列的k维超- 矩形区域\\ &kd树的每一个节点对应一个k维超矩形区域\\ \end{aligned} 是对k维空间的实例点进行存储以便对其进行快速检索的树形结构kd树是二叉树,表示对k维空间的划分构造kd树相当于不断的垂直于坐标轴的超平面将k维空间进行切分,形成一系列的k维超−矩形区域kd树的每一个节点对应一个k维超矩形区域 -
kd树构造方法
构 造 根 结 点 : 对 应 于 k 维 空 间 中 包 含 所 有 实 例 点 的 超 矩 形 区 域 ; 生 成 子 结 点 : 在 超 矩 形 区 域 上 选 择 一 个 坐 标 轴 和 再 此 坐 标 轴 上 的 一 个 切 分 点 , 确 定 一 个 超 平 面 , 使 该 超 平 面 通 过 选 定 的 超 平 面 并 垂 直 于 坐 标 轴 , 将 当 前 超 平 面 切 分 成 左 右 两 个 子 区 域 ( 子 节 点 ) , 递 归 上 述 过 程 , 不 断 的 对 k 维 空 间 进 行 切 分 , 生 成 子 节 点 ; 生 成 叶 结 点 : k 维 空 间 被 不 断 的 切 分 , 直 到 子 区 域 中 没 有 实 例 时 , 终 止 。 终 止 时 的 结 点 为 叶 结 点 。 \begin{aligned} &构造根结点:对应于k维空间中包含所有实例点的超矩形区域;\\ &生成子结点:在超矩形区域上选择一个坐标轴和再此坐标轴上的一个切分点,确定一个超平面,使该超平面通过\\ &选定的超平面并垂直于坐标轴,将当前超平面切分成左右两个子区域(子节点),递归上述过程,不断的对k维空\\ &间进行切分,生成子节点;\\ &生成叶结点:k维空间被不断的切分,直到子区域中没有实例时,终止。终止时的结点为叶结点。 \end{aligned} 构造根结点:对应于k维空间中包含所有实例点的超矩形区域;生成子结点:在超矩形区域上选择一个坐标轴和再此坐标轴上的一个切分点,确定一个超平面,使该超平面通过选定的超平面并垂直于坐标轴,将当前超平面切分成左右两个子区域(子节点),递归上述过程,不断的对k维空间进行切分,生成子节点;生成叶结点:k维空间被不断的切分,直到子区域中没有实例时,终止。终止时的结点为叶结点。 -
切分点的选择
一 般 选 择 训 练 实 例 在 选 定 坐 标 轴 上 的 中 位 数 作 为 切 分 点 , 这 样 得 到 的 k d 树 是 平 衡 k d 树 一般选择训练实例在选定坐标轴上的中位数作为切分点,这样得到的kd树是平衡kd树 一般选择训练实例在选定坐标轴上的中位数作为切分点,这样得到的kd树是平衡kd树
3、kd二叉平衡树算法
(1) kd树构造算法
- 输入:
T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) x i ∈ X = R n ; y i ∈ Y = { c 1 , c 2 , … , c K } ; i = 1 , 2 , … , N ; 实 例 特 征 向 量 x \begin{aligned} &T = {(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)}\\ &x_i \in \mathcal{X}=R^n;y_i \in \mathcal{Y} = \{c_1,c_2,\dots,c_K\};i=1,2,\dots,N;实例特征向量x \end{aligned} T=(x1,y1),(x2,y2),…,(xN,yN)xi∈X=Rn;yi∈Y={c1,c2,…,cK};i=1,2,…,N;实例特征向量x
- 输出:kd树
- 步骤:
开 始 : 1 、 构 造 跟 结 点 , 根 结 点 对 应 包 含 T 的 k 维 空 间 的 超 矩 形 区 域 2 、 选 择 x ( 1 ) 为 坐 标 轴 , 以 T 中 所 有 实 例 的 x ( 1 ) 坐 标 的 中 位 数 为 切 分 点 , 垂 直 于 选 定 坐 标 轴 的 超 平 面 通 过 切 分 点 , 从 而 将 根 结 点 对 应 的 超 矩 形 区 域 切 分 成 两 个 子 区 域 3 、 生 成 的 两 个 子 区 域 , 左 子 区 域 和 右 子 区 域 深 度 均 为 1 。 左 子 区 域 对 应 选 定 坐 标 轴 小 于 切 分 点 的 区 域 ; 右 子 区 域 对 应 于 选 定 坐 标 轴 大 于 切 分 点 的 区 域 4 、 将 落 在 切 分 超 平 面 上 的 实 例 点 存 在 根 结 点 递 归 1 、 对 深 度 为 j 的 结 点 , 选 定 切 分 坐 标 轴 2 、 选 定 坐 标 轴 的 中 位 数 为 切 分 点 3 、 使 超 平 面 垂 直 坐 标 轴 通 过 切 分 点 , 将 深 度 为 j 的 子 区 域 切 分 成 深 度 为 j + 1 的 左 右 子 区 域 4 、 将 落 在 切 分 超 平 面 上 的 实 例 点 保 存 在 该 结 点 结 束 1 、 直 到 两 个 子 区 域 中 没 有 实 例 时 停 止 切 分 2 、 将 最 终 的 实 例 点 保 存 在 最 终 的 叶 结 点 3 、 从 而 生 成 k d 树 的 区 域 划 分 \begin{aligned} &开始:\\ &1、构造跟结点,根结点对应包含T的k维空间的超矩形区域\\ &2、选择x^{(1)}为坐标轴,以T中所有实例的x^{(1)}坐标的中位数为切分点,垂直于选定坐标轴的超平面通过\\ &切分点,从而将根结点对应的超矩形区域切分成两个子区域\\ &3、生成的两个子区域,左子区域和右子区域深度均为1。左子区域对应选定坐标轴小于切分点的区域;右子区域对\\ &应于选定坐标轴大于切分点的区域\\ &4、将落在切分超平面上的实例点存在根结点\\ \\ &递归\\ &1、对深度为j的结点,选定切分坐标轴\\ &2、选定坐标轴的中位数为切分点\\ &3、使超平面垂直坐标轴通过切分点,将深度为j的子区域切分成深度为j+1的左右子区域\\ &4、将落在切分超平面上的实例点保存在该结点\\ \\ &结束\\ &1、直到两个子区域中没有实例时停止切分\\ &2、将最终的实例点保存在最终的叶结点\\ &3、从而生成kd树的区域划分\\ \end{aligned} 开始:1、构造跟结点,根结点对应包含T的k维空间的超矩形区域2、选择x(1)为坐标轴,以T中所有实例的x(1)坐标的中位数为切分点,垂直于选定坐标轴的超平面通过切分点,从而将根结点对应的超矩形区域切分成两个子区域3、生成的两个子区域,左子区域和右子区域深度均为1。左子区域对应选定坐标轴小于切分点的区域;右子区域对应于选定坐标轴大于切分点的区域4、将落在切分超平面上的实例点存在根结点递归1、对深度为j的结点,选定切分坐标轴2、选定坐标轴的中位数为切分点3、使超平面垂直坐标轴通过切分点,将深度为j的子区域切分成深度为j+1的左右子区域4、将落在切分超平面上的实例点保存在该结点结束1、直到两个子区域中没有实例时停止切分2、将最终的实例点保存在最终的叶结点3、从而生成kd树的区域划分
(2)kd树搜索算法
- 输入:已构造的kd树,目标点x
- 输出:x的最近邻
- 步骤:
1
、
在
k
d
树
中
找
出
包
含
目
标
点
x
的
叶
结
点
(
a
)
从
根
结
点
出
发
,
递
归
的
向
下
访
问
k
d
树
(
b
)
若
目
标
点
x
当
前
维
的
坐
标
小
于
切
分
点
的
坐
标
,
则
移
动
到
左
子
节
点
(
c
)
若
目
标
点
x
当
前
维
的
坐
标
大
于
切
分
点
的
左
边
,
则
移
动
到
右
子
节
点
(
d
)
直
到
子
节
点
为
叶
结
点
为
止
2
、
以
此
叶
结
点
为
“
当
前
最
近
点
”
3
、
递
归
的
向
上
回
退
,
更
新
“
当
前
最
近
点
”
(
a
)
如
果
该
结
点
保
存
的
实
例
点
比
当
前
最
近
点
距
离
目
标
更
近
,
则
以
该
实
例
点
为
“
当
前
最
近
点
”
(
b
)
当
前
最
近
点
一
定
存
在
于
该
结
点
的
一
个
子
结
构
对
应
的
的
区
域
。
(
b
−
1
)
检
查
该
子
结
点
的
父
结
点
的
另
一
子
结
点
对
应
的
区
域
是
都
有
更
接
近
目
标
的
点
。
(
b
−
2
)
即
检
查
另
一
子
结
点
对
应
的
区
域
是
否
与
以
目
标
点
为
圆
心
,
以
目
标
点
到
“
当
前
最
近
点
”
距
离
为
半
径
的
超
球
体
相
交
。
(
b
−
3
)
如
果
另
一
子
结
点
对
应
的
区
域
与
超
球
体
相
交
,
则
在
另
一
子
结
点
可
能
存
在
距
离
目
标
点
更
近
的
点
。
移
动
到
另
一
子
节
点
,
接
着
,
递
归
进
行
最
近
邻
搜
索
4
、
如
果
另
一
子
结
点
对
应
的
区
域
与
超
球
体
不
相
交
,
则
向
上
回
退
,
当
回
退
到
根
结
点
时
,
搜
索
结
束
,
最
后
的
“
当
前
最
近
点
”
则
为
x
的
最
近
邻
点
。
\begin{aligned} &1、在kd树中找出包含目标点x的叶结点\\ &\quad\quad\quad\quad (a)从根结点出发,递归的向下访问kd树\\ &\quad\quad\quad\quad (b)若目标点x当前维的坐标小于切分点的坐标,则移动到左子节点\\ &\quad\quad\quad\quad (c)若目标点x当前维的坐标大于切分点的左边,则移动到右子节点\\ &\quad\quad\quad\quad (d)直到子节点为叶结点为止\\ &2、以此叶结点为“当前最近点”\\ &3、递归的向上回退,更新“当前最近点”\\ &\quad\quad\quad\quad (a)如果该结点保存的实例点比当前最近点距离目标更近,则以该实例点为“当前最近点”\\ &\quad\quad\quad\quad (b)当前最近点一定存在于该结点的一个子结构对应的的区域。\\ &\quad\quad\quad\quad \quad\quad (b-1)检查该子结点的父结点的另一子结点对应的区域是都有更接近目标的点。\\ &\quad\quad\quad\quad \quad\quad (b-2)即检查另一子结点对应的区域是否与以目标点为圆心,以目标点到“当前最近点”距离为半径的超球体相交。\\ &\quad\quad\quad\quad \quad\quad (b-3)如果另一子结点对应的区域与超球体相交,则在另一子结点可能存在距离目标点更近的点。移动到另一子节点,接着,递归进行最近邻搜索\\ &4、如果另一子结点对应的区域与超球体不相交,则向上回退,当回退到根结点时,搜索结束,最后的“当前最近点”则为x的最近邻点。\\ \end{aligned}
1、在kd树中找出包含目标点x的叶结点(a)从根结点出发,递归的向下访问kd树(b)若目标点x当前维的坐标小于切分点的坐标,则移动到左子节点(c)若目标点x当前维的坐标大于切分点的左边,则移动到右子节点(d)直到子节点为叶结点为止2、以此叶结点为“当前最近点”3、递归的向上回退,更新“当前最近点”(a)如果该结点保存的实例点比当前最近点距离目标更近,则以该实例点为“当前最近点”(b)当前最近点一定存在于该结点的一个子结构对应的的区域。(b−1)检查该子结点的父结点的另一子结点对应的区域是都有更接近目标的点。(b−2)即检查另一子结点对应的区域是否与以目标点为圆心,以目标点到“当前最近点”距离为半径的超球体相交。(b−3)如果另一子结点对应的区域与超球体相交,则在另一子结点可能存在距离目标点更近的点。移动到另一子节点,接着,递归进行最近邻搜索4、如果另一子结点对应的区域与超球体不相交,则向上回退,当回退到根结点时,搜索结束,最后的“当前最近点”则为x的最近邻点。