统计学习-k邻近法

k近邻法(k-nearest neighbor, k-NN)可用于分类与回归. 在分类问题中, 假设给定一个训练数据集, 其中的实例类别已定. 分类时, 对新的实例, 根据其k个最按住的训练实例的类别, 通过多数表决等方式进行预测. 不具备显式的学习过程. k值的选择, 距离的度量以及分类决策规则是k按住法的三个基本要素. 可以通过构造k决策树(kd树)的方式进行优化.

假设给定输入空间\(\mathcal{X} \subseteq \mathbf{R}^n\), 输出空间\(\mathcal{Y} = {c_1, c_2, \cdots, c_K}\), 及\(N\)个实例\(T\). 在预测时, 输入实例\(x\), 输出\(y\). 根据给定距离度量方式, 在训练集\(T\)中找出与\(x\)最邻近的\(k\)个点\(N_k(x)\), 根据分类策规则选取这些点中含有的某个数量最多的类别\(c\)作为输出. 即: \begin{align} \label{eq:max} y = \arg \min_{c_j} \sum_{x_i \in N_k(x)} I(y_i=c_j), i = 1, 2, \cdots, N; j = 1, 2, \cdots, K \end{align}

\(k=1\)称为最近邻算法

\(L_p\)距离: 设特征空间\(\mathcal{X}\)\(n\)维实数向量空间\(\mathbf{R}^n\), 对于任意两点\(x_i, x_j \in \mathcal{X}\), 其\(L_p\)距离定义为 \begin{align} L_p(x_i, x_j) = \left( \sum_{l=1}^n \left|x_i^{(l)} - x_j{(l)}\right|p\right)^{\frac{1}{p}} \end{align} 其中\(p \geqslant 1\), 当\(p = 2\)时称为欧氏距离, 当\(p = 1\)时称为曼哈顿距离, 当\(p=\infty\), 表示各个元素中差值最大的一个的绝对值.

距离度量: 通常使用欧氏距离, 但是也可以使用\(L_p\)距离或者Minkowski距离等.

k值的选择: 通常采用交叉验证法来选取最优的\(k\)值, 如果过小, 意味着整体模型变得复杂, 容易发生过拟合, 反之则模型变简单.

决策规则: 通常采用多数表决 \eqref{eq:max}, 如果采用0-1损失函数, 则其等价于经验风险最小化.

\(kd\)

k维二叉决策树, 不是k近邻树

构造平衡kd树:

输入: k维空间数据集\(T = \{x_1, x_2, \cdots, x_N\}, x_i = (x_i^{(1)}, x_i^{(2)}, \cdots, x_i^{(k)})^T\)

  1. 开始: 选取第1维数据的中位数(向下取整)作为根结点, 将数据分为三个部分: 左枝为第1维数据中小于中位数的数据集, 右枝为大于, 等于的结点则作为根结点的key
  2. 重复: 对于深度为\(j\)的结点, 选取第\(l=j(\mod k) + 1\)维数据的中位数作为切分点, 和步骤1一样, 分为三个部分
  3. 直到左枝或右枝为空集时停止.

搜索平衡kd树:

输入: 一棵平衡kd树, 目标点\(x\)

输出: \(x\)的最近邻

  1. 找到\(x\)在树中的叶结点位置(如果某一维度与内部结点的此维度相等, 则在右结点为查找) Why? \(O(\lg N)\)
  2. 假定此叶结点为最近邻
  3. 向上递归查找
    i. 如果该结点保存的实例结点比当前最近点更近, 则更新最近邻
    ii. 如果该结点切面与以当前最近邻点的距离为直径, 输入点为球心的超球相交, 则在其另一支中查找更新最近邻(可以通过切面是否相交判断是否两枝均要搜索), 然后以此结点为当前最近邻, 与当前节点的父结点比较大小更新, 同时与父节点另一支比较是否相交, 递归查找
    iii. 如果不相交, 则忽略其另一支, 向上继续查找
  4. 递归结束时, 最近邻即为所求
  5. 若需要求\(k'\)个最近邻? How to?
posted @ 2017-05-24 18:50  kcats  阅读(449)  评论(0)    收藏  举报