原文: https://machinelearningmastery.com/k-nearest-neighbors-for-machine-learning/
在这篇文章中,您将发现用于分类和回归的k-Nearest Neighbors(KNN)算法。阅读这篇文章后你会知道的。
- KNN使用的模型表示。
- 如何使用KNN学习模型(暗示,不是)。
- 如何使用KNN进行预测
- KNN的许多名称包括不同的字段如何引用它。
- 如何准备您的数据以充分利用KNN。
- 在哪里可以了解有关KNN算法的更多信息。
这篇文章是为开发人员编写的,并没有统计或数学方面的背景。重点是算法如何工作以及如何将其用于预测建模问题。如果您有任何疑问,请发表评论,我会尽力回答。
让我们开始吧。
K-Nearest Neighbors 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-Nearest Neighbors 。
在这篇文章中,您发现了KNN机器学习算法。你了解到:
- KNN存储它用作其表示的整个训练数据集。
- KNN没有学习任何模型。
- KNN通过计算输入样本和每个训练实例之间的相似性来及时进行预测。
- 有许多距离度量可供选择以匹配输入数据的结构。
- 在使用KNN时,重新调整数据是一个好主意,例如使用规范化。
如果您对此帖子或KNN算法有任何疑问,请在评论中提出,我会尽力回答。

