所以这是一个奇怪的问题。我正在处理 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));
}
我的问题是哪个更快。由于这是一个数据挖掘应用程序,我希望它能够尽快处理信息。虽然我明白,从本质上讲,可以通过转换实现 2 的幂,但我不确定在像 Java 这样的高级语言中是否会为 JVM 翻译它。一个比另一个更好的原因是什么?
最佳答案
首先,考虑 vector 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
??
关于Java Math.abs 与 Math.pow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29957006/