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 vert ^ 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: 算法并行工作的数目。

参考:

  李航 《机器学习方法》

原文地址:https://www.cnblogs.com/jiaxin359/p/8947791.html