sklearn.neighbors.NearestNeighbors - 用于无监督学习的 knn?

数据挖掘 机器学习 scikit-学习 k-nn
2021-10-06 11:55:24

从基本理论我知道 knn 是一种监督算法,而例如 k-means 是一种无监督算法。

然而,在 Sklearn 有一个用于无监督学习的 KNN 实现(http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.NearestNeighbors.html#sklearn.neighbors.NearestNeighbors)。

SkLearn 中这个无监督版本的 knn 到底是什么?

这是knn算法吗?

  • 如果是,它是如何不受监督的,因为根据定义 knn 是受监督的?
  • 如果没有,那是什么?
2个回答

无监督版本只是实现了不同的算法来为每个样本找到最近的邻居。

kNN算法包括两个步骤:

  1. 计算并存储训练集中每个样本的 k 个最近邻(“训练”)
  2. 对于未标记的样本,从数据集中检索 k 个最近邻,并通过 k 个最近邻之间的多数投票/插值(或类似)预测标签(“预测/查询”)

无监督版本基本上只是第 1 步,kNN 算法的训练阶段。

algorithm='brute'(这很有用,因为如果您的数据集很大,对所有样本(在这里。)

混乱来自 Sklearn 设计代码的方式。

简短的回答

您提到的“无监督”版本不是 K-Nearest Neighbor 算法(在此处实现)。在它的描述中,它只写着:

“用于实施邻居搜索的无监督学习器。”

这个学习器实际上是KNNClassifier为了有效地执行邻居搜索而使用的。Sklearn 将其作为一个单独的学习器,因为其他算法KMeans也需要执行邻居搜索。

长答案

存在许多需要邻居搜索的算法。KNN 和 K-Means 是其中一些著名的。作为设计选择,Sklearn 决定将邻居搜索部分实现为自己的“学习器”。

要找到最近邻居,您显然可以计算所有成对距离,但它可能不是很有效。这就是为什么存在使用特定数据结构(如 KD-Tree 或 Ball-Tree)的更智能方法的原因(顺便说一下,Ball 树在高维数据上的性能通常比 KD-Trees 更好)。

如果您fit是无监督模型,您将根据您为参数NearestNeighbors设置的值将数据存储在数据结构中。然后,您可以在需要邻居搜索的模型中algorithm使用此无监督学习器。kneighbors