3.1 K最近邻算法的原理
K最近邻算法的原理,正如我们本章标题所说——近朱者赤,近墨者黑。想象一下我们的数据集里面有一半是“朱”(图中浅色的点),另一半是“墨”(图中深色的点)。现在有了一个新的数据点,颜色未知,我们怎么判断它属于哪一个分类呢?如图3-1所示。
图3-1 判断新数据点属于“朱”还是“墨”
对于K最近邻算法来说,这个问题就很简单:新数据点离谁最近,就和谁属于同一类,从图3-1中我们可以看出,新数据点距离它8点钟方向的浅色数据点最近,那么理所应当地,这个新数据点应该属于浅色分类了,如图3-2所示。
图3-2 最近邻数等于1时的分类
看起来,K最近邻算法真是够简单的,这么轻松就完成了分类的工作。别急,我们还没说完。刚才只是举的最简单的例子,选的最近邻数等于1。但如果我们在模型训练过程中让最近邻数等于1的话,那么非常可能会犯了“一叶障目,不见泰山”的错误,试想一下,万一和新数据点最近的数据恰好是一个测定错误的点呢?
所以需要我们增加最近邻的数量,例如把最近邻数增加到3,然后让新数据点的分类和3个当中最多的数据点所处的分类保持一致,如图3-3所示。
图3-3 最近邻数等于3时的分类
从图3-3中我们看到,当我们令新数据点的最近邻数等于3的时候,也就是找出离新数据点最近的3个点,这时我们发现与新数据点距离最近的3个点中,有2个是深色,而只有1个是浅色。这样一来,K最近邻算法就会把新数据点放进深色的分类当中。
以上就是K最近邻算法在分类任务中的基本原理,实际上K这个字母的含义就是最近邻的个数。在scikit-learn中,K最近邻算法的K值是通过n_neighbors参数来调节的,默认值是5。
注意 K最近算法也可以用于回归,原理和其用于分类是相同的。当我们使用K最近邻回归计算某个数据点的预测值时,模型会选择离该数据点最近的若干个训练数据集中的点,并且将它们的y值取平均值,并把该平均值作为新数据点的预测值。