k 近邻法(k-NN)是一种基于实例的学习方法,主要应用于分类任务。它通过分析特征空间中的相似性来进行预测,而不像其他一些机器学习算法那样通过参数优化来寻找最佳模型。本文将介绍k-NN的核心概念,并讨论几个关键问题,包括距离度量、k-d树搜索算法等。
输入: - 训练集:包含实例特征和实例类别。 - 实例:待分类的实例所属的类别。
在给定的距离度量下,我们可以找到最近的k个实例。具体而言,k-NN算法会查找距离目标实例最近的k个点,并依据这k个点中出现次数最多的类别作为预测结果。
步骤: - 计算目标实例与训练集中各实例之间的距离。 - 找到距离最近的k个实例。 - 计算这k个实例中各类别的频率。 - 输出频率最高的类别作为预测结果。
根据模型分类,k-NN模型属于非概率模型。与感知机不同,k-NN不需要确定未知参数,而是直接从训练数据中获得预测结果。
k-NN的基本思想是在特征空间中,距离越近的实例具有更高的相似度。距离度量的方式多样,常见的包括闵可夫斯基距离、曼哈顿距离和欧几里得距离。
闵可夫斯基距离(Minkowski distance): 当 ( p = 1 ) 时,称为曼哈顿距离;当 ( p = 2 ) 时,称为欧几里得距离。
python
def L(x, y, p=2):
if len(x) == len(y) and len(x) > 1:
sum = 0
for i in range(len(x)):
sum += abs(x[i] - y[i]) ** p
return sum ** (1 / p)
else:
return 0
曼哈顿距离:只允许沿着坐标轴方向移动,相当于城市中的出租车行驶路径。
欧几里得距离:两点之间直线距离,是最常用的度量方式。
切比雪夫距离是指两点之间最大坐标差的绝对值。例如,在平面上,切比雪夫距离计算公式为:
[ d{infty}(x, y) = max(|x1 - y1|, |x2 - y_2|) ]
k值的选择直接影响模型性能。较小的k值意味着单个样本的影响较大,模型复杂度较高,容易导致过拟合;较大的k值则会使模型更加平滑,但可能造成欠拟合。
通常,我们使用交叉验证方法来确定最佳的k值。
k-NN的决策规则是“多数表决”,即选择距离目标实例最近的k个实例中出现频率最高的类别作为预测结果。
kd树是一种高效的空间划分数据结构,适用于多维数据的快速搜索。kd树的每个节点记录了一个特征坐标、切分轴以及指向左枝和右枝的指针。
kd树的构建过程涉及递归地选择切分轴,并将数据集按照选定轴的中位数进行排序和分割。
利用kd树,可以在O(DlogN)的时间复杂度内找到最近的k个实例,其中D是维度,N是数据集大小。
通过上述方法,我们可以有效地实现k-NN算法,从而提高分类任务的准确性和效率。