C++实现的简单的K近邻算法(K-Nearest Neighbor,K-NN)
前一段时间学习了K近邻算法,对K近邻算法有了一个初步的了解,也存在一定的问题,下面我来简单介绍一下K近邻算法。本博客将从以下几个方面开始介绍K近邻算法:
1、K近邻算法的介绍
2、K近邻算法的模型及其三要素
3、C++实现的简单KNN算法
4、KNN算法的优缺点
5、遇到的问题
一、K近邻算法的介绍
K近邻算法(K-Nearest Neighbour,K-NN)是一种基本分类与回归方法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
K近邻算法简单,直观。给定一个训练数据集,对于新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数某个类,就把该输入实例归入这个类。K近邻法没有显示的学习过程。
1.1 算法(K近邻法)
1.2 KNN算法的实现步骤:
step.1---初始化距离为最大值
step.2---计算未知样本和每个训练样本的距离dist
step.3---得到目前K个最临近样本中的最大距离maxdist
step.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本
step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完
step.6---统计K个最近邻样本中每个类别出现的次数
step.7---选择出现频率最大的类别作为未知样本的类别
空洞的描述不易理解,生动的例子会方便我们进行理解,下面将举例帮助我们理解。
如图所示,有两类不同的数据样本,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在,我们不知道中间那个绿色的数据是从属于哪一个类(蓝色小正方形or红色小三角形),那么这个数据到底是哪个类呢?
1、如果K=3,绿色圆点的最近的三个邻居是2个红色小三角形和1个蓝色小正方形,那么就可以判定这个绿色的待分类的圆形点属于红色小三角形类。
2、如果K=5,绿色圆点的最近的五个邻居是2个红色小三角形和3个蓝色小正方形,那么就可以判定这个绿色的待分类的圆形点属于蓝色小正方形类。
我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。