浮点计算和三角不等式

时间:2014-01-30 17:13:51

标签: floating-point distance trigonometry nearest-neighbor

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

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

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

我正在乱搞,发现如果我以米为单位向下舍入下一个整数,即java中的Math.floor(),然后加上5,结果似乎突然满足了三角形不等式我测试的所有案例。

我已经测试了10的倍数的每个纬度/经度组合,即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的情况下舍入DOWN不起作用。

例如:

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加到最后一位数。

1 个答案:

答案 0 :(得分:0)

老帖,但我忍不住回答。

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

距离(x,x)== 5

IMO,这对于VPTree而言可能比在三角形不等式属性上失败更成问题。