【问题标题】:Weka DBSCAN set epsilon based on geographic dataWeka DBSCAN 根据地理数据设置 epsilon
【发布时间】: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


【解决方案1】:

ELKI 已经包含此距离函数 LatLngDistanceFunction(请注意纬度和经度的顺序很重要;这就是为什么我们根据您的列顺序提供两者的原因)。

-algorithm.distancefunction geo.LatLngDistanceFunction

使用此距离函数的距离将以 为单位。使用参数-geo.model,您还可以在不同的地球近似值之间切换,例如简单的球面模型或 WGS84 球体。对于 DBSCAN,这并没有太大的区别,因为无论如何您都希望使用一个小的 epsilon(例如您建议的 5 米)。

ELKI 还包括此距离函数的索引功能。当您拥有大型数据集时,ELKI 会快得多(我邀请您自己对 ELKI 进行 基准测试 Weka)。 地理距离的索引加速的详细信息可以在以下出版物中找到:

E.舒伯特,A. Zimek,H.-P。克里格尔
Geodetic Distance Queries on R-Trees for Indexing Geographic Data
在第 13 届国际时空数据库 (SSTD) 研讨会论文集上,德国慕尼黑:146-164,2013。

只要你选择足够小的 epsilon 并使用真实世界的数据,R*-tree 通常会给你一个从 O(n^2) 到大约 0 的加速。 O(n log n) - 如果你有数百万个点,加速通常是 100x-1000x。

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 1970-01-01
    • 2018-06-11
    • 2018-04-22
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2016-09-08
    相关资源
    最近更新 更多