在 kNN 中处理关系、权重和投票

机器算法验证 k-最近邻 权重 领带
2022-01-28 11:51:17

我正在编写一个 kNN 算法,并想知道以下内容:

抢七局:

  1. 如果多数投票中没有明确的赢家,会发生什么?例如,所有 k 个最近的邻居都来自不同的类,或者对于 k=4,有 2 个来自 A 类的邻居和 2 个来自 B 类的邻居?
  2. 如果由于有更多具有相同距离的邻居而无法准确确定 k 个最近邻居,会发生什么?例如,对于距离列表,(x1;2), (x2;3.5), (x3;4.8), (x4;4.8), (x5;4.8), (x6;9.2)不可能确定 k=3 或 k=4 最近的邻居,因为第 3 到第 5 个邻居都具有相同的距离。

重量:

  1. 我读到在选择获胜班级之前对 k 最近邻进行加权是很好的。这是如何运作的?即邻居是如何加权的,然后如何确定类?

多数票替代方案:

  1. 除了多数票之外,还有其他规则/策略来确定获胜类别吗?
4个回答

在我看来,为k最近邻打破平局的理想方法是将k1,直到打破平局。无论投票权重方案如何,这将始终有效,因为当k = 1时不可能出现平局。如果您要增加k,等待您的权重方案和类别数量,您将无法保证平局。

在做 kNN 时,您需要记住一件事,即它不是严格的数学派生算法,而是基于一种直觉的简单分类器/回归器 - 当参数不变时,底层函数不会发生太大变化很多。或者换句话说,底层函数是局部接近常数的。有了这个假设,您可以通过最近 k 点的值的(可能加权的)平均值来估计任何给定点的基础函数的值。

牢记这一点,您可以意识到当多数投票中没有明确的赢家时,没有明确的必要性。您可以始终使用奇数 k,也可以使用一些单射加权。

在邻居 3 到 5 与兴趣点的距离相同的情况下,您可以只使用两个,也可以使用全部 5 个。同样,请记住 kNN 不是从复杂的数学分析得出的某种算法,而只是一个简单的直觉。如何处理这些特殊情况取决于您。

在权重方面,您的算法基于这样的直觉,即当参数变化不大时,函数变化不大。所以你想给更接近兴趣点的点赋予更大的权重。例如,一个好的权重是1||xy||2,或者当距离较小时相对较大的任何其他值,而当点之间的距离较大时相对较小(因此可能是某些连续度量函数的倒数)。

Samory Kpotufe 和 Abdeslam Boularias 今年也发表了一篇关于 NIPS 的好论文,探讨了寻找正确权重的问题。他们的一般直觉是,基础函数在不同方向上的变化不同(即,其不同的偏导数具有不同的量级),因此在某种意义上根据这种直觉改变度量/权重是明智的。他们声称这个技巧通常可以提高 kNN 和内核回归的性能,我认为他们甚至有一些理论结果来支持这一说法(虽然我不确定这些理论结果实际上声称什么,但我没有时间去通过整篇论文)。该论文可以从他们的网站免费下载,或者在谷歌搜索“梯度权重帮助非参数回归器”之后下载。

现在,您可能想知道如何找到正确的 k、度量、权重、在有平局时执行的操作等等。可悲的是,经过深思熟虑后基本上很难得出正确的超参数,您可能需要测试不同的超参数束,看看哪些超参数在某些验证集上效果很好。如果您有一些计算资源,并且希望在一组好的超参数上自动获得正确的参数,那么最近有一个想法(我非常喜欢)在该设置中使用高斯过程进行无导数优化。

让我详细说明一下——找到一组超参数(即,使验证数据的误差最小化),可以被视为一个优化问题。不幸的是,在这种设置下,我们无法获得我们尝试优化的函数的梯度(这是我们通常想要做的,执行梯度下降或更高级的方法)。在这种情况下,可以使用高斯过程来寻找超参数集,这些超参数集有很大的机会比我们迄今为止发现的最佳参数集表现得更好。因此,您可以使用一组超参数迭代地运行算法,然后询问高斯过程接下来最好尝试哪些,尝试那些,等等。

有关详细信息,请查找 Jasper Snoek、Hugo Larochelle 和 Ryan P Adams 的论文“Practical Bayesian Optimization of Machine Learning Algorithms”(也可以在他们的网站或通过 Google 找到)。

关于这个平局部分,平局的最佳基线想法通常是随机破坏,因此选择所有赢得投票的随机类并随机选择一个足够大以填充 k 的平局对象子集。

这样的解决方案强调了这样一个事实,即这些是病理情况,根本没有提供足够的信息来在 kNN 机制中做出决定。顺便说一句,如果它们对您的数据很常见,也许您应该尝试一些更区分的距离?

一种可能的方法是让算法自动增加或减少 k,直到您获得明确的赢家。