我正在寻找在Python 中使用OPTICS算法的一个不错的实现.我将用它来形成基于密度的点((x,y)对).
我正在寻找接收(x,y)对并输出簇列表的东西,其中列表中的每个簇包含属于该簇的(x,y)对的列表.
python cluster-analysis machine-learning data-mining optics-algorithm
我在ELKI环境中使用OPTICS实现时遇到问题.我在DBSCAN实现中使用了相同的数据,它就像一个魅力.可能我错过了一些带参数的东西,但我无法弄明白,一切似乎都是正确的.
数据是一个简单的300х2矩阵,由3个簇组成,每个簇有100个点.
DBSCAN结果:
MinPts = 10,Eps = 1
光学结果:
MinPts = 10
我正在实施一个需要聚集地理点的项目.OPTICS算法似乎是一个非常好的解决方案.它只需要2个参数作为输入(MinPts和Epsilon),它们分别是将它们视为一个簇所需的最小点数,并且用于比较两个点所在的距离值是否可以放在同一个簇中.
我的问题是,由于各种各样的点,我不能设置固定的epsilon.请看下面的图片.
问题http://s13.postimage.org/u5a08nwvb/Immagine.png
相同的点结构但是在不同的比例下将导致非常不同.假设设置MinPts = 2和epsilon = 1Km.在左侧,算法将创建2个群集(红色和蓝色),但在右侧,它将创建一个包含所有点(红色)的单个群集,但我想在右侧获得2个群集.
所以我的问题是:有没有办法动态计算epsilon值来得到这个结果?
编辑2012年6月5日3.15pm: 我以为我正在使用javaml库中的OPTICS算法实现,但它似乎实际上是一个DBSCAN算法实现.所以现在的问题是:有没有人知道基于java的OPTICS算法实现?
非常感谢你,请原谅我的英语不好.
马尔科
java algorithm cluster-analysis data-mining optics-algorithm
我正在尝试使用ELKI使用OPTICS聚类地理定位数据集.我已经明白要提取簇,我需要使用OPTICSXi算法而不是OPTICS,它只计算簇顺序.
我想知道你是否可以给我更多关于参数xi如何工作的信息.我将此值固定为0.009,但是以随机的方式.
我对检测密度变化的区域中的集群感兴趣,例如用户在城市中生成的数据,为此,我采用了OPTICS算法。
与DBSCAN不同,OPTICS算法不会产生严格的集群分区,而是会增加数据库的顺序。为了产生群集分区,我使用OPTICSxi,这是另一种基于OPTICS输出产生分类的算法。几乎没有能够从OPTICS输出中提取集群分区的库,而ELKI的OPTICSxi实现就是其中之一。
对我来说很清楚,如何解释DBSCAN的结果(尽管设置“有意义的”全局参数不是那么容易)。DBSCAN检测到簇的“原型”,其特征是密度,表示为每个区域的点数(分钟/ε)。OPTICSxi的结果似乎很难解释。
我有时会在OPTICSxi的输出中检测到两种现象,而我无法解释。一种是“尖峰”簇的外观,它们链接了地图的各个部分。我无法解释它们,因为它们似乎由很少的点组成,而且我不理解算法是如何决定将它们分组在同一群集中的。它们真的代表密度变化的“走廊”吗?查看基础数据,看起来不是那样。您可以在下面的图像中看到这些“尖峰”。

我无法解释的另一个现象是,有时存在相同层次级别的“重叠”集群。OPTICSxi基于数据库的OPTICS排序(例如树状图),该图中没有重复的点。
由于这是分层聚类,因此我们认为较低级别的群集包含较高级别的群集,并且在构建凸包时会强制执行该想法。但是,我看不出有在同一个层次上与其他集群相交的集群的任何理由,这实际上意味着某些点将具有双重集群“成员资格”。在下面的图像中,我们可以看到一些具有相同层次级别(0)的相交群集。

最后,我想让您留下的最重要的想法/问题是:我们希望在OPTICSxi聚类分类中看到什么?这个问题与参数OPTICSxi的任务紧密相关。
由于我几乎看不到针对特定聚类问题进行OPTICSxi的研究,因此我很难找到最佳聚类分类。即:可以提供一些有意义/有用的结果,并为DBSCAN集群增加一些价值的方法。为了帮助我回答这个问题,我使用不同的参数组合进行了多次OPTICSxi运行,并选择了三个参数进行讨论。

在此运行中,我使用了较大的epsilon(2Km)。该值的含义是我们接受大型群集(最大2Km);由于算法“合并”了簇,因此我们最终会得到一些非常大的簇,这些簇几乎肯定具有低密度。我喜欢此输出,因为它公开了分类的层次结构,并且实际上使我想起了DBSCAN的多个运行,它们具有不同的参数组合(针对不同的密度),这是OPTICS的广告“强度”。如前所述,较小的群集对应于层次结构级别中的较高级别和较高的密度。

在此运行中,即使“ contrast”参数与上一次运行相同,我们也会看到大量的簇。这主要是因为我选择的Minpts数量较少,这表明我们接受的点数较少的聚类。由于这种情况下的epsilon较短,因此我们看不到这些大簇占据了地图的很大一部分。我发现此输出不如前一个有趣,这主要是因为,即使我们具有分层结构,在同一级别上也有许多聚类,并且其中许多相交。在解释方面,我可以看到一个与上一个相似的整体“形状”,但实际上在许多小簇中却离散了,这些簇很容易被忽略为“噪音”。

此运行具有一个与上一个相似的参数选择,不同之处在于分钟数更大。结果是,不仅我们发现了更少的集群,而且它们的重叠较少,而且它们大多处于同一水平。
从为DBSCAN增加价值的角度来看,我将选择第一个参数组合,因为它提供了数据的层次结构图,清楚地显示了哪些区域更密集。恕我直言,最后一个参数组合无法提供密度的整体分布的概念,因为它在整个研究区域内都发现了相似的簇。我有兴趣阅读其他意见。
cluster-analysis hierarchical-clustering dbscan elki optics-algorithm
当我打印我的arr值时,我得到了二维数组的正确值,但是当我退出 while 循环时,我的值都是错误的。
我不确定我做错了什么。
#num runs
n = 4
x = np.linspace(-1,1,n)
y = np.linspace(-1,1,n)
x1,y1 = np.meshgrid(x, y)
l = np.linspace(0,1000,n)
x = np.linspace(-1,1,n)
p1,p2 = np.meshgrid(l,l)
w020 = 5*(y1**2+x1**2)
row, cols = (n,n)
arr = [[0]*cols]*row
i = 0
p = 0
while i < n:
i += 1
p=0
while p < n:
arr[i-1][p] = 2+2*math.cos(2*math.pi*w020[i-1,p])
p += 1
print(arr)
Run Code Online (Sandbox Code Playgroud) data-mining ×4
elki ×3
dbscan ×2
python ×2
algorithm ×1
java ×1
numpy ×1
performance ×1
while-loop ×1