【发布时间】:2012-01-14 00:14:43
【问题描述】:
我想对一组大约进行预聚类。 500,000 点。
我还没有开始,但这是我认为我会做的:
- 将所有点存储在本地SOLR 索引中
- 根据一些行政信息(例如大城市)确定“自然集群位置”
- 然后为每个城市计算一个集群:
- 为每个城市
- 每个缩放级别
- 查询索引以获取城市周围半径中包含的点(半径的长度取决于缩放级别)
- 每个缩放级别
- 为每个城市
这应该是相当高效的,因为只有 100 个主要城市,而且 SOLR 查询非常快。但稍加思考后发现这是错误的:
- 可能存在比城市更“接近”的点集群:它们应该拥有自己的集群
- 在某些缩放级别下,某些点不在任何城市的可接受距离内,因此不会被计算在内
- 一些城市彼此靠近,因此,一些点将被计算两次(添加到两个集群中)
还有其他方法:
- 检查每个点并确定它属于哪个集群;这消除了上面的问题 2 和 3,但不是 1,而且效率也极低
- 制作一个(矩形)网格(针对每个缩放级别);这可行,但会导致疯狂/任意的集群,这些集群并不“意味着”任何东西
我想我正在寻找一种通用的地理聚类算法(或 idea),但似乎找不到。
编辑以回答 Geert-Jan 的评论
我想构建“自然”集群,是的,是的,我担心如果我使用任意网格,它不会反映数据的真实性。例如,如果在两个矩形的交点处或附近的一个点周围发生了许多事件,我应该只得到一个集群,但实际上会构建两个(每个矩形中一个)。
最初出于性能原因我想使用 localSOLR(因为我知道它,并且有更好的经验将大量数据索引到 SOLR 中而不是将其加载到传统数据库中);但是由于我们谈论的是预聚类,所以性能可能并不那么重要(尽管可视化新聚类实验的结果不应该花费数天时间)。我根据预定义的一组“大点”查询大量点的第一种方法显然是有缺陷的,我提到的第一个原因是最强的:集群应该反映数据的现实,而不是其他一些官僚定义(他们会显然重叠,当然,但数据应该是第一位的)。
有一个用于实时集群的出色集群器,已添加到核心 Google 地图 API:Marker Clusterer。我想知道是否有人尝试过“离线”运行它:运行它需要的任意时间,然后存储结果?
或者是否有一个聚类器可以逐点检查每个点,并输出包含其坐标和点数的聚类,并且在合理的时间内执行此操作?
【问题讨论】:
-
我是否理解正确,您担心所有方法都会出现误报和/或误报,因为您从搜索空间的某种非自然分区开始,(可能是出于性能原因) .您能否详细说明这些要点是什么?你说:'制作一个(矩形)网格(针对每个缩放级别);这可行,但会导致疯狂/任意的集群,这些集群并不“意味着”任何东西。理想情况下,点簇对您意味着什么?也许您不需要非自然分区,但如果没有更多的洞察力,我真的不能说。
-
对不起,我之前没有看到您的评论,我依赖自动通知,显然这不包括 cmets...我正在更新我的问题以回答您的评论。
-
目前没有太多时间:看一下算法类:基于层次的聚类(可以根据缩放级别将较小的聚类合并/拆分为较大的聚类。另请查看概念“基于密度的聚类”与“基于距离的聚类”相比。我觉得“基于密度的聚类”可能会为您的目标提供更自然的聚类。这些算法不是专门与地理相关的(但当然是空间相关的)。这个可能不需要成为问题,在相对较小的区域(如城市)上,您可能会忘记地球是“圆的”.. hth
-
你有什么发现吗?我们正在尝试做同样的事情......
-
你能提供一下你最终做了什么吗?
标签: solr cluster-analysis server-side geo localsolr