我试图分析英国周期事故的数据,找出统计黑点。以下是来自其他网站的数据示例。 http://www.cycleinjury.co.uk/map
我目前正在使用SQLite来实现~100k存储lat / lon位置。我想将附近的地点组合在一起。此任务称为cluster analysis。
我想通过忽略孤立的事件来简化数据集,而只是显示在一个小区域内发生多个事故的集群的起源。
我需要克服3个问题。
效果 - 如何确保快速找到附近的点数。我应该使用SQLite's implementation的R-Tree吗?
链条 - 如何避免捡到附近点的链?
密度 - 如何考虑周期人口密度?伦敦的自行车运动员的人口密度远远超过布里斯托尔,因此伦敦似乎有更多的支持者。
我想避免像这样的'链'场景:
相反,我想找到群集:
伦敦截图(我手绘了一些群集)......
布里斯托尔截图 - 密度低得多 - 如果不考虑相对密度,在该区域运行的相同程序可能找不到任何黑点。
任何指针都会很棒!
答案 0 :(得分:11)
好吧,您的问题描述与DBSCAN clustering algorithm (Wikipedia)完全一样 。它避免了链效应,因为它要求它们至少是minPts对象。
至于密度差异,这就是OPTICS (Wikipedia)应该解决的问题。您可能需要使用不同的方法来提取群集。
好吧,好吧,也许不是100% - 你可能想拥有单个热点,而不是“密度连接”的区域。在考虑OPTICS图时,我认为你只对小而深的山谷感兴趣,而不是大山谷。您可以使用OPTICS绘图扫描“至少10次事故”的局部最小值。
更新:感谢指向数据集的指针。这真的很有趣。所以我没有把它过滤给骑自行车的人,但是现在我正在使用所有带坐标的120万条记录。我已经将它们送入ELKI进行分析,因为它真的很快,它实际上可以使用大地距离(即纬度和经度)而不是欧几里德距离,以避免偏差。我已经使用STR批量加载启用了R * -tree索引,因为这应该有助于将运行时降低到批次。我正在使用Xi = .1,epsilon = 1(km)和minPts = 100运行OPTICS(仅查找大型集群)。运行时间大约是11分钟,不算太差。当然OPTICS图的宽度为120万像素,因此对于完全可视化而言并不是很好。鉴于巨大的门槛,它确定了18个集群,每个集群有100-200个实例。接下来我会尝试将这些集群可视化。但是一定要为你的实验尝试更低的minPts。
以下是发现的主要群集:
注意,这些只是从群集中获取的随机点。计算例如,可能是明智的。相反,集群中心和半径,但我没有这样做。我只是想看看那个数据集,看起来很有趣。
以下是一些截图,minPts = 50,epsilon = 0.1,xi = 0.02:
请注意,使用OPTICS,群集可以是分层的。这是一个细节:
答案 1 :(得分:2)
首先,你的例子很容易让人误解。您有两组不同的数据,并且您无法控制数据。如果它出现在一个链条中,那么你将获得一个链条。
此问题并不完全适合数据库。您必须编写代码或在您的平台上找到实现此算法的包。
有许多不同的聚类算法。一,k-means,是一种迭代算法,您可以在其中查找固定数量的聚类。 k-means需要对数据进行一些完整的扫描,瞧,你有你的集群。索引不是特别有用。
另一个通常适用于略小的数据集的是分层聚类 - 您将两个最接近的事物放在一起,然后构建聚类。索引在这里可能会有所帮助。
我建议您仔细阅读kdnuggets这样的网站,以便了解哪些软件可以免费使用。