k近邻法(KNN)是一种基本分类和回归方法。k近邻法的输入为实例的特征向量,对应于特征空间中的点;输出为实例的类别,可以取多类。k近邻法假设给定一个训练数据集,其中的实例类别已定。分类时候,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻法不具有显式的学习过程。k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。k值的选择、距离度量及分类决策规则是k近邻法的三个要素。
3.1k近邻算法
算法3.1(k近邻法)
输入:训练数据集
输出:实例x所属的类y。
(1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖着k个点的x的邻域记作
(2)在
k近邻法的特殊情况是k=1的情形,称为最近邻算法。对于输入的实例点(特征向量)x,最近邻法将训练数据集中与x最邻近点的类作为x的类。
3.2k近邻模型
距离度量:设特征空间是n维是实数向量空间
(1)当p=2时候,称为欧氏距离
(2)当p=1时候,称为曼哈顿距离
(3)当p=无穷大的时候,它是各个坐标距离的最大值,即
k值的选择
k值的选择会对k近邻法的结果产生重大影响。
如果选取较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近的(相似的)训练实例才对预测结果起作用,但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果临近的实例点恰好是噪声,预测就会出错。换句话说,k值的减小意味着整体模型变得复杂,容易发生过拟合。
近似误差可以理解为模型估计值与实际值之间的差距。估计误差可以理解为模型的估计系数与实际系数之间的差距。
在k临近法中其实设定的k值越小,得到的模型是越复杂的,因为k值越小会导致特征空间被划分成更多的子空间(可以理解为模型的项越多)。而k值越大得到的模型其实是越简单的,所以当k值越小,对于训练集的预测更加精确,近似误差会越小。当k值越大,对于训练集的预测不会那么准确,所以近似误差会越大。
如果选择较大的k值,就相当于用较大邻域中的训练实例进行预测。其优点是可以减少学习的估计误差。但缺点是学习的近似误差会增大。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使得预测发生错误。k值的增大意味着整体模型变得简单。
如果k=N,那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。这时,模型过于简单,完全忽略训练实例中的大量有用信息,是可取的。
在应用中,k值一般取一个比较小的数值。通常采用交叉验证法来选取最优k值。
分类决策规则
k近邻法中的分类决策规则往往是多数表决,即由输入实例的k个邻近的训练实例中的多数类决定输入实例的类。多数表决规则等价于经验风险最小化。
3.3k近邻法的实现:kd树