KNN - 笔记(1)
来源:互联网 发布:奥斯卡终身成就奖 知乎 编辑:程序博客网 时间:2024/04/28 01:34
1 - 背景
KNN:k近邻,表示基于k个最近的邻居的一种机器学习方法。该方法原理简单,构造方便。且是一个非参数化模型。
KNN是一个“懒学习”方法,也就是其本身没有训练过程。只有在对测试集进行结果预测的时候才会产生计算。KNN在训练阶段,只是简单的将训练集放入内存而已。该模型可以看成是对当前的特征空间进行一个划分。当对测试集进行结果预测时,先找到与该测试样本最接近的K个训练集样本,然后基于当前是分类任务还是回归任务来做对应的处理。
KNN模型中有三个需要注意的地方:
1 - 距离度量的方法;
2 - K值的选择;
3 - 最后的判别决策规则。
如上面第三个,较为简单的判别决策规则为:
1)分类任务,那么找这K个训练集样本中出现次数最多的那个标签作为该测试样本标签,如下图:
2)回归任务,基于这K个训练集样本求均值,将其作为该测试集样本的结果。
不过KNN正是因为基于K个近邻进行测量的方法,所以其出问题也就在这里,因为该模型不适合作为高特征维度下的选择。因为它会遇到维数灾难的问题。举个例子,假如当前数据集是均匀分布在一个D维特征的空间中的,假设我们需要计算测试样本
也就是假如维度为
当维度为2,且样本能够无限多,那么该模型表现才是最好的(Cover and Hart 1967)。所以按道理,高维数据其实不适合KNN[]
不过幸运的是, 有一个效应可以在一定程度上抵消维度灾难, 那就是所谓的“ 非均匀性的祝福”(blessing of nonuniformity) 。在大多数应用中, 样例在空间中并非均匀分布, 而是集中在一个低维流形manifold) 上面或附近。 这是因为数字图片的空间要远小于整个可能的空间。 学习器可以隐式地充分利用这个有效的更低维空间, 也可以显式地进行降维。[]
2 距离度量
KNN中最常用的方法就是欧式距离计算法,当然也有
假设样本的特征空间
这里
当
当
当
上图为在2维情况下到原点的距离为
3 K值选取
K值的选择会对KNN模型的结果产生重大影响。这就是一个模型选择问题。
模型选择:假设当前是一个KNN回归问题。现在是需要对点
第一项叫做不可避免的误差,是我们不可控制的,第二项和第三项是我们能够控制的,分别对应着模型的偏置和方差。偏置随着K变大而变大,方差随着K变大而变小。即K越大,模型越简单,K越小,模型越复杂:
4 搜索优化
实现KNN模型时,主要考虑的还有个问题是如何对训练集的样本点进行快速的K近邻搜索。当特征空间维度太大,或者训练集样本点很多的时候特别重要。最基础的搜索方法就是线性搜索了,可想而知每个测试样本在比较时,都需要去计算一遍训练集的所有样本。效率着实不高。所以才需要量身定做的数据结构搜索方法。
4.1 - KD树
KD树是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。KD树是二叉树,表现为对K维空间的一个划分,构造kd树相当于不断的用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个节点最后对应于一个k维超矩形区域。kd树搜索的平均计算复杂度是
1 - 构造过程
构造过程;假设训练集一共
1)构造根节点:先计算所有样本第1维组成的向量的中位数。然后将该中位数表示的样本作为根节点
2)构造后续节点:对于步骤1)划分到左子树的所有样本点,按照它们第2维度找中位数,并将中位数对应的样本作为该子树的根节点
通过不断的找中位数表示的样本,不断的对k维空间进行分割,直到两边子树只剩下一个样本作为叶子节点。这样的kd树是平衡的,不过却不一定是最优的。
ps:(1)当划分层数太深,而维度不够用时,从头开始,即从第1维接着开始; (2)树的每个节点都对应一个样本。
拿《统计学习方法》例3.2来说,假设训练集样本有{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
第0层根节点,找第1维中位数对应样本点:[2,4,5,7,8,9],中位数从[5,7]中挑中7,得当前根节点为(7,2),分得左子树{(2,3),(4,7),(5,4)};右子树{(8,1),(9,6)}
第1层根节点,找第2维中位数对应样本点:左子树:[3,4,7]-4;右子树[1,6]-6。分得第1层
左子树{(2,3)}【(5,4)】{(4,7)};右子树{(8,1)}【(9,6)】
第2层,因为第一层分割后只剩下每个根节点对应的左右子树都只有一个样本,作为叶子节点,所以无需再分,结果如下图:
2 - 搜索过程
在基于上面构造好kd树之后,当来了一个测试样本,考虑的就是该如何找到它对应的最近邻样本。
步骤:
1 - 按照训练好的kd树,从第1维开始不断的按照之前的训练过程对比下去,找到对应的叶子节点,如当前测试样本点为(3,4),3<7 =>(5,4); (4==4),因为(5,4)不是叶子节点,接着往下;2<3 且3<4,挑一个叶子节点(2,3)。
2 -
4.2 - Ball树
(待续)
参考资料:
[] Machine Learning A Probabilistic Perspective
[] 李航,统计学习方法
[] The Elements of Statistical Learning Data Mining, Inference, and Prediction (Second Edition)
[] Pedro Domingos,A Few Useful Things to Know About Machine Learning
- KNN - 笔记(1)
- 1、KNN 学习笔记
- KNN-笔记(1)
- KNN笔记
- 《机器学习实战》之kNN-笔记1
- CS231n学习笔记1-图像分类,KNN
- KNN学习笔记
- KNN 学习笔记
- KNN 实践笔记
- KNN学习笔记
- KNN学习笔记
- knn算法学习笔记
- KNN-笔记(2)
- 代码笔记--kNN算法
- kNN算法笔记
- KNN入门学习笔记
- 机器学习笔记——(1)kNN算法
- 机器学习实战学习笔记1——KNN算法
- IntelliJ IDEA获取免费使用时间
- 代码风格的简单整理
- [图形学] 布料仿真(质点弹簧模型)
- java集合框架
- 【jsp】 3个编译指令和7个动作指令
- KNN - 笔记(1)
- HBASE我遇坑之client.AsyncProcess: #1, waiting for 5012 actions to finish
- static、初始化代码块
- NOIP 2012 疫情控制
- C++中如何动态分配二维数组
- 实现记住密码功能
- php 小笔记 form/
- 安装linux内核函数的mandocs.
- Java学习(让我记录下这有趣的故事:2016/10/14)