作者:Savan Patel
时间:2017 年 5 月 17 日
原文:https://medium.com/machine-learning-101/k-nearest-neighbors-classifier-1c1ff404d265?source=collection_home---4------4---------------------
监督学习最后一个基本分类!K 近邻。在这篇文章中,我们将讨论 K Nearest Neighbors Classifier 的工作,三种不同的底层算法,用于为 python 的 sklearn 库选择邻居和部分代码片段。
如果您还没有阅读以前的帖子:
- 朴素贝叶斯
- SVM(支持向量)
- 决策树
我建议你在这之前先完成它(虽然这与这三者无关)。
当计算机感染病毒时简而言之,
如果 k = 3 则星级为 B,如果 k = 6 则为 A.对象通过其邻居的多数投票进行分类,对象被分配给其 k 个 最近邻居中最常见的类(k 是正 整数,通常是小 整数)。如果 k = 1,则简单地将对象分配给该单个最近邻居的类。
我们如何选择邻居?
暴力
让我们考虑具有二维图的简单情况。如果我们从数学上看,简单的直觉是计算从感兴趣点(我们需要确定的类别)到训练集中所有点的欧氏距离。然后我们取点最多的类。这被称为暴力方法。
对于 D 维的 N 个样本,运行时间复杂度为 O [DN²]。如果我们有少量的维度和训练集,这将在合理的时间内运行。但随着训练集大小的增加,运行时间会迅速增加。
当有大尺寸和大型训练集时,暴力表现很差。
KD Tree
为了改善运行时间,在从兴趣点构建生长树的方面发明了替代方法。这些方法试图通过有效地编码样本的聚合距离信息来减少所需的距离计算次数。
基本思想是,如果 A 点与 B 点相距很远,而 B 点非常接近 C 点,那么我们就知道 A 点和 C 点非常遥远,无需明确计算它们的距离。(这可能一直都不正确。)
以这种方式,最近邻搜索的计算成本可以降低到 O [DN * log(N)] 或更好。对于大 N 来说,这是对暴力的显着改进。
当 D <20 时,KD Tree 表现得足够好。使用较大的 D,它需要更长的时间。这被称为 “维度诅咒”。
向 小孩 解释 维度诅咒[来源:StackOverflow]
可能孩子会喜欢吃饼干,所以让我们假设你有一整辆卡车,饼干有不同的颜色,不同的形状,不同的味道,不同的价格......
如果孩子必须选择但只考虑一个特征,例如味道,那么它有四种可能性:甜,咸,酸,苦,所以孩子只需要尝试四个饼干来找到他最喜欢的东西。
如果孩子喜欢味道和颜色的组合,并且有 4 种(我在这里相当乐观:-))不同的颜色,那么他已经必须选择 4x4 种不同的类型;
此外,如果他想要考虑饼干的形状,有 5 种不同的形状,那么他将不得不尝试 4x4x5 = 80 饼干
我们可以继续下去,但在吃了所有这些饼干之后,他可能已经肚子疼...... 在他做出最好的选择之前:-) 除了肚子疼,它很难记住每种曲奇饼口味的差异。
如您所见,尺寸 / 特征增加时复杂性会增加。
Ball Tree
Ball Tree 假定多维空间中的数据并创建嵌套的超球体。查询时间复杂度为 O [Dlog(N)]。
怎么选?
针对问题的相关算法的选择取决于维度的数量和训练集的大小。
- 对于小样本和小尺寸,暴力表现良好。
- 数据稀疏性:如果数据稀疏且维度较小(<20),KD Tree 将比 Ball Tree 算法表现更好。
- K(邻居)的值:随着 K 的增加,KD Tree 和 Ball 树的查询时间增加。
Sklearn K 最近和参数
python 中的 Sklearn 为 K Nearest Neighbors Classifier 提供了实现。下面是在 python 中使用的示例代码段:
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(features_matrix, labels)
predicted_values = neigh.predict(test_matrix)
一些重要的参数
***n_neighbors ***:要考虑的邻居数量。默认值为 5。
**algorithm****: 默认情况下,它设置为 auto。算法可以是 {'auto','ball_tree','kd_tree','brute'}。
目前,如果 k < N / 2 且 'effective_metric_' 位于 'kd_tree' 的 'VALID_METRICS' 列表中,则 algorithm ='auto'选择'kd_tree'。如果 k < N / 2 并且 'effective_metric_' 不在 'kd_tree' 的 'VALID_METRICS' 列表中,则选择 'ball_tree'。如果 k> = N / 2,它选择 'brute'。此选择基于以下假设:查询点的数量至少与训练点的数量相同,并且 leaf_size 接近其默认值 30. [参考:Sklearn 文档]。
您可以在 此处 浏览所有参数。
最后的想法
除了暴力,K Nearest Neighbors 实现了树状数据结构,以确定从兴趣点到训练集中的点的距离。最佳算法的选择取决于数据的稀疏性,所请求的邻居数量以及特征的维度 / 数量。
网友评论