KNN算法详解

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值。
  • 可能导致模糊的解释。
  • 对异常值和缺失值敏感。
  • 不适用于大型数据集。
  • 在高维数据中表现不佳。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485