Floating point 浮点运算与三角不等式

Floating point 浮点运算与三角不等式,floating-point,distance,trigonometry,nearest-neighbor,Floating Point,Distance,Trigonometry,Nearest Neighbor,我正在使用VPTree优化一些K-最近邻算法 VPTree要求距离函数满足 三角形不等式规定以下条件必须为真: distance(x,z) <= distance(x,y) + distance(y,z) 显然,三角形不等式在这种情况下失败了 我胡思乱想,发现如果我将距离(以米为单位)四舍五入到下一个整数,即java中的Math.floor(),然后加上5,结果似乎突然满足了我测试过的所有情况下的三角形不等式 我已经测试了每一个10倍的横向/纵向组合,即20^6个组合 进行此更改后,我们

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

VPTree要求距离函数满足

三角形不等式规定以下条件必须为真:

distance(x,z) <= distance(x,y) + distance(y,z)
显然,三角形不等式在这种情况下失败了

我胡思乱想,发现如果我将距离(以米为单位)四舍五入到下一个整数,即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米在我们的用例中并不重要

我只是“强迫”这项工作,并且仍然违反了三角形不等式的某些要求或VP树的某些要求吗?这是已知的浮动属性吗?

请注意,简单地四舍五入而不加5是行不通的

例如:

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
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。

旧线程,但我忍不住回答

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

距离(x,x)=5


在我看来,对于VPTree来说,这可能比在三角形不等式属性上失败一样有问题。

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