K近邻法(K-Nearst Neighbor,KNN),它的输入为实例的特征向量,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断。
对于分类问题,输出为实例的类别。分类时,对于新的数据,根据K各最近邻的训练实例的类别,通过多数表决方式预测新数据的类别。
对于回归问题,取其K个最近邻的训练实例的平均值为预测值。
KNN三要素
KNN三要素:K值选择,距离度量和分类决策规则
K值选择
当K=1时的K近邻法称为最近邻法,此时将训练集中最接近新数据的点作为新数据的分类。
K值较小:优点,只有与输入实例接近的训练实例才会起作用。缺点:“学习”的估计误差会增大,预测结果会对近邻的实例点十分敏感,如果该点刚好是噪声,则预测会出错。K值减小意味着模型整体变复杂,容易发生过拟合。
K值较大:优点:减少学习的误差估计。缺点:学习的近似误差会增大,这时输入实例较远的训练实例也会起作用。即K值增大以为着模型整体变简单。极限思考:当K=N时,无论输入的实例是什么,最后的输出都是训练集中类别最多的那一类。此时模型过于简单,忽略了很多有用的信息。
距离度量
KNN算法要求所有的特征都可以做可比较的量化。若在数据特征中存在非数值类型,必须采取手段将其量化为数值。比如说如果样本包含颜色特征值,可将颜色转化为灰度值。另外为了公平,样本参数必须做归一化处理。
当p=1时,称为曼哈顿距离
当p=2时,称为欧式距离:
当 p=∞ 时,它是各个坐标距离的最大值
分类决策规则
分类决策通常采用多数表决,也可以基于距离的远近进行加权投票,距离越近的样本权重越大。假设分类的损失函数为0-1损失函数,分类函数为:
那么,误差概率为:
于是,对于k个点,误分类率为:
kd树
实现k近邻法时,主要考虑的问题是如何对训练数据进行快速的k近邻搜索。k近邻法最简单有效的方法是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离,再查找k近邻,当训练数据很大时,计算非常耗时,为提高KNN搜索效率,就引入了kd树的概念。
黄色节点就是Root节点,下一层是红色,再下一层是绿色,再下一层是蓝色。
上图中,黄色的点作为根节点,上面的点作为左子树,下面的点作为右子树,接下来不断地划分,分割的那条线叫作分割超平面,在一维中是点,二维中是线,三维中是面。
两个问题:
如何决定每次根据哪个维度对子空间进行划分呢?
如何选定根节点的比对数值呢?
第一个问题,为了更快地能将数据分开,采用更为分散的维度,我们就更容易的将其分开,是以这里我们通过求各个特征的方差,用方差最大的维度来进行划分——这也就是最大方差法(max invarince)。
第二个问题:
选择何值未比对值,目的也是为了要加快检索速度。将该维数据排序取中值。
举个例子:6个数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
(1)确定split域:X,Y维度的方差分别为39,28.63,X更大,故选择X。
(2)确定node-data,将X维数据排序,6个数据的中值大小为(7,2)
kd树的构造方法:
(1)、构造根结点,使根结点对应于k维空间中包含所有实例点的矩形区域。
(2)、对过递归方法,不断对k维空间进行切分,生成子结点。在超矩形区域上选择一个坐标轴和在此坐标轴上 的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个区域
(3)、上述过程直到子区域没有实例终止(终止时的结点为叶结点),在此过程中,将实例保存在相应的结点上。
(4)、通常,循环的选择坐标对空间切分,选择训练实例点在坐标轴上的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一颗空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树是平衡二叉树)
https://blog.csdn.net/Bluenapa/article/details/88206111
基本的思路很简单:首先通过二叉树搜索(比较待查询节点和分裂节点的分裂维的值,小于等于就进入左子树分支,等于就进入右子树分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子结点;然后再回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索(将其他子结点加入到搜索路径)。重复这个过程直到搜索路径为空。
这里还有几个细节需要注意一下,如下图,假设标记为星星的点是 test point, 绿色的点是找到的近似点,在回溯过程中,需要用到一个队列,存储需要回溯的点,在判断其他子节点空间中是否有可能有距离查询点更近的数据点时,做法是以查询点为圆心,以当前的最近距离为半径画圆,这个圆称为候选超球(candidate hypersphere),如果圆与回溯点的轴相交,则需要将轴另一边的节点都放到回溯队列里面来。