什么是 K 最近邻? 用于分类数据的 ML 算法
已发表: 2021-07-19算法驱动机器学习世界。
他们经常因其预测能力而受到称赞,并被称为消耗大量数据以产生即时结果的勤奋工作者。
其中,有一种算法经常被标记为惰性。 但在对数据点进行分类时,它的表现相当出色。 它被称为 k 近邻算法,经常被引用为最重要的算法之一 机器学习 算法。
什么是 k 最近邻算法?
k最近邻(KNN)算法是一种数据分类方法,用于根据最接近它的数据点所属的组来估计数据点将成为一个或另一个组的成员的可能性。
k-最近邻算法是一种 监督机器学习 用于解决分类和回归问题的算法。 但是,它主要用于分类问题。
KNN 是一种惰性学习和非参数算法。
它被称为惰性学习算法或惰性学习器,因为在您提供训练数据时它不执行任何训练。 相反,它只是在训练期间存储数据,不执行任何计算。 在对数据集执行查询之前,它不会构建模型。 这使得 KNN 非常适合 数据挖掘。
你可知道? KNN 中的“K”是一个参数,用于确定要包含在投票过程中的最近邻居的数量。
它被认为是一种非参数方法,因为它不对基础数据分布做出任何假设。 简单地说,KNN 试图通过查看数据点周围的数据点来确定数据点属于哪个组。
考虑有两个组,A 和 B。
为了确定一个数据点是在 A 组还是 B 组中,算法会查看它附近的数据点的状态。 如果大多数数据点位于 A 组中,则相关数据点很可能位于 A 组中,反之亦然。
简而言之,KNN 涉及通过查看最近的注释数据点(也称为最近邻)对数据点进行分类。
不要将 K-NN 分类与 K-means 聚类混淆。 KNN 是一种监督分类算法,它根据最近的数据点对新的数据点进行分类。 另一方面,K-means 聚类是一种 无监督 聚类算法,将数据分组到 K 个聚类中。
KNN 是如何工作的?
如上所述,KNN 算法主要用作分类器。 让我们看看 KNN 如何对看不见的输入数据点进行分类。
与使用人工神经网络的分类不同,k-最近邻分类易于理解且易于实现。 在数据点定义明确或非线性的情况下,这是理想的选择。
本质上,KNN 执行投票机制来确定未见观察的类别。 这意味着拥有多数票的类别将成为相关数据点的类别。
如果 K 的值等于 1,那么我们将仅使用最近邻来确定数据点的类别。 如果 K 的值等于 10,那么我们将使用最近的 10 个邻居,以此类推。
提示:使用机器学习软件自动执行任务并做出数据驱动的决策。
为了更好地理解这一点,请考虑一个未分类的数据点 X。散点图中有几个具有已知类别的数据点 A 和 B。
假设数据点 X 放置在 A 组附近。
如您所知,我们通过查看最近的注释点对数据点进行分类。 如果 K 的值等于 1,那么我们将仅使用一个最近邻来确定数据点的组。
在这种情况下,数据点 X 属于组 A,因为它的最近邻居在同一组中。 如果组 A 有超过 10 个数据点并且 K 的值等于 10,则数据点 X 仍然属于组 A,因为它的所有最近邻居都在同一组中。
假设另一个未分类的数据点 Y 位于组 A 和组 B 之间。如果 K 等于 10,我们选择获得最多票的组,这意味着我们将 Y 分类到它拥有最多邻居的组。 例如,如果 Y 在 B 组中有 7 个邻居,在 A 组中有 3 个邻居,则它属于 B 组。
无论存在多少类别,分类器分配具有最高票数的类别这一事实是正确的。
您可能想知道如何计算距离度量以确定数据点是否为邻居。
有四种方法可以计算数据点与其最近邻之间的距离度量:欧几里得距离、曼哈顿距离、汉明距离和闵可夫斯基距离。 在这三个中,欧几里得距离是最常用的距离函数或度量。
K-最近邻算法伪代码
Python 和 R 等编程语言用于实现 KNN 算法。 以下是 KNN 的伪代码:
- 加载数据
- 选择K值
- 对于数据中的每个数据点:
- 找到所有训练数据样本的欧几里得距离
- 将距离存储在有序列表中并对其进行排序
- 从排序列表中选择前 K 个条目
- 根据所选点中存在的大多数类标记测试点
- 结尾
为了验证 KNN 分类的准确性,一个 混淆矩阵 用来。 其他统计方法,如似然比检验也用于验证。
在 KNN 回归的情况下,大部分步骤是相同的。 不是分配具有最高票数的类,而是计算邻居值的平均值并将其分配给未知数据点。
为什么要使用 KNN 算法?
分类是数据科学和机器学习中的一个关键问题。 KNN 是用于模式分类和回归模型的最古老但准确的算法之一。

以下是可以使用 k-最近邻算法的一些领域:
- 信用评级: KNN 算法通过将个人与具有相似特征的信用评级进行比较来帮助确定个人的信用评级。
- 贷款审批:与信用评级类似,k-最近邻算法有助于通过将个人特征与相似个人进行比较来识别更有可能拖欠贷款的个人。
- 数据预处理:数据集可能有许多缺失值。 KNN 算法用于估计缺失值的称为缺失数据插补的过程。
- 模式识别: KNN 算法识别模式的能力创造了广泛的应用。 例如,它有助于检测信用卡使用模式并发现异常模式。 模式检测在识别客户购买行为模式方面也很有用。
- 股票价格预测:由于 KNN 算法具有预测未知实体价值的能力,因此可用于根据历史数据预测股票的未来价值。
- 推荐系统:由于 KNN 可以帮助找到具有相似特征的用户,因此可以在推荐系统中使用。 例如,它可以用于在线视频流媒体平台,通过分析相似用户观看的内容来建议用户更有可能观看的内容。
- 计算机视觉: KNN算法用于图像分类。 由于它能够对相似的数据点进行分组,例如,将猫分组在一起,将狗分组在不同的类别中,因此它在几个方面很有用 计算机视觉 应用程序。
如何选择K的最优值
没有确定最佳 K 值的特定方法——换句话说——KNN 中的邻居数。 这意味着在决定继续使用哪个值之前,您可能必须尝试一些值。
一种方法是考虑(或假装)训练样本的一部分是“未知的”。 然后,您可以使用 k 近邻算法对测试集中的未知数据进行分类,并通过将其与您在训练数据中已有的信息进行比较来分析新分类的效果。
在处理二分类问题时,最好为 K 选择一个奇数值。否则,可能会出现每个类中的邻居数量相同的情况。 此外,K 的值不能是当前类数的倍数。
选择 K 的最佳值的另一种方法是计算 sqrt(N),其中 N 表示训练数据集中的样本数。
但是,具有较低值的 K(例如 K=1 或 K=2)可能会产生噪声并受到异常值的影响。 在这种情况下,过拟合的可能性也很高。
另一方面,在大多数情况下,具有较大值的 K 会产生更平滑的决策边界,但不应太大。 否则,具有较少数据点的组将始终被其他组投票。 此外,更大的 K 将在计算上变得昂贵。
KNN的优缺点
使用 KNN 算法最显着的优势之一是无需构建模型或调整多个参数。 由于它是惰性学习算法而不是渴望学习者,因此无需训练模型; 相反,所有数据点都在预测时使用。
当然,这在计算上是昂贵且耗时的。 但是,如果您拥有所需的计算资源,则可以使用 KNN 来解决回归和分类问题。 尽管有几种更快的算法可以产生准确的预测。
以下是使用 k-最近邻算法的一些优点:
- 易于理解且易于实施
- 它可以用于分类和回归问题
- 它是非线性数据的理想选择,因为没有关于基础数据的假设
- 自然能处理多类案件
- 它可以在具有足够代表性数据的情况下表现良好
当然,KNN 并不是一个完美的机器学习算法。 由于 KNN 预测器从头开始计算所有内容,因此它可能不适合大型数据集。
以下是使用 k 近邻算法的一些缺点:
- 相关的计算成本很高,因为它存储了所有的训练数据
- 需要高内存存储
- 需要确定K的值
- 如果 N 的值很高,则预测很慢
- 对不相关的特征敏感
KNN 和维度灾难
当您手头有大量数据时,从中提取快速直接的信息可能会非常具有挑战性。 为此,我们可以使用降维算法,从本质上讲,使数据“直截了当”。
“维度的诅咒”一词可能给人一种直接来自科幻电影的印象。 但这意味着数据的特征太多了。
如果数据的特征太多,那么模型过度拟合的风险很高,导致模型不准确。 太多的维度也使得数据分组变得更加困难,因为数据集中的每个数据样本看起来彼此之间的距离是等距的。
由于维度灾难,k-最近邻算法极易受到过度拟合的影响。 不过这个问题可以通过 蛮力实施 KNN算法。 但这对于大型数据集是不切实际的。
如果特征太多,KNN 就不能很好地工作。 因此,必须在数据准备阶段执行降维技术,如主成分分析 (PCA)和特征选择。
KNN:赢得人心的惰性算法
尽管是算法中最懒惰的,但 KNN 已经建立了令人印象深刻的声誉,并且是解决多个分类和回归问题的首选算法。 当然,由于它的惰性,对于涉及大数据集的情况,它可能不是最佳选择。 但它是最古老、最简单、最准确的算法之一。
用有限的数据训练和验证算法可能是一项艰巨的任务。 但是有一种方法可以有效地做到这一点。 这称为交叉验证,涉及保留一部分训练数据作为测试数据集。
