《统计学习方法》:第三章 K 近邻算法

Posted joe-w

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《统计学习方法》:第三章 K 近邻算法相关的知识,希望对你有一定的参考价值。

k -- NN

k--NN 是一种基本分类和回归方法。对新实例进行分类时,通过已经训练的数据求出 k 个最近实例,通过多数表决进行分类。故 k 邻近算法具有不显式的学习过程。

三个基本要素:k 值选择,距离度量,分类决策规则。

1. k 近邻算法

原理:给定一个训练集,对于新输入的实例,在训练集中找到与其相似的 k 个实例,这 k 个实例的多数属于某一类,就将该实例归属到这一类。

输入:训练数据集 (T = {(x_1,y_1),(x_2,y_2),...,(x_3,y_3)})

其中,(x_i in X subseteq R^n) 为实例的特征向量, (y_i in Y = {c_1,c_2,...,c_k}) 为实例的类别, (i = 1,2,3,...,N);实例特征向量 (x)

输出:实例 (x) 所属的类 (y)

(1) 在训练集找出与 (x) 最相似的 k 个点,涵盖这 k 个点的 (x) 领域记作 (N_k(x))

(2) 在 (N_k(x)) 中根据分类决策规则(如多数表决)决定 (x) 的类别 (y)

? (y = argmax_{c_j} sum_{x_i in N_k(x)} I(y_i = c_j),) (i = 1,2,...,N; j = 1,2,...,K)

? (I) 为指示函数,即当 (y_i = c_j)(I) 为1,否则为0。

k 近邻算法的特殊情况:k = 1 时,称为最近邻算法。

k 近邻法没有显示的学习过程。

2. k 近邻模型

2.1 模型

在特征空间中,对每个训练实例点 (x_i) ,距离该点比其他点更近的所有点组成一个区域叫做单元(cell)。每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分。

2.2 距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映。距离有欧氏距离、(L_p) 距离((L_p) distance)或 Mainkowski 距离。

设特征空间 (X)(n) 维实数向量空间 (R^n)(x_i,x_j in X)(x_i = (x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T)(x_j = (x_j^{(1)},x_j^{(2)},...,x_j^{(n)})^T),则 (x_i,x_j)(L_p) 定义为:

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

(p = 2) 时称为欧氏距离,(p = 1) 时称为曼哈顿距离

(p = infty) 时是各个坐标距离的最大值,即:(L_{infty} = max_l |x_i^(l) - x_j^(l)|)

2.3 k 值的选择

  1. 较小的 k 值:相当于用较小的领域中的训练实例进行预测。

    优点:学习的近似误差(approximation error)会减小;

    缺点:学习的估计误差(estimation error)会增大,预测结果对近邻的实例点非常敏感。模型变复杂,容易发生过拟合。

  2. 较大的 k 值:相当于用较大领域中的训练实例进行预测。

    优点:学习的估计误差会减小;

    缺点:学习的近似误差会变大,与输入实例距离较远(不相似)的训练实例也会起预测作用。模型变简单。

k 值一般取较小的数值。

近似误差可以理解为模型估计值与实际值之间的差距。

估计误差可以理解为模型的估计系数与实际系数之间的差异。

2.4 分类决策规则

对于多数表决规则,若分类的损失函数是 0 - 1 损失函数,分类函数为:(f:R^n ightarrow {c_1,c_2,...,c_K})

误分类的概率:(P(Y eq f(x)) = 1 - P(Y = f(x)))

对于给定实例 (x) ,其所属类别为 (c_j) ,有误分类率:(frac{1}{k} sum_{x_i in N_k(x)} I(y_i eq 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. k 近邻法的实现:kd 树

3.1 构造 kd 树

kd 树是一种对 k 维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,其每个结点对应一个 k 维超矩形区域。

构造:

输入: k 维空间数据集 (T = {x_1, x_2,...,x_N}),其中 (x_i = (x_i^{(1)},x_i^{(2)},...,x_i^{(k)})^T)(i = 1,2,3,...,N)

(1) 根节点的构造:选择 (x^{(1)}) 作为坐标轴,求出所有实例点中 (x^{(1)}) 的中位数,并以其为根节点对数据集进行划分。小于切分的的实例点成为左子结点,大于的成为右子节点。

(2) 重复:对于深度为 j 的结点,选择 (x^{(l)}) 为坐标轴,(l = j mod k + 1),并以 (x^{(l)}) 的中位数作为切分点进行切分。

(3) 直到两个子区域没有实例存在时停止。

3.2 搜索 kd 树

输入:已构造的 kd 树,目标点 (x)

输出:(x) 的最近邻(以最近邻为例)

(1) 从根结点出发,用类似于查找二叉搜索树的方法找到一个叶结点。

(2) 以该叶节点为“当前最近结点”

(3) 递归向上回退,每个结点执行以下操作:

? (a) 若该结点保存的实例比当前最近点到目标的距离最小,则更新它为“当前最近点”。

? (b) 检查该结点的另一子结点对应的区域是否与以目标点为球心,以目标点与“当前最近点”距离为半径的超球体相交。若相交则移动到该子结点进行递归;否则回退。

(4) 当回退到根节点是结束。

kd 树更适合训练实例数远大于空间维数的 k 邻近搜索,复杂度为 (O(logN))

更具体的实现可参考书上的例 3. 3

4. 代码实现

[https://github.com/a74731248/statistical_learning_method/tree/master/k-nearest neighbor](https://github.com/a74731248/statistical_learning_method/tree/master/k-nearest neighbor)

以上是关于《统计学习方法》:第三章 K 近邻算法的主要内容,如果未能解决你的问题,请参考以下文章

李航统计学习方法——算法2——k近邻法

李航统计学习方法(第二版):k 近邻算法简介

统计学习方法K近邻对鸢尾花(iris)数据集进行多分类

统计学习方法 (第3章)K近邻法 学习笔记

统计学习方法笔记-k近邻

统计学习方法笔记-k近邻