我一直在寻找scipy和sklearn来解决我遇到的特定问题的聚类算法。我需要一些方法来将N个粒子的特征表征为k个组,其中k不一定是已知的,除此之外,没有先验的链接长度是已知的(类似于此question)。
我尝试过kmeans,如果您 知道 您想要多少个群集,这种方法效果很好。我已经尝试了dbscan,除非你 告诉 它是一个特征长度范围,停止查看(或开始寻找)群集,否则它会很糟糕。问题是,我可能有成千上万的这些粒子簇,我不能花时间告诉kmeans / dbscan算法他们应该做些什么。
以下是dbscan找到的示例:
你可以看到这里确实存在两个不同的群体,虽然调整了epsilon因子(相邻群集参数之间的最大距离),但我根本无法看到这两个粒子群。
还有其他算法可以在这里使用吗?我预先寻找最少的信息 - 换句话说,我希望算法能够做出关于什么可能构成一个单独集群的“智能”决策。
答案 0 :(得分:8)
我找到了一个不需要先验信息/猜测的东西,并且非常适合我要求它做的事情。它名为Mean Shift,位于SciKit-Learn。它也相对较快(与Affinity Propagation等其他算法相比)。
以下是它给出的一个例子:
我还想指出,在文档中指出它可能无法很好地扩展。
答案 1 :(得分:3)
使用DBSCAN时,对数据进行缩放/标准化可能会有所帮助 预先确定距离,以便估计epsilon是相对的。
有一个DBSCAN的实现 - 我认为它是一个 Anony-Mousse某处被称为“漂浮在周围” - 来自 使用epsilon估计函数。它有效,只要它没有喂食 使用大型数据集。
github上有几个incomplete versions的OPTICS。也许 你可以找到一个适合你的目的。仍然 试图找出自己,minPts有哪些影响,使用一个和 相同的提取方法。
答案 2 :(得分:1)
您可以尝试最小生成树(zahn算法),然后删除类似于alpha形状的最长边。我使用它与delaunay三角剖分和凹形船体:http://www.phpdevpad.de/geofence。您也可以尝试使用分层集群,例如clusterfck。
答案 3 :(得分:1)
您的情节表明您选择的minPts
参数方式太小了。
看看OPTICS,它不再需要DBSCAN的epsilon参数。