【发布时间】:2016-02-01 15:45:43
【问题描述】:
我有一组地理数据,格式为:
46.52100798 6.567126449 gps
46.52368591 6.59208188 gps
46.52338534 6.593065244 gps
46.52303304 6.594046262 gps
我想做 DBSCAN 聚类并设置与真实距离相同的 epsilon 参数,如 5 米: 目前代码如下:
public static float distFrom(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 6371000; //meters
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
float dist = (float) (earthRadius * c);
return dist;
}
//给定两对地理数据的距离计算方法。
cl = new DBSCAN();
double [] timeArray = new double[data.numInstances()-1];
for (int i = 1; i<data.numInstances();i++){
timeArray[i-1] =(data.instance(i).value(0)-data.instance(i-1).value(0));
}
Arrays.sort(timeArray);
int point =(int)(30*60/timeArray[data.numInstances()/2]);
System.out.println(point);
cl.setMinPoints(point);
cl.setEpsilon(0.01);
cl.buildClusterer(newData);
// 设置 DBSCAN 实例的参数 任何人都知道如何将上述距离计算代码插入 DBSCAN 实例?
【问题讨论】:
-
ELKI 的可扩展性更强——并且已经包含了这个距离函数。它似乎也快得多。
标签: gps cluster-analysis weka dbscan