《统计学习方法》:第三章 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 \rightarrow \{c_1,c_2,...,c_K\}\)

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

对于给定实例 \(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. 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)

原文地址:https://www.cnblogs.com/joe-w/p/12585842.html

时间: 2024-08-10 02:11:01

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

第2章 K近邻算法实战(KNN)

1.准备:使用Python导入数据 1.创建kNN.py文件,并在其中增加下面的代码: from numpy import * #导入科学计算包 import operator #运算符模块,k近邻算法执行排序操作时将使用这个模块提供的函数 def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['A','A','B','B'] return group,labels ##print(create

统计学习方法 笔记<第一章>

第一章 统计学习方法概述 1.1 统计学习 统计学习(statistical learning)是关于计算机基于数据概率模型并运用模型进行预测和分析的学科.统计学习也称为统计机器学习,现在人们提及的机器学习一般都是指统计机器学习. 统计学习的对象是数据(data),关于数据的基本假设是同类数据具有一定的统计规律性(前提):比如可以用随机变量描述数据中的特征,用概率分布描述数据的统计规律等. 统计学习的目的:对现有的数据进行分析,构建概率统计模型,分析和预测未知新数据,同时也需要考虑模型的复杂度以

02-16 k近邻算法

[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ k近邻算法 k近邻算法(k-nearest neighbors,KNN)是一种基本的分类和回归方法,本文只探讨分类问题中的k近邻算法,回归问题通常是得出最近的$k$个实例的标记值,然后取这$k$实例标记值的平均数或中位数. k近邻算法经常被人们应用于生活当中,比如傅玄曾说过"近朱者赤近墨者黑&quo

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

K近邻算法

1.1.什么是K近邻算法 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属

用Python从零开始实现K近邻算法

K近邻算法 (或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具. http://python.jobbole.com/87407/ 在本教程中,你将基于Python(2.7)从零开始实现kNN算法.该实现主要针对分类问题,将会用鸢尾花分类问题来演示. 这篇教程主要针对Python程序员,或者你可以快速上手Python,并且对如何从零实现kNN算法感兴趣. kNN算法图片,来自Wikipedia,保留所有权利 什么是kNN kNN算法的模型就是整个训练数据集.当需要对一个未知数据实

001-神经网络基础-K近邻算法

K-近邻算法: 如果K = 3,绿色圆点最近的3个邻居:2个红色三角,和1个蓝色矩形,少数从属多数,基于统计的算法,判定绿色圆点为红色三角一类. 如果K = 5,绿色圆点最近的5个邻居:2个红色三角,和3个蓝色矩形,少数从属多数,基于统计的算法,判定绿色圆点为蓝色矩形一类. 对于未知类别属性数据集中的点: 1.计算已知类别数据集中的点与当前点的距离2.按照距离依次排序3.选取与当前点距离最小的K个点4.确定前K个点所在类别的出现概率5.返回前K个点出现频率最高的类别作为当前点预测分类. 概述:K

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&amp;交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b