原文: https://machinelearningmastery.com/k-nearest-neighbors-for-machine-learning/
在这篇文章中,您将发现用于分类和回归的 K 最近邻(KNN)算法。阅读这篇文章后你会知道的。
- KNN 使用的模型表示。
- 如何使用 KNN 学习模型(暗示,不是)。
- 如何使用 KNN 做出预测
- KNN 的许多名称包括不同的字段如何引用它。
- 如何准备您的数据以充分利用 KNN。
- 在哪里可以了解有关 KNN 算法的更多信息。
这篇文章是为开发人员编写的,并没有统计或数学方面的背景。重点是算法如何工作以及如何将其用于预测性建模问题。如果您有任何疑问,请发表评论,我会尽力回答。
让我们开始吧。
K 最近邻 for Machine Learning 照片由 Valentin Ottone 保留,保留一些权利。
KNN 的模型表示是整个训练数据集。
它是如此简单。
除了存储整个数据集之外,KNN 没有其他模型,因此无需学习。
有效的实现可以使用诸如 k-d 树之类的复杂数据结构来存储数据,以在预测期间有效地查找和匹配新模式。
由于存储了整个训练数据集,因此您可能需要仔细考虑训练数据的一致性。策划它可能是一个好主意,在新数据可用时经常更新并删除错误和异常数据。
方便的机器学习算法思维导图的样本。
我已经创建了一个由类型组织的 60 多种算法的方便思维导图。
下载,打印并使用它。
KNN 直接使用训练数据集做出预测。
通过搜索 K 个最相似的实例(邻居)的整个训练集并总结那些 K 个实例的输出变量,对新实例(x)做出预测。对于回归,这可能是平均输出变量,在分类中,这可能是模式(或最常见)类值。
为了确定训练数据集中的哪个 K 实例与新输入最相似,使用距离度量。对于实值输入变量,最常用的距离测量是欧几里德距离。
欧几里德距离被计算为跨所有输入属性 j 的新点(x)和现有点(xi)之间的平方差之和的平方根。
EuclideanDistance(x,xi)= sqrt(sum((xj - xij)^ 2))
其他流行的距离措施包括:
可以使用许多其他距离测量,例如 Tanimoto, Jaccard , Mahalanobis 和余弦距离。您可以根据数据属性选择最佳距离指标。如果您不确定,可以尝试不同的距离指标和不同的 K 值,并查看哪种混合产生最准确的模型。
如果输入变量在类型上相似(例如,所有测量的宽度和高度),则欧几里德是一种很好的距离测量。如果输入变量在类型上不相似(例如年龄,性别,身高等),曼哈顿距离是一个很好的衡量标准。
可以通过算法调整找到 K 的值。尝试 K 的许多不同值(例如 1 到 21 的值)并查看哪种值最适合您的问题是一个好主意。
KNN 的计算复杂度随着训练数据集的大小而增加。对于非常大的训练集,KNN 可以通过从训练数据集中取样来制作随机,从中计算 K-最相似的实例。
KNN 已经存在了很长时间,并且已经得到很好的研究。因此,不同的学科有不同的名称,例如:
- 基于实例的学习:原始训练实例用于做出预测。因此,KNN 通常被称为基于实例的学习或基于案例的学习(其中每个训练实例是来自问题域的案例)。
- 懒惰学习:不需要学习模型,所有工作都在请求预测时进行。因此,KNN 通常被称为懒惰学习算法。
- 非参数:KNN 对正在解决的问题的功能形式没有做出任何假设。因此,KNN 被称为非参数机器学习算法。
KNN 可用于回归和分类问题。
当 KNN 用于回归问题时,预测基于 K-最相似实例的均值或中值。
当 KNN 用于分类时,输出可以被计算为具有来自 K-最相似实例的最高频率的类。每个实例本质上都为他们的班级投票,而得票最多的班级则作为预测。
类概率可以被计算为属于新数据实例的 K 个最相似实例的集合中的每个类的样本的归一化频率。例如,在二分类问题(类为 0 或 1)中:
p(class = 0)= count(class = 0)/(count(class = 0)+ count(class = 1))
如果您使用 K 并且您具有偶数个类(例如 2 个),则最好选择具有奇数的 K 值以避免出现平局。反之,当你有一个奇数的类时,使用偶数来表示 K.
通过将 K 扩展 1 并查看训练数据集中下一个最相似实例的类,可以一致地打破关系。
KNN 适用于少量输入变量(p),但在输入数量非常大时会遇到困难。
每个输入变量可以被认为是 p 维输入空间的维度。例如,如果您有两个输入变量 x1 和 x2,则输入空间将为 2 维。
随着维数的增加,输入空间的体积以指数速率增加。
在高维度中,可能相似的点可能具有非常大的距离。所有的点都会相互远离,我们对简单的 2 维和 3 维空间距离的直觉就会崩溃。这可能一开始感觉不直观,但这个一般性问题被称为“维度诅咒”。
- 重新缩放数据:如果所有数据具有相同的比例,KNN 的表现要好得多。将数据规范化到[0,1]范围是个好主意。如果数据具有高斯分布,则标准化数据也可能是个好主意。
- 地址缺失数据:缺少数据意味着无法计算样本之间的距离。可以排除这些样本,也可以估算缺失值。
- 低维度:KNN 适用于低维数据。您可以在高维数据(数百或数千个输入变量)上尝试它,但要注意它可能不如其他技术那样好。 KNN 可以从减少输入特征空间维度的特征选择中受益。
如果您有兴趣从零开始在 Python 中实现 KNN,请查看帖子:
以下是从预测性建模角度介绍 KNN 算法的一些优秀的机器学习文本。
- 应用预测性建模,第 7 章用于回归,第 13 章用于分类。
- 数据挖掘:实用机器学习工具和技术,第 76 和 128 页
- 做数据科学:从前线直接谈话,第 71 页
- 机器学习,第 8 章
还可以在维基百科上查看 K 最近邻 。
在这篇文章中,您发现了 KNN 机器学习算法。你了解到:
- KNN 存储它用作其表示的整个训练数据集。
- KNN 没有学习任何模型。
- KNN 通过计算输入样本和每个训练实例之间的相似性来及时做出预测。
- 有许多距离度量可供选择以匹配输入数据的结构。
- 在使用 KNN 时,重缩放数据是一个好主意,例如使用规范化。
如果您对此帖子或 KNN 算法有任何疑问,请在评论中提出,我会尽力回答。