(1)思想
假定给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。三个基本要素是:k值的选择、距离度量和分类决策规则。
(2)k值的选择
在模型中,k值较小容易造成模型复杂,发生过拟合,而较大意味着欠拟合,通常采用交叉验证法来选取最优的k值。在分类决策时,采用多数表决规则,等价于经验风险最小化。
(3)构造kd树
kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,k指的是特征向量的维数,主要用于范围搜索和最近邻搜索。kd树是二叉树,表示对k维空间的一个划分。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的结构可使得每次在局部空间中搜索目标数据,减少了不必要的数据搜索,从而加快了搜索速度。
注意:
1、选择切分轴的方法有多种,如随着树的深度轮流选择各轴、每次选择数值方差最大的轴等
2、选择切分点一般采用中位数,可以保证切分后得到的左右子树深度不超过1,所得二叉树为平衡二叉树。
(4)搜索kd树
如果实例点是随机分布的,kd树搜索的平均计算复杂度是O(logN),N表示训练实例数。kd树更适用于训练实例数远大于空间维数时的k近邻搜索。当空间维数接近实例数时,它的效率会迅速下降,几乎接近线性扫描。
(5)k近邻搜索
最近邻的搜索算法是首先找到叶节点,再依次向上回退,直至到达根节点。本文章中的k近邻的搜索算法与其相反,是从根节点开始依次向下查找,直至到达叶节点。算法实现如下:
1、首先构建空的最大堆(列表),从根节点出发,计算当前节点与输入实例的距离,若最大堆元素小于k个,则将距离插入最大堆中,否则比较该距离是否小于堆顶距离值,若小于,则使用该距离替换堆顶元素;
2、递归的遍历kd树中的节点,通过如下方式控制进入分支:
a、若堆中元素小于k个或该节点中的样本点与输入实例形成的超球体包含堆顶样本点,则进入左右子节点搜索;
b、否则,若输入实例当前维的坐标小于该节点当前维的坐标,则进入左子节点搜索;
c、否则,进入右子节点搜索;
3、当到达叶节点时,搜索结束。最后最大堆中的k个节点,即为输入实例的k近邻点。