k-近邻算法(k-neighbor,k-NN)是一种基于分类和回归的方法, 回归的值由k个最近的样例值的平均值作为预测决定,还可以基于距离远近进行加权平均,距离越近的样本权重越近。本节只讨论分类问题中的k近邻法。
k近邻假设给定一个训练数据集,其中的实例类别已定(已有标签).在分类时,对新的实例,根据其k个最近邻的训练实例的类别(即选中的k个样本),通过多数表决(投票法)等方式进行预测新的实例的类别(即k个样本中同类类别最多的那个类别即为预测的类别)。
注意:这里的训练数据集并没有训练的过程(学习的过程),它只是将训练数据集对特征向量进行划分,并将其作为分类的“模型”,它是“懒惰学习”的代表。
上图为:k=3时,绿色的点的类别被判定为红点
k=5时,绿色的点的类别被判定为蓝点
k-近邻算法的三个基本要素为:
- k的取值 (k值可以有交叉验证法选取最优的k值)
- 距离度量 (一般使用欧氏距离,也可以使用其他距离)
- 分类决策 (往往是多数表决法)
3.1 k-近邻算法
附:argmaxf(x)函数为返回使f(x)最大的x值(这里指的就是同类类别最多的那个x类别)
3.2 k-近邻模型
3.2.1 模型
即根据选中的k划分特征空间,如:
k=5,从任意一点开始,选中5个为一个单元(cell),直至划分完毕
3.2.2 距离度量
一个点和一个点之间的距离,无论是什么计算方式,基本上离不开 L p L_p Lp距离。我们熟知的欧式距离,则是 L 2 L_2 L2范式,也就是p=2的情况,而另一个很熟悉的距离曼哈顿距离,则是 L 1 L_1 L1范式。 L − p L-p L−p距离的定义如下:
附:关于机器学习中的距离和相似性度量方法可以参考以下文章,总结的非常全面:
- 理论:https://blog.csdn.net/mingzai624/article/details/53814409
- python代码实现部分可以看:http://www.cnblogs.com/denny402/p/7027954.html
3.2. 3 k值的选择
1. 附:如何理解和区分近似误差和估计误差?
近似误差:可以理解为对现有训练集的训练误差。
估计误差:可以理解为对测试集的测试误差。
在这个k临近法中其实设定的k值越小,得出的模型是越复杂的,因为k值越小会**导致特征空间被划分成更多的子空间(可以理解为模型的项越多)。**而k值越大得到的模型其实是越简单的.
所以当k值越小,对于训练集的预测更加精确,近似误差会越小(因为你选择了更加复杂的模型去预测训练集)。当k值越大,对于训练集的预测则不会那么准确,所以近似误差会越大(因为你选择了更加简单的模型去预测)。