K近邻法(k-nearest neightbor, K-NN)是一种基本分类与回归的方法。K近邻法的输入为实例的特征向量,对应于特征空间的点,输出为类别,可以是二类,也可以是多类。对给定的实例,根据给定的一个训练集的K个最近邻的类别来多数表决来进行预测。K近邻法不具有显示的学习过程, 而是通过训练数据对特征空间的划分来作为模型,实现判别。是一种判别模型。对于K近邻而言,最重要的三个要素:k的选择,距离的度量以及分类决策规则。
我有时觉得人真的是一个很聪明的物种,各类的方法都能想到,而且,你会感觉到很奇妙,利用训练数据对空间进行了划分,然后对于在空间中的点,利用邻近的K个值的多数的取值,然后就代表了这个点,amazing!
当k为1时,即为最近邻算法。
k近邻法中,当训练集,距离度量,K,分类决策规则确定之后,对于空间的划分就确定了,也就是对于任何一个输入实例,他所属的类唯一的确定。
特征空间中,对每个训练实例点,距离该点比其他点更近的所有的点组成一个区域,也就是单元,单元组成了对特征空间的一个划分。
距离的度量,一般与向量范数联系起来,欧式距离(Euclidean distance)就是向量2范数,曼哈顿距离(Manhattan distance)就是向量1范数,无穷范数。
k的选择,若果k选择比较小的情况下,也就是用较小的邻域来对实例进行预测,所以对邻近的训练实例依赖性比较大,比较敏感,如果邻近的训练实例有误, 预测就会出错。K比较小的情况下,等价于模型复杂度比较高的情况,容易发生过拟合,在预测中近似误差会减小,估计误差会增大。若k的选择比较大的情况下,减少了学习的估计误差,但近似误差也增大了,与实例不相似的训练实例也会对其类别有影响,使预测发生错误,K比较大的情况下,等价于模型复杂度比较低的情况。一般,通过交叉验证来得到合适的K值。
分类决策规则,通常是多数表决。多数表决规则等价于经验风险最小化。
【kd树】如何快速的进行k近邻搜索,也就是找出实例的最近的K个训练实例。如果采用线性扫描,在数据量比较大的情况下,计算量很大,非常耗时,为了提高效率,我们需要采用特殊的结构来存储数据,以便计算距离的时可以减少运算量。
KD树,从名字上看就是一棵树,并且是一棵二叉树,是一种数据结构,用于存储K维空间中的实例点,然后对其快速检索的树形结构。(哎,差点又开始抄书,又臭又长还没办法理解,我们还是应该用通俗易懂的话语来表述出来呀)反正,这就是一种数据结构,跟K近邻几乎没啥联系,,此K非彼K,这里的K是空间维数,也就是特征空间的位数,最终对K维空间用N(训练集规模)的超平面进行了划分。
构造kd树:根结点是包含所有实例点的超矩形区域,然后选用k维空间的第一维中的中位数来作为划分的点,分为左右二个平面区域,然后对左右二个平面区域重复根结点中的划分,最终子区域没有实例的情况下停止。这种采用中位数作为切分点的方式构建的树是平衡的,但平衡不代表搜索时最优。。
搜索kd树:利用kd树的存储结构,以便快速的搜索得到k近邻。因为Kd树,是对K维空间的一个划分,以最近邻为例来展示如何利用KD树快速得到k近邻(二个k不一样)。因为树形结构,我们首先判断叶节点,然后回退到父节点来进行判,当目前不可能存在更近的点时终止,这样,就把搜索范围限制在了一定范围里。
(从图的角度判断)首先,找到包含实例的叶子结点,以叶子结点为当前最近点,以实例为圆心,实例到叶子结点为半径画超球体,判断与另一个区域相交情况,不相交不判断,判断与根的邻近情况,不断回退到根节点,当前最近点即为最近点。不断回退来判断相交情况。(从树的角度判断)首先,需要根据构建kd树的方法,找到所在的叶子结点,然后,判断兄弟的情况,然后回退到父结点,重复之前的操作,一直到根,保留的当前最近的实例即为最近邻。