k 近邻算法笔记

目录

1. 概述

2. 模型

2.1 距离度量

2.2 k 值选择

2.3 分类决策规则

3. kd 树

3.1 构造 kd 树

3.2 搜索 kd 树


        k 近邻算法是一种基本分类与回归方法。算法的输入为实例的特征向量,即特征空间的点;输出是实例的类别,可以取多类。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式预测,可以看出 k 近邻算法不具有显示的学习过程。k 值的选择,距离度量及分类决策规则是 k 近的三个基本要素。

1. 概述

输入:训练数据集 T

输出:实例 x 所属的类 y

  1. 根据给定的距离度量,在 T 中找到与 x 最邻近的 k 个点,涵盖这 k 个点的 x 的邻域记作 N_{k}(x)
  2. 在 N_k(x) 中根据分类决策规则决定 x 的类别 y

决策规则可采用多数表决:

y=arg\underset{c_j}{max}\sum_{x_i \in N_k(x)}I(y_i=c_j)\, ,\,\, i=1,2,...,N;j=1,2,...,K

        令 k=1 ,则得到最近邻算法,对于输入的实例点 x,最近邻将训练数据集中与 x 最近邻的点作为 x 的类。

2. 模型

        当 k 近邻的三个要素确定后,对于任何一个新的输入实例,所属的类别也就唯一地确定。这相当于根据上述要素将特征空间划分为一些子空间,子空间的泪奔以及确定。

        特征空间中,对每个训练实例,距离该点比其他点更近地所有点组成一个区域,这个区域叫做单元。所有训练实例点的单元构成特征空间的一个划分,每个单元的实例点的类别是确定的。

2.1 距离度量

        特征空间中两个实例点的距离是两个实例点相似程度的反映。一般使用的距离是欧氏距离,也可以是更一般的 L_p 距离:

L_p(x_i, x_j)=(\sum_{l=1}^{n}\left | x_i^{(l)}-x_j^{(l)} \right |^p)^\frac{1}{p}

其中,x_i,x_j \in R^n

  • p = 1,曼哈顿距离
  • p = 2,欧氏距离
  • p 无穷大,是各个坐标距离的最大值。

2.2 k 值选择

优点缺点
较小的k值只有与输入实例相似的训练实例会对预测结果起作用,近似误差较小估计误差较大,预测结果对邻近点非常敏感,噪声影响很大
较大的k值估计误差较小近似误差增大

        应用中,k 值一般取一个比较小的数值,通常采用交叉验证法来选取最优的 k 值。

2.3 分类决策规则

        多数表决规则有如下解释:如果分类的损失函数为 0-1 损失函数,分类函数为

f:R^n\rightarrow \left \{ c_1,c_2,...,c_K \right \}

误分类的概率为

P(Y\neq f(X))=1-P(Y=f(X))

对给定的实例 x ,其最近邻的 k 个是实例点构成的集合 N_k(x) ,涵盖 N_k(x) 区域的类别是 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)

为尽可能降低误分类率,要使 \sum_{x_i \in N_k(x)}I(y_i =c_j) 最大,所以多数表决规则等价于经验风险最小化。

3. kd 树

        实现 k 近邻的算法有两种:

  • 线性扫描:当训练集很大时,计算非常耗时,不可行
  • kd 树:特殊结构存储数据减少计算距离的次数

        kd 树时一种对 k 维空间的实例点进行存储以快速检索的树形数据结构,是二叉树。构造 kd 树相当于不断地用垂直于坐标轴的超平面将 k 维空间切分,构成一系列 k 维超矩形区域,kd 树的每一个结点对应一个超矩形区域。

3.1 构造 kd 树

输入:k维空间数据集 T

输出:kd 树

  1. 构造根节点,根节点对应于包含 T 的 k 维空间的超矩形区域

        选择 x^{(1)} 为坐标轴,以 T 中所有实例的第一维坐标的中位数为切分点,该切分点将对应的超矩形区域切分。切分通过切分点并与坐标轴 x^{(1)} 垂直的超平面实现。

        由根节点生成深度为 1 的左右子结点,左节点为第一维坐标小于切分点的数据集,右节点为第一维坐标大于切分点的数据集,将落在切分超平面上的实例点保存为根节点。

  1. 对深度为 j 的结点,选择 x^{j\,mod\,k+1} 作为切分的坐标轴,切分过程如上。
  2. 直到两个子区域没有实例存在时停止切分。

3.2 搜索 kd 树

        给定一个目标点,搜索其最近邻,首先找到包含目标点的叶结点,然后从叶结点出发依次回退到父节点,不断朝朝与目标点最邻近的结点,当确定不可能存在更近的结点时停止。

输入:kd 树, 目标点 x

输出:x 的最近邻

  1. 在 kd 树中找到包含 x 的叶结点:从根节点出发递归的向下访问,若目标点坐标小于切分点坐标则搜索左子树,否则搜索右子树,直到子结点为叶结点停止
  2. 以此叶结点为“当前最近点”
  3. 递归的向上回退,中途每个结点进行如下操作:
    1. 如果该结点保存的实例点比当前最近点距离目标点更近,则更新当前最近点
    2. 当前最近点一定存在于该结点一个子结点对应的区域,检查该子结点的父节点的另一子结点对应的区域是否由更近的点,如果存在则移动到另一个子结点并递归的进行最近邻搜索,否则向上回退
  4. 回退到根节点,搜索结束,最后的当前最近点就是 x 的最近邻点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值