在做 kNN 时,您需要记住一件事,即它不是严格的数学派生算法,而是基于一种直觉的简单分类器/回归器 - 当参数不变时,底层函数不会发生太大变化很多。或者换句话说,底层函数是局部接近常数的。有了这个假设,您可以通过最近 k 点的值的(可能加权的)平均值来估计任何给定点的基础函数的值。
牢记这一点,您可以意识到当多数投票中没有明确的赢家时,没有明确的必要性。您可以始终使用奇数 k,也可以使用一些单射加权。
在邻居 3 到 5 与兴趣点的距离相同的情况下,您可以只使用两个,也可以使用全部 5 个。同样,请记住 kNN 不是从复杂的数学分析得出的某种算法,而只是一个简单的直觉。如何处理这些特殊情况取决于您。
在权重方面,您的算法基于这样的直觉,即当参数变化不大时,函数变化不大。所以你想给更接近兴趣点的点赋予更大的权重。例如,一个好的权重是1||x−y||2,或者当距离较小时相对较大的任何其他值,而当点之间的距离较大时相对较小(因此可能是某些连续度量函数的倒数)。
Samory Kpotufe 和 Abdeslam Boularias 今年也发表了一篇关于 NIPS 的好论文,探讨了寻找正确权重的问题。他们的一般直觉是,基础函数在不同方向上的变化不同(即,其不同的偏导数具有不同的量级),因此在某种意义上根据这种直觉改变度量/权重是明智的。他们声称这个技巧通常可以提高 kNN 和内核回归的性能,我认为他们甚至有一些理论结果来支持这一说法(虽然我不确定这些理论结果实际上声称什么,但我没有时间去通过整篇论文)。该论文可以从他们的网站免费下载,或者在谷歌搜索“梯度权重帮助非参数回归器”之后下载。
现在,您可能想知道如何找到正确的 k、度量、权重、在有平局时执行的操作等等。可悲的是,经过深思熟虑后基本上很难得出正确的超参数,您可能需要测试不同的超参数束,看看哪些超参数在某些验证集上效果很好。如果您有一些计算资源,并且希望在一组好的超参数上自动获得正确的参数,那么最近有一个想法(我非常喜欢)在该设置中使用高斯过程进行无导数优化。
让我详细说明一下——找到一组超参数(即,使验证数据的误差最小化),可以被视为一个优化问题。不幸的是,在这种设置下,我们无法获得我们尝试优化的函数的梯度(这是我们通常想要做的,执行梯度下降或更高级的方法)。在这种情况下,可以使用高斯过程来寻找超参数集,这些超参数集有很大的机会比我们迄今为止发现的最佳参数集表现得更好。因此,您可以使用一组超参数迭代地运行算法,然后询问高斯过程接下来最好尝试哪些,尝试那些,等等。
有关详细信息,请查找 Jasper Snoek、Hugo Larochelle 和 Ryan P Adams 的论文“Practical Bayesian Optimization of Machine Learning Algorithms”(也可以在他们的网站或通过 Google 找到)。