如何最好地进行服务器端地理群集?

时间:2011-12-06 11:26:25

标签: solr cluster-analysis server-side geo localsolr

我想为一组大约预先进行聚类。 500,000点。

我还没有开始,但这是我以为我会做的事情:

  • 将所有积分存储在localSOLR索引
  • 根据一些行政信息(例如大城市)确定“自然集群位置”
  • 然后为每个城市计算一个群集:
    • 适用于每个城市
      • 表示每个缩放级别
        • 查询索引以获取城市周围半径中包含的点数(半径长度取决于缩放级别)

这应该非常有效,因为只有100个主要城市,SOLR查询非常快。但是更多的想法表明这是错误的:

  1. 可能有一些点比一个城市附近更“接近”的点:他们应该得到他们自己的集群
  2. 在某些缩放级别,某些点不在任何城市的可接受距离范围内,因此不会被计算在内
  3. 一些城市彼此靠近,因此,一些点数将被计算两次(添加到两个集群中)
  4. 还有其他方法:

    • 检查每个点并确定它属于哪个群集;这消除了上面的问题2和3,但不是1,并且也是非常低效的
    • 制作(矩形)网格(对于每个缩放级别);这有效,但会导致疯狂/任意群集,而不是“意味着”任何东西

    我想我正在寻找一种通用的地理聚类算法(或 idea ),而且似乎无法找到任何算法。


    编辑以回答Geert-Jan的评论

    我想构建“自然”集群,是的,是的,我担心如果我使用任意网格,它将无法反映数据的实际情况。例如,如果在两个矩形交叉点处或附近的点周围发生了许多事件,我应该只得到一个簇,但实际上会构建两个(每个矩形中有一个)。

    最初我想出于性能原因使用localSOLR(因为我知道它,并且有更好的经验将大量数据索引到SOLR中,而不是将其加载到传统数据库中);但由于我们谈论的是预聚类,因此性能可能并不那么重要(尽管可视化新聚类实验的结果不需要花费数天时间)。我根据一组预定义的“大点”查询大量积分的第一种方法显然是有缺陷的,这是我提到最强的第一个原因:群集应该反映数据的真实性,而不是其他官僚定义(他们会肯定会明显重叠,但数据应该先行。)

    有一个很棒的群集用于实时群集,已添加到核心Google Maps API中:Marker Clusterer。我想知道是否有人试图“脱机”运行它:运行它需要的任何时间,然后存储结果?

    或者是否有一个聚类器,它会逐点检查每个点,并输出包含其坐标和点数的聚类,并在合理的时间内完成这一点?

1 个答案:

答案 0 :(得分:0)

您可能希望研究一些高级聚类算法,例如OPTICS。

拥有良好的数据库索引,它应该相当快。