我正在尝试分析英国自行车事故的数据,以找出统计上的黑点。这里是来自另一个网站的数据示例。http://www.cycleinjury.co.uk/map
我目前使用SQLite存储大约10万个纬度/经度位置。我希望将附近的位置分组在一起。这项任务被称为聚类分析。
我希望通过忽略孤立的事件来简化数据集,只显示在小区域内发生过多次事故的聚类起点。
我需要克服三个问题。
-
性能 – 如何确保快速找到附近的点。例如,我是否应该使用SQLite的R-Tree实现?
-
链条 – 如何避免选择附近点的链条?
-
密度 – 如何考虑自行车人口密度?伦敦的自行车人口密度远高于布里斯托尔,因此伦敦似乎有更多的黑点。
我希望避免像这样的“链条”场景:
相反,我希望找到聚类:
伦敦截图(我手绘了一些聚类)…
布里斯托尔截图 – 密度低得多 – 如果不考虑相对密度,运行在该区域的同一程序可能找不到任何黑点。
任何建议都将非常有帮助!
回答:
嗯,你的问题描述听起来完全像是DBSCAN聚类算法(维基百科)。它避免了链条效应,因为它要求至少有minPts个对象。
至于跨区域的密度差异,OPTICS(维基百科)应该可以解决这个问题。不过,你可能需要使用不同的方式来提取聚类。
嗯,可能不是100% – 你可能希望有单一的热点,而不是“密度连接”的区域。当考虑OPTICS图时,我认为你只对小而深的谷感兴趣,而不是大的谷。你可以使用OPTICS图并扫描“至少10起事故”的局部最小值。
更新:感谢你提供数据集的指引。这真的很有趣。所以我没有将数据过滤到仅限自行车手,而是目前使用所有120万条带坐标的记录。我将它们输入到ELKI进行分析,因为它速度非常快,而且它实际上可以使用地理距离(即基于纬度和经度)而不是欧几里得距离,以避免偏差。我启用了R*-树索引和STR批量加载,因为这应该能大大降低运行时间。我使用OPTICS运行,设置Xi=.1,epsilon=1(公里)和minPts=100(仅寻找大型聚类)。运行时间大约为11分钟,还不错。当然,OPTICS图将有120万像素宽,因此不再适合完整可视化。考虑到巨大的阈值,它识别了18个聚类,每个聚类有100-200个实例。我将尝试下一步可视化这些聚类。但在你的实验中,尝试使用较低的minPts值。
所以这里是找到的主要聚类:
- 51.690713 -0.045545 伦敦北部A10上的一个十字路口,刚过M25
- 51.477804 -0.404462 “Waggoners Roundabout”
- 51.690713 -0.045545 “Halton Cross Roundabout”或其南侧的十字路口
- 51.436707 -0.499702 A30和A308 Staines By-Pass的分叉
- 53.556186 -2.489059 M61出口到A58,曼彻斯特西北部
- 55.170139 -1.532917 A189,North Seaton Roundabout
- 55.067229 -1.577334 A189和A19,就在这以南,一个四车道的环岛
- 51.570594 -0.096159 Manour House,Piccadilly线
- 53.477601 -1.152863 M18和A1(M)
- 53.091369 -0.789684 A1,A17和A46,一个复杂的结构,A1两侧都有环岛
- 52.949281 -0.97896 A52和A46
- 50.659544 -1.15251 怀特岛,桑当
- …
请注意,这些只是从聚类中随机选取的点。计算例如聚类中心和半径可能更合理,但我没有这样做。我只是想一窥这个数据集,它看起来很有趣。
这里是一些截图,minPts=50,epsilon=0.1,xi=0.02:
请注意,使用OPTICS,聚类可以是层次结构的。这里是一个细节: