k 近邻法
近邻法()即可用于分类,也可用于回归。
做分类还是回归区别在预测时的决策方式。做分类时,用多数表决法;做回归时,用平均法。
sklearn-learn
中只使用了 蛮力实现()、 树()、球树()。
本文只讨论 近邻法在分类问题上的应用。
一、k 近邻法
近邻法思想:对于预测样本,在训练集中找到与该预测样本最邻近的 个,这 个样本的多数属于哪个类,就把该预测样本分为这个类。
近邻法中,当 时,称为最近邻算法。
输入:训练集:,,
其中, 为预测集样本, 为样本的类别。
输出:样本 所属类别 。
(1)根据给定的距离度量,在训练集 中找出与 最近邻的 个点,涵盖这 个点的 的邻域记作 。
(2)在 中根据分类决策树规则(如多数表决)决定 的类别 。
二、k 近邻模型
近邻模型三要素:距离度量、值的选择、分类决策规则。
1. 距离度量
常用:曼哈顿距离、欧式距离、闵可夫斯基距离(曼哈顿距离是闵可夫斯基距离在 的特例,欧式距离是 的特例)。
两个 维样本 ,。
曼哈顿距离:
欧式距离:
闵可夫斯基距离:
例 :3个点 ,,,求 取不同值时,距离 的最近邻点。
解:因为 和 只有第一维的值不同, 所以 为任何值时, 。而 ,
,,,
于是得到: 等于 或 时, 是 的最近邻点; 大于等于 时, 是 的最近 邻点。
2. k 值的选择
值较小,会用较小的领域的数据来训练,训练误差减小;预测时数据也较少,如果近邻的样本恰巧是噪声,预测出错,估计误差增大。
值较大,训练误差增大,估计误差减小。
极端情况 ,无论测试集是什么,结果都是训练集中最多的类。
通常采用交叉验证法选取 值。
3. 分类规则
分类决策规则一般采用多数表决法。
三、k 近邻法蛮力实现
计算预测样本和训练集中所有样本的距离,然后得到最小的 个距离即可,接着多数表决,做出预测。
该方法简单,适合样本量少,样本特征少的情况。
四、kd 树
近邻法最简单的实现方法是线性扫描(即蛮力实现)。当训练集很大时,该方法不可行。为提高 近邻搜索效率,引入 树。
树就是 个特征维度的树。 中 表示 个样本, 树中 表示特征维数。
树算法包括3步:第一建树、第二搜索最近邻、第三预测。
1. 构造 kd 树
构造 树方法: 树实质是二叉树,其切分点的选取与 树类似,即选取使样本复杂度降低最多的特征。 树认为特征方差越大,则该特征的复杂度越大,优先对该特征进行切分,切分点是样本在该特征的中位数。重复该切分步骤,直到切分后子区域无样本则终止切分,终止时的样本为叶结点。
例 :训练集 ,构造 树。
解:(1)找到切分特征。6个数据在第一个特征 、第二个特征 的方差为 、,所以用 构造 树。
(2)确定切分点。6个数据在 的中位数是 7,所以切分点是。
(3)确定左、右子区域。以平面 将空间划分为左、右两个子区域,、。
如此递归,直到两个子区域没有样本存在时停止。得到特征空间划分(图)和 树(图)。
2. 搜索 kd 树
树可以省去大部分数据点的搜索。
树的最近邻搜索:
输入: 树,目标点 。
输出: 的最近邻。
(1)在 树中找出包含目标点 的叶结点。
(2)以此叶结点为 “当前最近点”。
(3)递归地向上回退。在每个结点上进行以下操作:
- 以目标点为圆心,目标点到叶结点的距离为半径,得到一个超球体,如果该超球体内的样本点比叶结点距离目标更近,则以该样本点为 ”当前最近点“。
- 检查该叶结点的父结点的另一个子结点对应的区域是否有更近的点。具体地,检查另一子结点对应的超矩形体和超球体是否相交。如果相交,可能在超矩形体内存在距目标点更近的点,移动到另一个子结点。接着递归地进行最近邻搜搜。如果不想交,向上回退。
- 当回退到根节点时,搜索结束。最后的 “当前最近点” 为 的最近邻点。
如果样本点是随机分布的, 树搜索的计算复杂度是 , 是训练集样本数。
树适用于训练集样本数远大于空间维数的 近邻搜索。当空间维数接近训练集样本数时,效率几乎接近线性扫描。
例 :如图 的 树,根节点 ,它的子结点为 、。树上总共 7 个样本点,目标点 ,求 的最近邻。
解:在 树中找到包含点 的叶结点 , 以点 作为 近似最近邻。真正最近邻一定在以点 为中心通过点
的圆的内部。然后返回结点 的父结点 , 在结点 的另一子结点 的区域内搜索最近邻。结点 的区域与圆
不相交, 不可能有最近邻点。继续返回上一级父结点 , 在结点 的另一子结点 的 区域内搜索最近邻。结点
的区域与圆相交; 该区域在圆内的实例点有点 , 点 比 点 更近, 成为新的最近邻近似。最后得到点 是点
的最近邻。
3. kd 树预测
在 树搜索最近邻时,选择第一个最近邻样本,把它置为已选。在第二轮选择中,忽略置为已选的样本,重新选择最近邻,这样跑 次,得到了 个最近邻,
如果是分类问题,根据多数表决法,预测为最多类别数的类别;
如果是回归问题,根据平均法, 个最近邻样本的平均值作为回归预测值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)