k近邻算法的k值选择与KD树
一、k值的选择
在k近邻算法中,k值的选择对模型的性能有重要影响。如果k值过小,模型可能会过于复杂,对训练数据中的噪声和异常值敏感,导致过拟合。这种情况下,模型的近似误差会减小,但估计误差会增大。相反,如果k值过大,模型可能会过于简单,忽略训练数据中的有用信息,导致欠拟合。这种情况下,模型的近似误差会增大,但估计误差会减小。
在实际应用中,通常通过交叉验证来选择最佳的k值。交叉验证是一种评估模型性能的统计学方法,它将原始数据集分成多个子集,一部分用于训练模型,另一部分用于测试模型的性能。通过比较不同k值下模型的性能,可以选择最佳的k值。
- K值过小:
- 容易受到异常点的影响
- k值过大:
- 受到样本均衡的问题
-
K值选择问题,李航博士的一书「统计学习方法」上所说:
- 1) 选择较小的K值,就相当于用较小的领域中的训练实例进行预测,
- “学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,
- 换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
- 2) 选择较大的K值,就相当于用较大领域中的训练实例进行预测,
- 其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误。
- 且K值的增大就意味着整体的模型变得简单。
- 3) K=N(N为训练样本个数),则完全不足取,
- 因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。
- 在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。
- 近似误差:
- 对现有训练集的训练误差,关注训练集,
- 如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。
- 模型本身不是最接近最佳模型。
- 估计误差:
- 可以理解为对测试集的测试误差,关注测试集,
- 估计误差小说明对未知数据的预测能力好,
- 模型本身最接近最佳模型。
-
2 构造方法
(1)构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;
(2)通过递归的方法,不断地对k维空间进行切分,生成子结点。在超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域。
(3)上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。
(4)通常,循环的选择坐标轴对空间切分,选择训练实例点在坐标轴上的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一棵空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树)。
KD树中每个节点是一个向量,和二叉树按照数的大小划分不同的是,KD树每层需要选定向量中的某一维,然后根据这一维按左小右大的方式划分数据。在构建KD树时,关键需要解决2个问题:
(1)选择向量的哪一维进行划分;
(2)如何划分数据;
第一个问题简单的解决方法可以是随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来衡量)。
第二个问题中,好的划分方法可以使构建的树比较平衡,可以每次选择中位数来进行划分。
二、KD树
KD树(k-dimension tree)是一种用于处理多维空间数据的数据结构,常用于实现k近邻算法。KD树是一种二叉树,每个节点表示一个空间划分和一个数据点。在构建KD树时,从根节点开始,选择数据集中方差最大的维度作为划分维度,将数据集划分为两个子集,分别对应左子树和右子树。然后递归地在每个子集中重复这个过程,直到每个子集中只包含一个数据点或达到预设的终止条件。
使用KD树可以加速k近邻算法中的最近邻搜索过程。在搜索时,从根节点开始,根据查询点与当前节点的划分维度的比较结果,选择进入左子树或右子树。然后递归地在子树中进行搜索,直到找到最近的k个邻居或搜索到叶子节点为止。通过KD树,可以将最近邻搜索的时间复杂度从线性降低到对数级别,从而提高算法的效率。
然而,需要注意的是,KD树在高维空间中可能会失去效率。这是因为随着维度的增加,数据点之间的距离变得越来越相似(即“维数灾难”),导致KD树的划分效果变差。因此,在处理高维数据时,可能需要使用其他方法来加速最近邻搜索过程,如随机投影、哈希函数等。
类比“二分查找”:给出一组数据:[9 1 4 7 2 5 0 3 8],要查找8。如果挨个查找(线性扫描),那么将会把数据集都遍历一遍。而如果排一下序那数据集就变成了:[0 1 2 3 4 5 6 7 8 9],按前一种方式我们进行了很多没有必要的查找,现在如果我们以5为分界点,那么数据集就被划分为了左右两个“簇” [0 1 2 3 4]和[6 7 8 9]。
因此,根本就没有必要进入第一个簇,可以直接进入第二个簇进行查找。把二分查找中的数据点换成k维数据点,这样的划分就变成了用超平面对k维空间的划分。空间划分就是对数据点进行分类,“挨得近”的数据点就在一个空间里面。
2 小结
- KNN中K值大小选择对模型的影响【知道】
- K值过小:
- 容易受到异常点的影响
- 容易过拟合
- k值过大:
- 受到样本均衡的问题
- 容易欠拟合
- K值过小:
- 误差
- 近似误差
- 估计误差
- kd树的构建过程【知道】
- 1.构造根节点
- 2.通过递归的方法,不断地对k维空间进行切分,生成子节点
- 3.重复第二步骤,直到子区域中没有示例时终止
- 需要关注细节:a.选择向量的哪一维进行划分;b.如何划分数据
- kd树的搜索过程【知道】
- 1.二叉树搜索比较待查询节点和分裂节点的分裂维的值,(小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点)
- 2.顺着“搜索路径”找到最近邻的近似点
- 3.回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索
- 4.重复这个过程直到搜索路径为空