ELKI DBSCAN LngLatDistanceFunction 生成一个集群

ELKI DBSCAN LngLatDistanceFunction producing one cluster

我正在使用 Elki LngLatDistanceFunction 对 Lon/lat 点进行聚类,但它只返回一个聚类(当我使用 Euclid 距离时返回更多聚类)。我尝试了多个 Epsilon 值,但我仍然得到一个集群。

    int minPts=20;
    double eps=10;
    ListParameterization params = new ListParameterization();
    params.addParameter(DBSCAN.DISTANCE_FUNCTION_ID, LngLatDistanceFunction.class);
    params.addParameter(DBSCAN.Parameterizer.MINPTS_ID, minPts);
    params.addParameter(DBSCAN.Parameterizer.EPSILON_ID, eps);

    params.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, dbcon);
    params.addParameter(AbstractDatabase.Parameterizer.INDEX_ID, RStarTreeFactory.class);
    params.addParameter(RStarTreeFactory.Parameterizer.BULK_SPLIT_ID, SortTileRecursiveBulkSplit.class);
    params.addParameter(AbstractPageFileFactory.Parameterizer.PAGE_SIZE_ID, 600);

    Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, params);
    db.initialize();

    GeneralizedDBSCAN dbscan = ClassGenericsUtil.parameterizeOrAbort(GeneralizedDBSCAN.class, params);

距离以米为单位。因此,您需要选择 epsilon,使某些点(但不是所有点)的邻居数超过 minPts。

您可以使用KNNDistancesSampler class 来估计参数。它不是自动估计。但是您可以绘制结果距离,并检查此图中的 "knee"。

注意 "noise" 标志。

  • 如果你得到一个单一的簇,并且它是 "noise",那么 epsilon 太小了。
  • 如果你得到一个单一的集群,它是一个 "cluster"(不是噪声),那么 epsilon 太大了。
  • 如果你得到一个单一的集群,并且它是"noise",那么minPts可能太大了。
  • 如果你得到的是单个簇,而且是一个簇,那么minPts可能太小了。

对于大多数应用来说,将minPts固定为4、10、20会更容易;然后根据需要调整 epsilon 参数。对于像您这样的地理应用程序,修复 epsilon 参数并改变 minpts 参数可能更容易。例如,您可能 知道 小于 10000 米的距离表明物体是 "neighbors".

OPTICS等算法也有助于直观地选择参数。 (使用 MiniGUI!)