我正在实施一个需要对地理点进行聚类的项目。 OPTICS算法似乎是一个非常好的解决方案。它只需要2个参数作为输入(MinPts和Epsilon),它们分别是将它们视为一个簇所需的最小点数,并且用于比较两个点所在的距离值是否可以放在同一个簇中。
我的问题是,由于各种各样的点,我无法设置固定的epsilon。 请看下面的图片。
the problem http://s13.postimage.org/u5a08nwvb/Immagine.png
相同的点结构但是在不同的比例下将导致非常不同。假设设置MinPts = 2和epsilon = 1Km。 在左侧,算法将创建2个群集(红色和蓝色),但在右侧,它将创建一个包含所有点(红色)的单个群集,但我想在右侧获得2个群集。
所以我的问题是:有没有办法动态计算epsilon值来得到这个结果?
编辑2012年6月5日下午3.15: 我以为我正在使用javaml库中的OPTICS算法实现,但它似乎实际上是一个DBSCAN算法实现。 所以现在的问题是:有没有人知道基于java的OPTICS算法实现?
非常感谢你,请原谅我的英语。
马
答案 0 :(得分:3)
使用索引结构时,OPTICS中的epsilon值仅用于限制运行时复杂性。如果您没有加速度索引,可以将其设置为无穷大。
引用维基百科的OPTICS
严格来说,参数\ varepsilon不是必需的。它可以设置为最大值。当空间索引可用时,它在复杂性方面确实起到了实际作用。
你看起来更像DBSCAN而不是OPTICS。在OPTICS中,您不应该选择epsilon(作者应该将其称为max-epsilon!),但是您的集群提取方法将会解决这个问题。您使用的是OPTICS论文中提出的Xi萃取吗?
minPts更为重要。您应该尝试至少5或10的值,而不是2.使用2,您基本上执行单链接聚类!
一旦增加minPts,上面给出的示例应该可以正常工作!
Re:编辑你甚至可以在维基百科文章中看到,ELKI有一个合适的OPTICS实现,它是用Java编写的。
答案 1 :(得分:1)
您可以尝试按封闭矩形的总大小来缩放epsilon。例如,您的左侧数据大约为4km x 6km(使用我的Mark I眼球进行测量),右侧大约2km x 2km。因此,右边的epsilon应该小一点2.5倍。
当然,这不能可靠地运作。如果在你的右手数据上,右边4公里处有一个额外的单点,向下2公里,这将使右侧的封闭矩形与左边相同,你会得到类似(错误)的结果。 / p>
答案 2 :(得分:1)
您可以尝试最小生成树,然后删除最长边。剩余的生成树及其中心是OPTICS的最佳中心,您可以计算其周围的点数。
答案 3 :(得分:0)
在上面的解释中,正是规模的变化造成了不确定性。当你的比例变大时,你的epsilon应该相应改变。因为它们处于两个非常不同的比例,所以你呈现的两个图像不是同一组点。在不更改参数的情况下,它们不会对您的OPTICS算法做出相同的响应。
简而言之,没有。没有办法动态计算epsilon来获得这个结果。像这样的聚类已经是NP-Hard,这些聚类算法(光学,k-means,veroni)只能近似最优解。