【问题标题】:ELKI DBSCAN LngLatDistanceFunction producing one clusterELKI DBSCAN LngLatDistanceFunction 产生一个集群
【发布时间】:2015-11-01 16:23:16
【问题描述】:

我正在使用 Elki LngLatDistanceFunction 对 Lon/lat 点进行聚类,但它只返回一个聚类(当我使用欧几里德距离时返回更多聚类)。我尝试了多个 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);

【问题讨论】:

  • 您知道 LatLngDistanceFunction 返回的距离的比例吗?它们(必然)与欧几里得距离不同。随机尝试 epsilon 值不是一个好策略。
  • 我认为根据stackoverflow.com/questions/23684070/… 计量。我知道与随机选择 epsilon 相比,有更好的策略,但我现在还不知道。你能给我一些关于如何实现这一目标的想法吗?
  • @Anony-Mousse 我确实将 epsilon 值修改为 2 英里 = 3218.69 米,但这并没有改善结果
  • 您观察的平均距离是多少?是否找到了密集的集群,或者您得到了噪声集群?
  • 所有点都在一个集群中。我使用了 KNNDistanceSampler,这是结果“MaxX: 760.0 MaxY: 1653.8102316360676 MinX: 1.0 MinY: 299.5734514358746”。我目前正在尝试根据下面的答案修改该参数,但还没有运气。

标签: cluster-analysis dbscan elki epsilon


【解决方案1】:

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

您可以使用KNNDistancesSampler 类来估计参数。它不是自动估计。但是您可以绘制结果距离,并在该图中检查“膝盖”。

注意“噪音”标志。

  • 如果你得到一个单一的集群,它是“噪音”,那么 epsilon 太小了。
  • 如果您得到一个集群,并且它是一个“集群”(不是噪声),那么 epsilon 就太大了。
  • 如果你得到一个单一的集群,它是“噪音”,那么 minPts 可能太大了。
  • 如果你得到一个单一的集群,而且它是一个集群,那么 minPts 可能太小了。

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

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

【讨论】:

  • 如何使用 KNNDistanceSampler 绘制距离?谢谢。
  • MiniGUI 应该会自动将图形可视化,或者您可以使用您喜欢的工具来可视化生成的曲线——它是一个简单的二维曲线(等级与距离)。从您上面给出的数字来看,400 或 500 之类的值可能不错 - 但您确实应该查看曲线,而不是边界框。
  • 我得到了使用 (XYCurve.Itr it = distanceOrderResult.iterator(); it.valid(); it.advance()) 获取 XY 值的距离,但我不知道排名来自哪里从?我应该看曲线的什么特征?
  • 查看坐标轴的标签。
  • x = 对象和 y = 10-NN 距离。我知道它是 10,因为 params.addParameter(KNNDistancesSampler.Parameterizer.K_ID, 10);所以我猜测 x = rank 和 y = distance 并且我应该绘制两条线并查看线之间的交点?对不起,我只是一个试图熟悉这些东西的初学者。
猜你喜欢
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2014-07-01
  • 2014-07-15
  • 1970-01-01
  • 2015-09-03
  • 2015-09-18
相关资源
最近更新 更多