KNN算法,即K最近邻算法,是一种监督式的机器学习算法,常用于分类和回归问题。它是一种非参数算法,不假设数据的分布,也被称为惰性算法,因为它在训练阶段不进行学习,而是在测试阶段根据存储的数据点进行学习。KNN算法基于距离来计算数据点之间的相似度,是一种直观且易于理解的算法。
KNN算法的工作原理
KNN算法的核心思想是:对于一个新的数据点,通过计算它与训练集中所有数据点的距离,找出最近的K个邻居,然后根据这些邻居的类别来预测新数据点的类别。在二维平面上,可以将数据点绘制成图表,通过计算新数据点与所有训练点的距离,对这些距离进行排序,选择前K个最近的距离,然后根据这些距离对应的类别来决定新数据点的类别。对于分类问题,计算类别的众数;对于回归问题,计算距离的均值。
选择合适的K值
选择K值是KNN算法中的一个关键问题。K值的选择会影响到模型的性能,如果K值过小,可能会导致过拟合,即模型在训练集上表现良好,但在测试集上表现不佳;如果K值过大,可能会导致欠拟合,即模型在训练集和测试集上都表现不佳。此外,对于二分类问题,应避免选择偶数的K值,因为这可能会导致分类结果出现平局。通常,可以根据领域知识来选择K值,或者通过绘制不同K值与错误率之间的关系图(肘部曲线),选择错误率突然下降的K值。
KNN算法中的距离度量
在KNN算法中,选择合适的距离度量是非常重要的。以下是几种常用的距离度量方法:
- Minkowski距离:当向量的长度不能为负时,计算Minkowski距离。
- Manhattan距离:两个点之间的距离是它们笛卡尔坐标的绝对差之和。
- Euclidean距离:在欧几里得空间中,两点之间的直线距离。
- Cosine距离:用于计算两个向量的相似度,通过余弦函数计算两个向量之间的角度。
- Jaccard距离:类似于余弦距离,Jaccard方法比较数据集中的属性分布,找出两个数据集中值都等于1的实例。
KNN算法的不同实现
kd_tree
:kd树是一种二叉搜索树,每个节点包含超过x,y值。在XY坐标中分类测试点时,将训练数据点以二叉树的形式分割。例如,训练集有数据点[(1,2),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8)]。通过X轴分割树,可以看到点(4,5)形成根节点。在下一层二叉树中,通过Y轴的中位数而不是X轴来分割数据点。ball_tree
:基于球体结构的算法,将数据点形成球体结构的簇。第一个簇包含所有训练数据点。与质心距离最大的点形成第二个簇的新质心。ball_tree算法的主要原理是将数据点分成簇,直到达到特定的深度或限制。brute
:暴力算法试图从详尽的列表中找到最优化的值或类别,以准确分类测试点。auto
:自动算法将尝试根据fit方法中传递的值找到最优化的点或类别。可以为K值、权重和叶子大小超参数指定一系列值。
- 易于理解和实现。
- 基于实例的学习(惰性学习)算法。
- 由于KNN算法在训练阶段不学习,因此可以添加新数据点而不影响算法性能。
- 适用于小数据集。
- 当变量具有不同的尺度时会失败。
- 难以选择K值。
- 可能导致模糊的解释。
- 对异常值和缺失值敏感。
- 不适用于大型数据集。
- 在高维数据中表现不佳。