k近邻算法的原理、示例与分析
代码参考书籍
Python机器学习基础教程. Andreas C.muller, Sarah Guido著(张亮 译). 北京:人民邮电出版社,2018.1(2019.6重印)
实现环境
System:Ubuntu server 20.04 (Jupyter notebook)
GPU:GeForce GTX 1080Ti(2块)
Driver Version: 450.36.06
CUDA Version: 11.0
Python Version: 3 .8.5
TensorFlow Version:2.4.1
1. 算法概述
近邻算法是最简单的监督学习算法,它既可以用于处理分类问题,也可以用于解决回归问题;构建模型只需要保存训练数据集即可,模型容易理解,往往不需要过多调节就可以得到不错的性能;但对于训练样本大,特征向量维度大(几百)的数据集往往效果不好(计算复杂度高),对于大多数特征的取值为0的稀疏数据集,效果尤其不好。
应用时,k越小,模型的偏差越小,泛化能力越弱;当k很小时,可能造成过拟合。反之,k越大,模型的偏差越大,对噪声数据越不敏感,泛化能力越强;当k值很大时,可能造成欠拟合。
2.算法原理
2.1 分类问题
依据相似度确定未知对象的类别是人类对事物进行分类的最简单方法,正所谓“物以类聚人以群分”。k近邻算法(KNN算法)由Thomas等人在1967年提出[1]。它正是基于以上思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计出这些样本的类别并进行投票,票数最多的那个类就是分类的结果[2]。
预测算法(分类)的流程如下:
(1)在训练样本集中找出距离待测样本x_test最近的k个样本,并保存至集合N中;
(2)统计集合N中每一类样本的个数 C i , i = 1 , 2 , . . . c C_{i}, i=1,2,...c Ci,i=1,2,...c。
(3)最终的分类结果为 a r g m a x C i arg maxC_{i} argmaxCi(最大的对应的 C i C_i Ci那个类)。
在上述实现过程中,k的取值尤为重要。它可以根据问题和数据特点来确定。在具体实现时,可以考虑样本的权重,即每个样本有不同的投票权重,这种方法称为带权重的k近邻算法,它是一种变种的k近邻算法。
2.2 回归问题
假设离测试样本最近的k个训练样本的标签值为 y i y_i yi,则对样本的回归预测输出值为:
y ^ = ( ∑ i = 1 k y i ) / k (1) \hat{y}=(\sum_{i=1}^{k}y_i)/k \tag{1} y^=(i=1∑kyi)/k(1)
即为所有邻居的标签均值。
带样本权重的回归预测函数为: y ^ = ( ∑ i = 1 k w i y i ) / k (2) \hat{y}=(\sum_{i=1}^{k}w_iy_i)/k \tag{2} y^=(i=1∑kwiyi)/k(2)其中 w i w_i wi为第个