记 KNN 的理解
in Note with 0 comment
记 KNN 的理解
in Note with 0 comment

K邻近算法

K邻近算法(KNN)(k-nearest neighbors) 非常简单且非常有效。KNN 的模型表示是整个训练数据集。简单吧?

通过搜索K个最相似的实例(邻居)的整个训练集并总结那些K个实例的输出变量,对新数据点进行预测。对于回归问题,这可能是平均输出变量,对于分类问题,这可能是模式(或最常见)类值。

诀窍在于如何确定数据实例之间的相似性。如果您的属性具有相同的比例(例如,以英寸为单位),则最简单的技术是使用欧几里德距离,您可以根据每个输入变量之间的差异直接计算该数字。

knn-demo-count

KNN可能需要大量内存或空间来存储所有数据,但仅在需要预测时才进行计算(或学习),及时。您还可以随着时间的推移更新和策划您的训练实例,以保持预测准确。

距离或接近度的概念可以在非常高的维度(许多输入变量)中分解,这会对算法在您的问题上的性能产生负面影响。这被称为维度的诅咒。它建议您仅使用与预测输出变量最相关的输入变量。

百度百科版本

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

维基百科版本

在模式识别中,k-最近邻算法(k-NN)是用于分类和回归的非参数方法。在这两种情况下,输入都包含特征空间中最近的k个训练样例。输出取决于k-NN是用于分类还是回归:

k-NN是一种基于实例的学习或懒惰学习,其中函数仅在本地近似,并且所有计算都推迟到分类。该k-NN算法是最简单的所有中机器学习算法。

优缺点

优点:

缺点

我的理解

在我看来,knn就是计算测试数据与每一个训练数据的距离,取出距离最近的K个训练数据的标签,以其中数量最多的作为测试数据的预测标签。

思路是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

算法流程

1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类

K的取值

K:临近数,即在预测目标点时取几个临近的点来预测。

K值得选取非常重要,因为:

常用的方法是从k=1开始,使用检验集估计分类器的误差率。重复该过程,每次K增值1,允许增加一个近邻。选取产生最小误差率的K。一般k的取值不超过20,上限是n的开方,随着数据集的增大,K的值也要增大。

kdtree

kdtree 的意义在于使得 knn算法的搜索环节更快,提升整体运行速度。

k-d树是每个节点都为k维点的二叉树。所有 非叶子节点可以视作用一个超平面把空间分割成两个半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。选择超平面的方法如下:每个节点都与k维中垂直于超平面的那一维有关。因此,如果选择按照x轴划分,所有x值小于指定值的节点都会出现在左子树,所有x值大于指定值的节点都会出现在右子树。这样,超平面可以用该x值来确定,其法线为x轴的单位向量。

简单来说,就是:

k-d-tree-block-2021-11-09

k-d-tree-count-process


收官~ 👊

Responses