在DBSCAN

时间:2016-09-29 22:57:05

标签: python pandas scikit-learn cluster-analysis dbscan

玩这个DBSCAN示例: http://geoffboeing.com/2014/08/clustering-to-reduce-spatial-data-set-size/

作者使用每个群集的最中心点。但是,我想使用每个群集中出现次数最多的位置的坐标来表示该群集。在我的数据集中,DBSCAN工作得很好,但我想将这些聚类聚集在一起,可能是在生成的较小数据集上使用层次聚类。有关如何找到大多数时间发生的位置的任何指导都会很棒。欢迎任何其他改进群集的建议!谢谢!

数据==数据框类似于参考博客中的位置历史记录

eps_rad = 32 / 6371.0088 #convert to radians
coords = data.as_matrix(columns=['LocLatDegrees', 'LocLongDegrees'])    
db = DBSCAN(eps=eps_rad, min_samples=50, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))
cluster_labels = db.labels_
num_clusters = len(set(cluster_labels))  
n_clusters = len(set(cluster_labels)) - (1 if -1 in cluster_labels else 0)
print('Number of clusters: {:,}'.format(n_clusters))
#remove the noise i.e. cluster label -1
data =data[cluster_labels!=-1]
coords =coords[cluster_labels!=-1]
cluster_labels =cluster_labels[cluster_labels!=-1]
clusters = pd.Series([coords[cluster_labels==n] for n in range(n_clusters)])

1 个答案:

答案 0 :(得分:1)

那篇博文并不是特别好。

通过设置min_samples = 1,他并没有真正使用DBSCAN(因为这会禁用密度)。取而代之的是,他获得了一个单链接层次聚类结果(树形图在高度epsilon处切割'

)。

因为DBSCAN允许任意形状的簇,所以中心和最中心点实际上可能是选择。并且他的代码假定在确定中心时地球是平坦的......所以博客文章的这一部分也不是很合理......

如果你考虑这个image from Wikipedia

enter link description here

然后你可以看到红色星团的最中心点可能不是一个好的选择。

如果您只想减少数据集大小,建议您使用非常简单的 Leader 群集方法。

  

学家A. Hartigan。聚类算法。 John Wiley&儿子,纽约,1975年

这更接近于减少数据集大小的目标:基本上你定义了一个阈值d,如果你已经有一个比d更接近的对象,你跳过点,否则保持它。与DBSCAN相比,这不会产生类似香蕉的簇。

但如果你之后想要进行层次聚类,那么为什么要首先使用这种近似?

正如另一个stackoverflow问题所指出的,请注意scipy.cluster.hierarchy.leaders不是领导者算法。有一个名为leaderCluster的R包,以及我最近关注的ELKI项目({3}}。由于ELKI版本可以使用索引,我希望它更快,但我还没有尝试过(他们的DBSCAN和OPTICS非常快,所以我通常使用ELKI来处理大型数据集;我喜欢封面树索引,它不需要比距离函数更多的参数,并且运行良好 - 发现它比R * -tree更快更容易使用;但这些是我个人的偏好 - 我希望jupyter会添加一些Java支持)。