在执行kNN时,您需要记住一件事,即它不是严格的数学推导算法,而是基于一种直觉的简单分类器/回归器-当参数不变时,基础函数也不会发生很大变化许多。或者换句话说,底层函数是局部近恒定的。通过这种假设,您可以通过最接近的k个点的值的(可能是加权的)平均值来估计任何给定点中基础函数的值。
牢记这一点,您可以意识到,在多数表决中没有明确的获胜者时,没有明显的必要性。您可以始终使用奇数k,也可以使用一些内射加权。
如果邻居3到5距兴趣点的距离相同,则可以只使用两个,也可以全部使用5。同样,请记住,kNN不是从复杂的数学分析中得出的某种算法,而只是一个简单的直觉。您要如何处理这些特殊情况取决于您。
1个| | X-ÿ| |2
Samory Kpotufe和Abdeslam Boularias今年在NIPS上也发表了一篇不错的论文,涉及找到合适权重的问题。他们的一般直觉是,底层函数在不同方向上有不同的变化(即,其不同的偏导数具有不同的大小),因此,在某种意义上根据此直觉更改度量/权重将是明智的。他们声称这个技巧通常可以改善kNN和内核回归的性能,而且我认为他们甚至有一些理论结果来支持这一观点(尽管我不确定这些理论结果实际上是做什么的,但我没有时间去做)通过整篇论文)。可以从其站点免费下载该论文,也可以在Google搜索“梯度权重帮助非参数回归器”之后免费下载该论文。
现在,您可能想知道如何找到正确的k,度量,权重以及在绘制时要执行的操作等。可悲的是,经过一番深思熟虑,基本上很难得出正确的超参数,您可能需要测试不同的超参数串,并查看哪些超参数在某些验证集上能很好地工作。如果您有一些计算资源,并且希望通过一组良好的超参数自动获得正确的参数,那么最近有一种想法(我非常喜欢)使用高斯过程进行该设置中的无导数优化。
让我详细说明一下-查找超参数集(即,将验证数据上的错误最小化)可以看作是一个优化问题。不幸的是,在这种设置下,我们无法获得我们尝试优化的函数的梯度(这通常是我们要执行的操作,以执行梯度下降或其他更高级的方法)。在这种情况下,可以使用高斯过程来查找超参数集,这些超参数集具有比我们目前找到的最佳参数更好的性能。因此,您可以使用一组超参数来迭代地运行该算法,然后询问高斯过程,接下来最好尝试哪些,然后再尝试那些,等等。
有关详细信息,请参阅Jasper Snoek,Hugo Larochelle和Ryan P Adams撰写的论文“机器学习算法的实用贝叶斯优化”(也可以在其网站上或通过Google找到)。