从基本理论上看,knn是一种有监督的算法,而k-均值是一种无监督的算法。
然而,在Sklearn有一个无监督学习(http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.NearestNeighbors.html#sklearn.neighbors.NearestNeighbors)的KNN的实现。
在SkLearn,这个无监督的knn到底是什么版本?
这是knn算法吗?
发布于 2018-07-05 20:39:15
该无监督版本简单地实现了不同的算法,为每个样本寻找最近的邻居(S)。
kNN算法由两个步骤组成:
无监督版本基本上只是第一步,即kNN算法的训练阶段。
(这很有用,因为如果数据集很大,则对所有样本(algorithm='brute')进行成对比较通常是不可行的。因此,为训练阶段实现了两种替代算法,利用先前的比较来减少距离计算的次数。参见文档这里)。)
发布于 2018-07-10 12:37:31
混乱来自Sklearn设计他们的代码的方式。
您提到的“无监督”版本不是K-最近邻算法(它是实现的这里)。在它的说明中,它只写着:
“实施邻居搜索的无监督学习者。”
为了有效地执行邻居搜索,KNNClassifier实际上使用了这个学习者。Sklearn将它作为一个独立的学习者,因为其他算法,如KMeans,也需要执行邻居搜索。
有许多算法需要邻域搜索。KNN和K-指的是一些著名的。作为一种设计选择,Sklearn决定将邻居搜索部分作为自己的“学习者”来实现。
要找到一个最近的邻居,你显然可以计算所有成对距离,但它可能不是很有效。这就是为什么会有更聪明的方法来使用特定的数据结构,比如KD树或Ball树(顺便说一句,在高维数据上,Ball树的表现通常比KD树更好)。
如果您fit无监督的NearestNeighbors模型,您将根据为algorithm参数设置的值将数据存储在数据结构中。然后你可以在一个需要邻居搜索的模型中使用这个没有监督的学习者的kneighbors。
https://datascience.stackexchange.com/questions/34061
复制相似问题