一、KNN算法
KNN(k-NearestNeighbor)(邻近算法,或者说K最近邻分类算法)是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
所以,KNN算法的主要流程是假定给定一个训练集,其中的实例类别已定,分类时,对新的实例,根据K个最邻近的实例的类别,通过多数表决的方式进行预测,因此,KNN算法不具有显示的学习过程。
KNN算法流程:
- 输入:训练集
- 根据给定的距离度量方法,在训练集中找到与最近邻的K个点,涵盖这K个点的的邻域记做
- 在中根据分类决策规则(多数表决)决定的类别.
KNN算法的基本要素:
- K值的选择: K值得选择一般通过交叉验证选择,当K较小时,模型更复杂,容易发生过拟合现象;K较大时,模型会变得简单,学习的近似误差会增大,估计误差会减小;但是不能取K=m。
-
距离度量: 一般使用三种距离度量方式
闵可夫斯基距离:
欧氏距离:
曼哈顿距离: - 分类决策规则: 多数表决
KNN优点:
- 简单,易于理解,易于实现,无需估计参数,无需训练;
- 适合对稀有事件进行分类;
- 特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。
KNN缺点:
- 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
- 计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
- 可理解性差,无法给出像决策树那样的规则。
二、KD树
KD树是一种对K维空间中的实例进行存储以便对其进行快速检索的树形数据结构,利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。因此,KD树可有效提高KNN算法的搜索效率。
构建KD树:
kd 树是每个节点均为k维数值点的二叉树,其上的每个节点代表一个超平面,该超平面垂直于当前划分维度的坐标轴,并在该维度上将空间划分为两部分,一部分在其左子树,另一部分在其右子树。即若当前节点的划分维度为d,其左子树上所有点在d维的坐标值均小于当前值,右子树上所有点在d维的坐标值均大于等于当前值。
如:集合(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)
- 构建根节点时,切分维度为x(维度的选择依照方差进行,选择较大方差的维度进行切分,因为更为分散的维度,我们就更容易的将其分开),如上点集合在x维从小到大排序为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6);其中值为(7,2)。(2,4,5,7,8,9在数学中的中值为(5 + 7)/2=6,但因该算法的中值需在点集合之内,所以中值计算用的是 len(points)//2=3, points[3]=(7,2) )
- (2,3),(4,7),(5,4)挂在(7,2)节点的左子树,(8,1),(9,6)挂在(7,2)节点的右子树。
- 构建(7,2)节点的左子树时,点集合(2,3),(4,7),(5,4)此时的切分维度为y,中值为(5,4)作为分割平面,(2,3)挂在其左子树,(4,7)挂在其右子树。
- 构建(7,2)节点的右子树时,点集合(8,1),(9,6)此时的切分维度也为y,中值为(9,6)作为分割平面,(8,1)挂在其左子树。
- 至此k-d tree构建完成。
搜索KD树:
例如:寻找图中目标点的最近邻点
- 首先假设(4,7)为当前最近邻点,计算其与目标查找点的距离为3.202。回溯到(5,4),计算其与查找点之间的距离为3.041,小于3.202,所以“当前最近邻点”变成(5,4)。
- 以目标点(2,4.5)为圆心,以目标点(2,4.5)到“当前最近邻点”(5,4)的距离(即3.041)为半径作圆,如上图所示。可见该圆和y = 4超平面相交,所以需要进入(5,4)左子空间进行查找,即回溯至(2,3)叶子节点。
- (2,3)距离(2,4.5)比(5,4)要近,所以“当前最近邻点”更新为(2,3),最近距离更新为1.5。
- 回溯至(7,2),以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割。
- 至此,搜索路径回溯完。返回最近邻点(2,3),最近距离1.5。