2012-11-14 36 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