2012-11-14 71 views
2

我正在進行最近鄰搜索項目,我需要距離度量標準 ,如Euclidian,Manhatan等。我可以自己實現它們,或者我想知道是否有可以使用的標準java代碼?Java中的距離度量標準

感謝

回答

2

看看阿帕奇ArrayRealVector它實現了RealVector接口。

那裏有L-1,L-inf和euklidian規範以及n維向量的metrik的實現。

https://code.google.com/p/symja/source/browse/trunk/commons-math/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java?r=883

+0

這隻需要兩個1班的OP需要很多代碼... – Wug

+0

如果你不想要,你不必導入整個班級至。但是如果你必須處理n維向量,它包含了很多有用的方法。你可以採取方法來計算規範和/或距離,這就是爲什麼我要鏈接到源代碼 – stg

3

曼哈頓距離很容易用Math.abs(x1-x2)+Math.abs(y1-y2)實現。

雖然可以使用Point2D.distance(x1,y1,x2,y2)方法爲歐氏距離,計算它是不難的:

double dx = x1-x2, dy = y1-y2; 
Math.sqrt(dx*dx+dy*dy); 

如果必須擴展爲更高的維度,通過座標作爲數組,並使用循環來計算平方和。

+1

我覺得這個函數的2參數版本更簡潔。我想知道爲什麼它是這樣設計的。 – Wug

+0

我想我不能使用Point2D,因爲日期的維度是未定義的,它可以是任何東西。感謝曼哈頓距離;) – user1796942

+0

@ user1796942:呃......日期?也許你的意思是數據?另外,你可以使用零作爲其他參數。 – Wug

2

有些車輪太小,以至於無法重新創建。

public class Distances 
{ 
    private Distances() {} 

    public static euclidean(double a, double b) 
    { 
     return Math.sqrt(a * a + b * b); 
    } 

    public static manhatten(double a, double b) 
    { 
     return Math.abs(a) + Math.abs(b); 
    } 
} 

用法:

double x1 = 15.0, y1 = 15.0; 
double x2 = 25.5, y2 = 37.25; 

Distances.euclidean(x1 - x2, y1 - y2); // order does not matter 
Distances.euclidean(y2 - y1, x1 - x2); // distance is the same regardless 

Distances.manhatten(x1 - x2, y1 - y2); 
+0

您應該如果你正在計算規範,不要命名你的班'距離';) – stg