k近邻算法是最简单最容易理解和实现的惰性机器分类与回归算法,它只是将全部的训练样本都记录下来,在预测的时候根据一定的距离度量准则和决策规则选出最合适的类别或则数值输出。和SVM或者CNN相比,它没有显示的学习过程,是一种惰性的学习算法。本文以kNN分类算法为例对其做简单介绍。
欢迎探讨,本文持续维护。
N/A,纯数学公式推导,无代码
当给定训练集合D,模型记录下所有的训练集合,在新的测试样本t来的时候,kNN方法在训练集合中寻找k个和t距离最近的样本,根据这k个样本中占主要类别的类作为t的类。
从上面的描述可以知道,在给定了训练集合之后,kNN算法中的关键因素有如下三点:
- k值的选择
- 距离的定义
- 决策规则
下面对这三点做逐一分析
先讨论特殊的情况,如果k=1,那么就是选训练集合中与测试样本最近的样本的类作为预测的类,此时模型复杂,任何在训练样本中出现过的样本都会被正确分类,但是,每次分类结果仅取决于训练集合中的单一样本,这样也就对训练集合中的噪音非常敏感,类似于过拟合。另一个极端,如果k=训练集合中的样本个数,此时模型简单,对于任意的测试样本,输出都是训练集合中占主导类别的类,较远的(不相似的)点也对分类结果起作用,明显分类效果很差,类似于欠拟合。
那么怎么选择合适的k值呢?
首先,从训练集合的数据量来看。在训练集合比较小的情况下,建议先认真清理数据,然后选择比较小的k值;在训练集合比较大的情况下,选择比较大的k值提高对噪音的鲁棒程度。
其次,用k折交叉验证来选择合适的k值是一个比较稳妥的方法。另外,可以利用网格搜索技术来加快超参数挑选。
特征空间中两个相似点的距离远近代表它们的相似度。有很多计算空间中点点相似度的方法,比如L1距离,L2距离,L无穷大距离,还有余弦距离等。需要注意的是,相同的两个点,取不同的距离度量方式,得出的相似度可能是不一样的!
具体的距离度量方式取决于具体的问题(要选距离越小,相似性越大的距离,比如文本分类选余弦距离比欧氏距离更合适),这里很难一概而论。不过,有几点需要注意一下的:
- 预处理,要将不同维度的取值范围归一化,避免少数维度在距离度量中占主导地位;
- 特征选择,特征空间中各个维度的特征关联性越小越好,最好正交。
在选取了k个距离最近的训练样本后,按什么方式决策测试样本的类别呢?一般用多数表决法,即选择这k个最近邻中出现次数做多的类别作为模型的输出类别。
可以证明,在损失函数取0-1损失函数时候,多数表决法等价于经验风险最小化。
研究表明,在一定条件下,最近邻的分类错误率不会超过两倍的贝叶斯错误率。而且,一般kNN方法的错误率会收敛到贝叶斯错误率,所以我们可以将kNN算法作为贝叶斯的近似。
kNN算法是一种不需要训练过程的惰性算法,可以用于分类任务也可用于回归任务。它思路简单,容易理解,而且性能也不错。本文从算法原理、关键因素、超参数选择和性能分析等方面对其进行了初步介绍和总结。