[英]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
??
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.