3.1 K近邻算法
K近邻法的输入为实例的特征向量,对训练集的特征空间进行划分,然后输出为实例的类别。
(1)根据给定的距离度量,在训练集中找出与 最邻近的K个点,涵盖这K个点的的领域记作
(2)在中根据分类决策规则(如多数表决)决定的类别
K值的选择,距离度量,分类决策规则是K近邻算法的基本三要素
当k=1的时候,称为最近邻算法
3.2.1 模型
我们根据基本三要素将特征空间划分为一些子空间,确定子空间里的每个点所属的类,对于每个训练实例点,距离该点比其他点更近的所有点组成一个区域称为单元,所有训练试点对应的单元构成对特征空间的一个划分。
3.2.2 距离度量
特征空间中两个实例点的距离是两个实例点相似程度的反应
假设有有两个实例点 和 ,每个实例点有n个特征来表示
曼哈顿距离:
欧式距离:
3.2.3 k值的选择
如果选择较小的k值,就相当于用较小的领域中的训练实例进行预测,近似误差会减少,模型的估计误差会上升,预测结果会对近邻的实例点非常敏感(凡事输入点在某一块近邻,就会被认为那块对应的类别,因为可供选择的类别非常少)换句话说,泛化能力不太好,模型的参数过于复杂(模型完完全全把训练的点学进去了,只会相应对应训练样本的输出,不会学到别的),容易过拟合
如果K值比较大,上述取反就好了
在应用中,K一般取比较小的值,通过交叉验证来选择最优的K值
3.2.4 分类决策规则
就是看在K个类别里面,选取出数目最多的那个类别作为输出就完事了
3.3 KD树
因为对训练数据扫一遍的话,时间复杂度会很高,所以我们要对训练集用别的数据结构来存储,减少比较次数,于是采用树的数据结构方式,KD树是一个二叉树
3.3.1 构造KD树
(1)构造根节点,根节点对应于K维空间包含所有实例点的超矩形区域
(2)在某个超矩形区域上选择一个坐标轴和坐标轴上的一个切分点,确定一个超平面,然后用这个超平面将当前超矩形区域一分为二
(3)重复(2)操作,知道所有的超矩形区域不能再细分
PS:我们每次选择切分点的时候都是选择某一个特征维度上的中位数作为切分点,这样的树会是一个平衡的KD树
3.3.2 搜索KD树
这里以找最近邻为例,给定一个目标点,搜索其最近邻。首先找到包含目标点的叶节点,然后从叶节点出发,依次返回到头节点,在返回的过程中,不断根据给定的规则判断是否存在有更加近的最近邻节点存在,直到return到头节点,这样,我们就可以沿着给定的规则在树形结构的基础上,更加缩小了搜索范围。
(1)在构造完KD树后,我们根据左小右大的原则进行对比,选出一个暂时是最近近邻点的叶子节点
(2)从这个叶子结点开始往回走,先return到这个叶结点的父节点,然后这个父节点和目标点的距离比最近近邻点到目标点的距离更加近,则把这个父节点封为最近邻节点
(3)(然后就到了判断是否需要进入另外一个兄弟节点取搜索了,因为这是一个二叉树,不是A就是B)在某些时候,我们可能会发现,当前最近点一定存在与之对应的另一半区域,也就是他的兄弟节点。在兄弟节点里面可能会存在最近点,于是我们检查以目标点为圆心,目标点与当前最近点的距离作为半径,画一个圆,看这个圆有没有进入兄弟节点的超矩形区域(相交)
(4)如果相交了,则可以在另外一个子节点对应的区域找到更加近的点,于是,最近近邻点就是兄弟节点了;如果不相交,就往上回退
(5)一直重复(2)(3)直到回退到到父节点,结束,输出当前最近近邻点