1、基本概念
K近邻法(K-nearest neighbors,KNN)既可以分类,也可以回归。
KNN做回归和分类的区别在于最后预测时的决策方式。
KNN做分类时,一般用多数表决法
KNN做回归时,一般用平均法。
基本概念如下:对待测实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中
2. KNN算法三要素
KNN算法主要考虑:k值的选取,距离度量方式,分类决策规则。
1) k值的选取。在应用中,k值一般选择一个比较小的值,一般选用交叉验证来取最优的k值
&n本文来源gao@daima#com搞(%代@#码@网&bsp; 当K值较小,训练误差减小,泛化误差增大,模型复杂容易过拟合;
当K值较大,泛化误差减小,训练误差增大,模型简单使预测发生错误(一个极端,K等于样本数m,则完全没有分类,此时无论测试集是什么,结果都属于训练集中最多的类)
2)距离度量。Lp距离:误差绝对值p次方求和再求p次根。欧式距离:p=2的Lp距离。曼哈顿距离:p=1的Lp距离。p为无穷大时,Lp距离为各个维度上距离的最大值
3)分类决策规则。也就是如何根据k个最近邻决定待测对象的分类。k最近邻的分类决策规则一般选用多数表决
3. KNN基本执行步骤
1)计算待测对象和训练集中每个样本点的欧式距离
2)对上面的所有距离值排序
3)选出k个最小距离的样本作为“选民”
4)根据“选民”预测待测样本的分类或值
4. KNN特点
1)原理简单
2)保存模型需要保存所有样本集
3)训练过程很快,预测速度很慢
· 优点:
精度高、对异常值不敏感
可用于数值型数据和离散型数据(既可以用来估值,又可以用来分类)
· 缺点:
时间复杂性高;空间复杂性高;需要大量的内存
样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。
最大的缺点是无法给出数据的内在含义。
需要思考的问题:
样本属性如何选择?如何计算两个对象间距离?当样本各属性的类型和尺度不同时如何处理?各属性不同重要程度如何处理?模型的好坏如何评估?
5.代码实现
K近邻算法的一般流程:准备数据- 分析数据- 测试算法- 使用算法
5.1 sklearn包实现
关于sklearn的详细介绍,请见之前的博客 //www.gaodaima.com/article/204984.htm
5.1.1 sklearn实现k-近邻算法简介 官方文档
5.1.2 KNeighborsClassifier函数8个参数
- - n_neighbors:k值,选取最近的k个点,默认为5;k值不同分类结果也会不同
- - weights:默认是uniform,参数可以是uniform(均等权重)、distance(按距离分配权重),也可以是用户自己定义的函数。uniform是均等的权重,就说所有的邻近点的权重都是相等的。
- - algorithm:快速k近邻搜索算法,默认参数为auto。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索。
- - leaf_size:默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。需要根据问题的性质选择最优的大小。
- - metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度量)。
- - p:距离度量公式。欧氏距离和曼哈顿距离。这个参数默认为2,也可以设置为1。
- - metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。
- - n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。如果为-1,那么CPU的所有cores都用于并行工作。