KNN(K-Nearest-Neighbor)最邻近分类算法
提出问题
已知N维空间中若干个点的坐标,以及这些点所属的类别(子空间)。给定新的点坐标,如何判断该点应被划入哪个类别(子空间)?
分析问题
KNN(K-Nearest-Neighbor)算法基本思想:
- 已知一批数据集及其对应的分类标签,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集里与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类。
- 具体步骤:
(1) 计算测试数据与各个训练数据之间的距离;
(2) 按照距离的递增关系进行排序;
(3) 选取距离最小的K个点;
(4) 确定前K个点所在类别的出现频率;
(5) 返回前K个点中出现频率最高的类别作为测试数据的预测分类。
每次预测时,必须即时跟所有训练数据进行计算,因此工作量很大。
K值的选取:
- K可以视为一个hyper-parameter(超参数),一般需要通过交叉验证的方法来选取最优值
- 如果K值太小就意味着整体模型变得复杂,容易发生过拟合(High Variance),即如果邻近的实例点恰巧是噪声,预测就会出错,极端的情况是K=1,称为最近邻算法,对于待预测点x,与x最近的点决定了x的类别
- K值的增大意味着整体的模型变得简单,极端的情况是K=N,那么无论输入实例是什么,都简单地预测它属于训练集中最多的类。这样的模型过于简单,容易发生欠拟合(High Bias)
K-D树方法:
- K近邻法的最简单实现是线性扫描(又称暴力法),这时要计算输入实例与每一个训练实例的距离,当训练集很大时,计算非常耗时,这种方法是不可行的
- 为了提高K近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。K-D树提供了一种最基本的方法
- 可将K-D树看成类似于二叉查找树的数据结构,每个训练数据存储在这个数据结构中。在查找数据时,采用类似于中序遍历的算法。(但实际过程要复杂许多)。
- K-D树搜索的平均复杂度为 𝑂(𝑙𝑜𝑔𝑀) 。其中,M为样本数量。但是当Feature数量N很大时,搜索性能将急剧下降。一般K-D树适于M>>N的情形
KNN的优点:
- 精度较高,对异常值不太敏感
- 特别适合多分类的情况
- 简单易实现
- 很多情况下比朴素贝叶斯的效果更好
KNN的缺点:
- 计算复杂度高,空间复杂度高
案例实现简单的KNN算法
- 给定若干组数据及其对应分类,再给定一组测试数据