KNN算法概述
K-最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法。
适用条件:离散型数值变量,需要将数据进行预处理(数值化和归一化)
原理:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数类,就作为该输入实例的类。
若K=1,我们就只找最近的一个点作为其分类,这种分类方法称为最近邻算法。
算法流程:给定一个新的输入实例,我们算出该实例与每一个训练点的距离(若为线性结构,复杂度为o(n)),然后找到距离最小的前k个数据,这k个哪个类别数最多,我们就认为新的输入实例就是哪类!
决定KNN算法的好坏最重要的三个条件是:K值的选取、距离函数的构造以及样本数据的存储方法和搜索方法。
K值的选取:K值的选取将会对算法的结果产生重大影响。
K值过小,那么只用较小的邻域进行预测,若邻域中的点噪声比较多,那么就会预测出错,也就是说近似(训练)误差减小,估计(测试)误差增大,容易产生过拟合。
K值过大,那么用较大的邻域进行预测,这会使得样本空间中大类数据占据优势,降低预测准确率,即近似误差增大,估计误差减小。
K值的选取一般取一个较小的值,并通过交叉验证法(调参)来选取最优的K值。
距离函数的构造:
有如下方法:
一般我们采用欧氏距离,即:
在实际应用中,距离函数的设计视情况而定,比如欧式距离没有考虑各项特征的权重,若某项特征比较重要我们就可以对其赋予较高权重。权重的主观赋值方法有层次分析、模糊数学等。
样本数据的查找和搜索方法:
上文说到判断一个输入的类别,我们需要对所有训练数据逐一计算距离,常规方法是线性查找,如果数据量很大的话,非常耗时,因此此需要一个更为高效的数据存储方法以减少计算次数。比如kd树(下文更新)和ball树