knn算法
理论基础
knn是k近邻算法(k-nearest neighbor),可以用在分类,回归当中。这里讨论一下分类问题。
knn是一种基于实例的学习,在训练的时候只是把数据加载进去,预测的时候基于已经加载的数据预测出输入实例的标签。预测的策略是:采用距离这个实例最近的k个数据的标签。
所以这里涉及到一些技术:1:如何选择k。2:如何度量实例之间的距离。 3:距离度量以后如何选择标签。 如果这三个因素确定了,那么一个knn算法也就确定了。
1:如何选择k
k对于模型的影响。当k的值越小的时候,数据集当中只有较少的数据会对新的实例产生影响。如果这些数据的噪声比较大,那么对于结果的影响也非常的大。会出现过拟合的现象。 而k的值越大,那么,数据当中大多数的数据都会对预测结果产生影响,这个时候在训练集上面的表现就会很差,对训练集的拟合不是很好。
选择k的时候运用交叉验证加上网格搜索的策略可以选择最优的k。
2:如何度量距离
使用$L_p$距离(又叫做闵可夫斯基Minkowski距离)来进行度量。$L_p(\mathbf{x} , \mathbf{y} ) = (\sum \limits_{i=1} ^{n} \lvert x_i – y_i \rvert ^ p )^{\frac{1}{p}}$
当p为1的时候为曼哈顿距离,当p为2的时候为欧氏距离。 一般选择欧氏距离就可以。
3:如何选择标签
最简单的方法是使用投票法选择出现类最多的标签。除此之外我们还可以根据计算出来的距离进行加权,如果距离比较近,那么对这个类的加权就比较高。
如何搜索k个近邻数据
还有一个非常重要的,值得研究的地方。当我们输入一个实例的时候如何得到距离它最近的k个实例。可能最简单的想法是直接计算出来距离,然后看它和这些值之间的距离,哪个最近选择哪个。 但是这个想法在数据量很大的时候是不可以的。为了解决这个问题有很多的方法,比如kd树,球树等。这里没有介绍。
sklearn当中的knn
sklearn当中提供了无监督的knn,knn回归还有knn分类。这里看一下knn分类算法。
knn分类算法有两种实现 KNeighborsClassifier,RadiusNeighborsClassifier 。前者控制k的个数,后者是控制半径。
我们来看一下KNeighborsClassifier当中的参数:
n_neighbors: knn当中n的个数。
weights: 权重,衡量输入实例到每个样本的权重。uniform的时候是每个样本权重相等,distance是距离越近,样本权重越高。还可以传入自定义的算法。
algorithm : {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’} 我们使用的算法,可以选择:球树,kd树,brute-force算法。
leaf_size: 为球树和kd树设置的叶子的大小。
p:闵可夫斯基距离度量的P值默认为2
metric: 度量距离的标准,默认为闵可夫斯基度量标准,也可以自定义。
metric_params:自定义的metric的参数。
n_jobs: 算法并行工作的数目。
参考:
李航 《机器学习方法》