【问题标题】:Floating point calculations and the triangle inequality浮点计算和三角不等式
【发布时间】:2014-02-23 03:26:28
【问题描述】:

我正在使用 VPTree 来优化一些 K-最近邻算法。

VPTree 要求距离函数满足triangle inequality

三角不等式表明以下必须为真:

distance(x,z) <= distance(x,y) + distance(y,z)

我们的距离函数中使用的一个特征是地理距离,以米为单位,它是用浮点算法计算的。我发现由于浮点计算不精确,这个特性已经违反了三角不等式。

例如:

x = -90,-180
y = -90,-162
z = -81,-144
distance(x,z) = 1005162.6564502382
distance(x,y) = 1.2219041408558764E-10
distance(y,z) = 1005162.656450238
distance(x,y) + distance(y,z) = 1005162.6564502381

显然三角不等式在这种情况下失败了。

我乱来,发现如果我把米的距离DOWN到下一个整数,即java中的Math.floor(),然后加5,结果好像一下子满足了中的三角不等式我测试过的所有案例。

我已经测试了每个 10 的倍数的 lat/long 组合,即 20^6 组合。

在此更改之后,我们得到上面示例的以下结果:

x = -90,-180
y = -90,-162
z = -81,-144
distance(x,z) = 1005167
distance(x,y) = 5
distance(y,z) = 1005167
distance(x,y) + distance(y,z) = 1005172

显然三角不等式在这种情况下不再失败。

这看起来很完美,因为 5 米在我们的用例中并不重要。

我只是“强迫”它工作并且仍然违反三角不等式的某些要求或 VPTrees 的某些要求吗?这是浮点数的已知属性吗?

请注意,仅向下舍入而不加 5 是行不通的。

例如:

x = -90,-180
y = -81,-180
z = -72,-180
distance(x,z) = 2009836.0
distance(x,y) = 1005162.0
distance(y,z) = 1004673.0
distance(x,y) + distance(y,z) = 2009835.0

加上5:

x = -90,-180
y = -81,-180
z = -72,-180
distance(x,z) = 2009841.0
distance(x,y) = 1005167.0
distance(y,z) = 1004678.0
distance(x,y) + distance(y,z) = 2009845.0

另外请注意,我发现这适用于任何类型的浮点运算,而不仅仅是地理距离。例如一个距离函数,它通过单次除法运算计算某个最大值的百分比,只要您始终四舍五入到特定位数并在最后一位数上加 5。

【问题讨论】:

  • 为什么停在 5 点?右侧有两个距离,左侧有一个距离。再加上 50 亿,不等式将永远不会是错误的三倍点,它应该是正确的。
  • 我明白这一点。我只是在这个例子中使用了 5。问题实际上更多地是关于三角不等式,它是否真的只是关于任意两个距离,或者它是否需要以某种方式扩展到任意数量的距离?
  • 您的距离函数必须满足几个属性。你说,三角形属性是一。另一个是它应该以某种准确度返回两点之间的距离。我担心以您描述的方式伪造距离函数会损害后一个要求。要问的问题包括:为什么你的距离函数需要满足三角不等式?有什么办法吗?距离函数必须有多精确?能不能计算的更准确一点,让舍入误差不违反不等式?
  • 另请注意,您的样本 x 和 y ((-90º, -180º) 和 (-90º, -162º)) 是同一点的两种表示形式。当纬度为 +90º 或 -90º 时,修改距离函数以使用规范经度将消除导致违反涉及这些点的三角不等式的方差。

标签: floating-point distance trigonometry nearest-neighbor


【解决方案1】:

老话题,但我忍不住回答。

你的四舍五入加五的方法可能满足三角不等式,但它会使一个点与自身之间的距离大于零。这意味着:

距离(x, x) == 5

IMO 这对于 VPTree 来说可能与在三角不等式属性上失败一样有问题。

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2010-10-07
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多