Java Math.abs vs Math.pow



所以这里有一个奇怪的问题。我正在解决一个 kNN 问题,需要找到最近的邻居。我正在研究距离,但再一次,我不在乎实际距离,只关心哪一个最近。但是,由于距离不能为负数,因此我需要平方或取距离的绝对值。

因此,这里有两个选项可以完成此操作:

//note: it's been abstracted for multiple dimensions (not just x and y)
for(int i = 0; i < (numAttributes - 1); i++)
{
    distance += Math.pow((a.value(i) - b.value(i)), 2);
}

//note: it's been abstracted for multiple dimensions (not just x and y)
for(int i = 0; i < (numAttributes - 1); i++)
{
    distance += Math.abs(a.value(i) - b.value(i));
}

我的问题是哪个更快。由于这是一个数据挖掘应用程序,我希望它能够尽快处理信息。虽然我知道,在胆量中,二的幂可以通过转变来实现,但我不确定在像Java这样高级语言中是否会出现这种情况,因为它被翻译为JVM。一个比另一个好有什么原因吗?

首先,考虑向量A=[0,0,0]B=[1,1,1]C=[0,0,2]。哪一个更接近A?是B还是C?实际上,关心距离测量在 kNN 中绝对至关重要。我们只谈论曼哈顿和欧几里得距离。例如,您也可以使用余弦相似性,并且应仔细选择距离度量,同时考虑您对数据的了解。

其次,与其进行这种低级优化,不如考虑更智能的东西。例如,一旦检测到太大的距离,就会中断for(int i = 0; i < (numAttributes - 1); i++)循环。

第三,使用Math.pow(a,2)来计算a*a肯定非常低效。

第四,i < (numAttributes - 1)?你不是说i < numAttributes吗?

最新更新