K近邻分析(KNN)
一、概述
KNN算法是一种有监督学习的分类算法。所谓有监督学习,就是在应用算法之前我们必须准备一组训练集,训练集中的每个实例都是由一些特征和一个分类标签组成;通常还会存在一个测试集,用来测试训练出来的分类模型的准确性。其实KNN算法并没有体现出有监督学习的所有特点,没有模型,只有算法。甚至可以说这就是一种暴力扫描法,运行效率上比较低效。
KNN的具体算法为:
二、KNN的实现:
注:最后的多数表决相当于0-1最小风险。
三、KNN的参数选择:
(1) 距离的选择:LP范数
(2) K的选择:K值的选择会对k近邻法的结果产生重大影响。如果k较小,相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近的训练实例才会对预测产生作用,但是“学习”的估计误差会增大,预测的结果会对近邻的实例点非常敏感,如果近邻的实例点恰好是噪声,预测就会出错,换而言之,k的值偏小,意味着模型变复杂,冗余发生过拟合;如果选择较大的K值,就相当于在较大的邻域中的训练实例进行预测,其优点是可以减少学习的估计误差,缺点是学习的近似误差会增大,这是与输入实例较远的训练实例也会对预测起作用,使预测发生错误。在应用中,k一般取一个比较小的数值,通常采用交叉验证法来取选择最优的K值。
四、KNN的实现-kd树
实现k近邻法时,主要考虑的问题是:如何对训练数据进行快速k近邻搜索。最简单的实现方法是线性扫描,这种方法比较耗时,为了提高k近邻搜索的效率,可以考虑特殊结构存储数据,以减少计算距离的次数,具体方法有很多,kd树(kd tree)就是其中的一种。