一、基本概念
k近邻法(k nearest neighbor, k-NN)是一种基本的分类和回归方法,简单、直观。当用来分类时,给定一个训练集,对于新输入实例,找到最近的k个训练样例,然后根据训练样例确定新样例的分类。
k近邻法的三个基本要素:距离度量、K值、分类决策规则。
1、距离度量:
不同距离度量方法导致结果不同。
2、k值的选择
k值的选择对于算法的结果有很大的影响,如果过小,可能导致过拟合,过小则误差会比较大。
一般来说,使用交叉验证法来选取最优的k值。
3、分类决策规则
多使用多数表决规则来决定输入实例的类。
多数表决规则解释:
如果分类的损失函数为0-1损失函数,
分类函数为:
误分类的概率是:
则使得I最小,也就是经验风险最小化。
二、k近邻法的实现:kd树
1、构造kd树:
用一个简单的例子说明:
假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
由于此例简单,数据维度只有2维,所以可以简单地给x,y两个方向轴编号为0,1,也即split={0,1}。
(1)确定split域的首先该取的值。分别计算x,y方向上数据的方差得知x方向上的方差最大,所以split域值首先取0,也就是x轴方向;
(2)确定Node-data的域值。根据x轴方向的值2,5,9,4,8,7排序选出中值为7,所以Node-data = (7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于split = 0(x轴)的直线x = 7;
(3)确定左子空间和右子空间。分割超平面x = 7将整个空间分为两部分,如下图所示。x <= 7的部分为左子空间,包含3个节点{(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点{(9,6),(8,1)}。得到如图:
2、搜索kd树
kd树示例:
算法:(使用kd树德最近邻搜索)
输入:已构造的kd树,目标点x
基本的思路很简单:首先通过二叉树搜索(比较待查询节点和分裂节点的分裂维的值,小于等于就进入左子树分支,等于就进入右子树分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子结点;然后再回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索(将其他子结点加入到搜索路径)。
例子说明:
假设我们的k-d tree就是上面通过样本集{(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)}创建的。
更复杂一点的例子:
第一次回溯判断
第二次回溯判断
参考:http://www.cnblogs.com/eyeszjwang/articles/2429382.html