前言
K最近邻(k-NearestNeighbor,K-NN)算法是一个有监督的机器学习算法,也被称为K-NN算法,由Cover和Hart于1968年提出。可以用于解决分类问题和回归问题。此外,作为一个理论上比较成熟的机器学习算法,关于K近邻算法的介绍有很多,比如算法执行的步骤、应用领域等。不过网上关于K近邻算法的大多数介绍都非常繁杂且缺乏简单实用的代码示例。这样不免会增加学习负担,在这篇文章中我们将针对这个问题以最简单的实例,带大家来轻松地进阶掌握K近邻算法。
基本原理
K最近邻算法的基本原理是,对给定的训练数据集,对新的输入实例,在训练数据集中找到与该实例最近邻的K个实例,依据“少数服从多数”的原则,根据这K个实例中占多数的类,就把该实例分为这个类。
换言之,它实际上是利用训练数据集对特征空间进行划分,采用测量不同特征值之间的距离方法进行分类。如下图所示,给定了红色和蓝色的训练样本,绿色为测试样本。然后计算绿色点到其他点的距离,同时选取离绿点最近的k个点。如果选定k=1时,k个点全是蓝色,那预测结果就是绿色为类别1(蓝色);k=3时,k个点中两个红色一个蓝色,这里采取“少数服从多数”原则,那预测结果就是类别2(红色)。
K最近邻算法示意图
在K-NN算法中,K值的选择、实例之间距离的度量及分类决策规则是三个基本要素。
1.K值的选择
K值的选择会对分类结果产生重要影响。如果k值过小,新样本选择的范围就小。只有与新样本很近的点才会被选择到,那么模型就比较复杂,容易发生过拟合。如果k值过大,新样本选择的范围增大,那么模型就会变得简单,容易发生欠拟合。举个极端的例子,如果k的值是整个训练集的样本数,那么返回的永远是训练集中类别最多的那一类,也就失去了分类的意义。。
2.距离的度量
特征空间中两个实例点的距离是两个实例点相似程度的反映。K近邻的第一步,是找到x的最近邻。那么这个近邻怎么衡量呢?一般我们用距离来衡量,常见的有欧氏距离和曼哈顿距离。
欧式距离如下式
而曼哈顿距离如下式
3.分类决策规则及效率
由输入实例的K个临近训练实例的多数决定输入实例的类别。这K个近临实例的权值可以相同,也可以根据一定的规则产生不同的权值,如离输入实例越近,权值相应也越大。此外,k近邻算法在实现时,要计算新样本与训练集中每一个实例的距离。这种线性搜索会大大增加时间的消耗,尤其是在数据量很大的情况下。为了提高效率,会使用KD树的方法。KD树是一种二叉树,主要是按训练集数据的不同维度的中位数来划分区域。
K最近邻(k-NearestNeighbor,K-NN)算法是一个有监督的机器学习算法,也被称为K-NN算法,由Cover和Hart于1968年提出。可以用于解决分类问题和回归问题。此外,作为一个理论上比较成熟的机器学习算法,关于K近邻算法的介绍有很多,比如算法执行的步骤、应用领域等。不过网上关于K近邻算法的大多数介绍都非常繁杂且缺乏简单实用的代码示例。这样不免会增加学习负担,在这篇文章中我们将针对这个问题以最简单的实例,带大家来轻松地进阶掌握K近邻算法。
基本原理
K最近邻算法的基本原理是,对给定的训练数据集,对新的输入实例,在训练数据集中找到与该实例最近邻的K个实例,依据“少数服从多数”的原则,根据这K个实例中占多数的类,就把该实例分为这个类。
换言之,它实际上是利用训练数据集对特征空间进行划分,采用测量不同特征值之间的距离方法进行分类。如下图所示,给定了红色和蓝色的训练样本,绿色为测试样本。然后计算绿色点到其他点的距离,同时选取离绿点最近的k个点。如果选定k=1时,k个点全是蓝色,那预测结果就是绿色为类别1(蓝色);k=3时,k个点中两个红色一个蓝色,这里采取“少数服从多数”原则,那预测结果就是类别2(红色)。
K最近邻算法示意图
在K-NN算法中,K值的选择、实例之间距离的度量及分类决策规则是三个基本要素。
1.K值的选择
K值的选择会对分类结果产生重要影响。如果k值过小,新样本选择的范围就小。只有与新样本很近的点才会被选择到,那么模型就比较复杂,容易发生过拟合。如果k值过大,新样本选择的范围增大,那么模型就会变得简单,容易发生欠拟合。举个极端的例子,如果k的值是整个训练集的样本数,那么返回的永远是训练集中类别最多的那一类,也就失去了分类的意义。。
2.距离的度量
特征空间中两个实例点的距离是两个实例点相似程度的反映。K近邻的第一步,是找到x的最近邻。那么这个近邻怎么衡量呢?一般我们用距离来衡量,常见的有欧氏距离和曼哈顿距离。
欧式距离如下式
而曼哈顿距离如下式
3.分类决策规则及效率
由输入实例的K个临近训练实例的多数决定输入实例的类别。这K个近临实例的权值可以相同,也可以根据一定的规则产生不同的权值,如离输入实例越近,权值相应也越大。此外,k近邻算法在实现时,要计算新样本与训练集中每一个实例的距离。这种线性搜索会大大增加时间的消耗,尤其是在数据量很大的情况下。为了提高效率,会使用KD树的方法。KD树是一种二叉树,主要是按训练集数据的不同维度的中位数来划分区域。