Python 使用DBSCAN查找最密集的群集?
我一直在看Geoff Boeing在DBSCAN上的精彩博客文章。我最感兴趣的页面是- 我如何修改此方法以返回最大群集的中心(群集中心周围有最多lat/lng点)?是否存在与每个簇的中心点相关的密度等级 核心DBS可以-Python 使用DBSCAN查找最密集的群集?,python,scikit-learn,cluster-analysis,dbscan,Python,Scikit Learn,Cluster Analysis,Dbscan,我一直在看Geoff Boeing在DBSCAN上的精彩博客文章。我最感兴趣的页面是- 我如何修改此方法以返回最大群集的中心(群集中心周围有最多lat/lng点)?是否存在与每个簇的中心点相关的密度等级 核心DBS可以- db = DBSCAN(eps=.01, min_samples=1).fit(coordinates) labels = db.labels_ num_clusters = len(set(labels)) - (1 if -1 in labels else 0) clus
db = DBSCAN(eps=.01, min_samples=1).fit(coordinates)
labels = db.labels_
num_clusters = len(set(labels)) - (1 if -1 in labels else 0)
clusters = pd.Series([coordinates[labels == i] for i in xrange(num_clusters)])
print('Number of clusters: %d' % num_clusters)
不幸的是,这篇博文在一些关键点上是错误的
minu samples=1
一起使用。即单连锁聚类如果需要单链接,请使用单链接,而不是DBSCAN。在这里,领导者集群可能也是一个不错的选择自改革以来,一些要点(特别是第4点)得到了改进。DBSCAN现在实际上使用了haversine和ball树索引。如果您有兴趣将最大的簇表示为“中心”点(例如,降维),我将执行以下操作: 查找分类点数最多的群集:
# Assumes coordinates is a DataFrame
db = DBSCAN(eps=eps, min_samples=min_samples).fit(coordinates)
df = pd.DataFrame([coordinates.x, coordinates.y, db.labels_]).T # Add other attributes of coordinates if needed
df.columns = ['x', 'y','label']; # Add column names
max_label = df.label.mode()[0];
max_cluster = df[df['label']==max_label];
可以取每列的平均值
max_cluster_array = max_cluster[['x','y']].as_matrix()
print max_cluster_array.mean(axis=0) # what you are looking for
如果你有兴趣评估一个更强大的“中心”点,你也可以研究函数。我也在做一个类似的项目,并使用他的博客文章作为指导。返回最大集群中心的逻辑(但请注意,使用DBSCAN时,中心本身可能没有意义):按大小对集群排序,取最大值,计算质心(使用该博客文章中提供的逻辑)。那你就有选择了。您可以将计算出的质心保留为“中心点”,也可以在集群中找到离该质心最近的点(正如该博客文章的作者所做的) 与另一位回复者相反,该博客帖子在以下几点上没有错误:
最重要的是,结果与他们在博客文章中的预期完全一致。Ouch。k=1的k-均值?从没听说过“平均”功能?!?感谢您的建议-就第4条而言,这是否意味着我将使用great circle预筛选数据集以进行预聚类?有没有一种有效/标准的方法可以做到这一点?DBSCAN可以简单地使用大圆距离,而不需要进行预处理。至少ELKI版本可以做到这一点,我不确定scikit学习版本。如果你想要单链接集群,使用单链接更有效。那是用大锤敲螺母。这是可能的,但不明智。还要注意的是,他已经改变了帖子和代码,并开始解决其中一些问题: