所以这里有个奇怪的问题。我正在处理一个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));
}我的问题是哪个更快。由于这是一个数据挖掘应用程序,我希望它能够尽快处理这些信息。虽然我理解,在内核中,可以通过一个shift来实现两种功能,但我不确定在像Java这样的高级语言中,它是为JVM翻译的。为什么其中一个比另一个好呢?
发布于 2015-04-30 01:25:51
首先,考虑向量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吗?
https://stackoverflow.com/questions/29957006
复制相似问题