我正在使用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加到最后一位数。
答案 0 :(得分:0)
老帖,但我忍不住回答。
四舍五入并加五的方法可能会满足三角形不等式,但它将使点与自身之间的距离大于零。这意味着:
距离(x,x)== 5
IMO,这对于VPTree而言可能比在三角形不等式属性上失败更成问题。