寻找适用于高噪声数据的聚类算法。

3

我正在尝试在一些具有高噪声的数据中找到聚类(请参见下面的图)。

enter image description here

我尝试使用DBSCAN,它有点起作用,但需要手动调整输入参数才能正确地找到聚类。是否有其他适合处理这种数据的好的聚类算法?

一些考虑因素:

  • 我正在使用Julia进行数据处理。

  • 数据在两个方向上都具有周期性边界条件。

  • 聚类数是先验已知的。

  • 我计划以这种方式处理许多数据集,因此它应该运行相对快速,而且不需要太多手动操作。

谢谢!


1
我认为OPTICS聚类可以帮助你,但我找不到在Julia中实现它的方法。如果你想尝试Python,可以在这里查看https://scikit-learn.org/stable/modules/generated/sklearn.cluster.OPTICS.html。 - Virgaux Pierre
1
有一个名为ScikitLearn.jl的Julia接口可以访问OPTICS(该软件包中的某些模型是用Julia编写的,某些模型是用Python编写的,OPTICS目前从Python的scikit-learn导入)。如果您正在使用MLJ,则还有一个接口包可用于在MLJ生态系统中使用此模型。该接口包的详细信息请参见:https://docs.juliahub.com/MLJScikitLearnInterface/OPmBR/0.2.0/autodocs/#MLJScikitLearnInterface.OPTICS。 - Sundar R
我对当前的算法不是很了解,但过去可能有人提到过 Kohonen 网络。基本上,你在数据空间中放置一个二维顶点网格(每个顶点有四个相邻点),然后从你的数据中随机选取点,将最接近的网格顶点向该点移动。因此,聚类区域吸引着网格点,随着时间的推移(不确定收敛速度有多快),网格顶点向聚类移动。这很容易编码,说不定你会走运。 - BitTickler
2个回答

2
我认为这里介绍的算法 https://arxiv.org/abs/1406.7130 可以用于解决你的问题。它在Julia中实现,代码在这里 https://github.com/twMisc/Clustering-ToMaTo
我把项目fork出来,重构成一个包,网址是https://pnavaro.github.io/ClusteringToMaTo.jl,同时还提供了一些示例:https://pnavaro.github.io/ClusteringToMaTo.jl/dev/demo2/ 也许你可以将代码嵌入到你的项目中,并进行适当修改。希望它对你有所帮助。
我的目标是提供一个更加简洁的包,其中包含这个算法的实现,网址是https://github.com/pnavaro/GeometricClusterAnalysis.jl,不过目前还未完成。

https://github.com/twMisc/Clustering-ToMaTo 的参考资料与您提供的链接不同。 - Royi
是的,抱歉,我提供的参考资料是一个变体。所有的参考资料都可以在这里找到:https://geometrica.saclay.inria.fr/data/Steve.Oudot/clustering/。我认为这些算法的最佳实现可以在GUDHI项目中找到,网址是https://gudhi.inria.fr。他们提供了一个R语言和一个Python语言的包。 - pnavaro

0

关于生成/概率模型怎么样?也许它不适合你的情况,但你可以很快地尝试一下:

using Pkg
Pkg.add("BetaML")
using BetaML
m       = GMMClusterModel(nClasses=K,mixtures=[FullGaussian() for i in 1:K])
fit!(m,X)  # X is a n by d matrix
classes = mode(predict(m))

告诉我!


GGM不是假设聚类大致服从高斯分布吗?但我的聚类明显不是这样的。 - Ewout
我喜欢这个生成的想法——但是是的,这更像是覆盖在(非高斯)聚类上的均匀噪声。 - phipsgabler
您展示的数据具有非高斯聚类,但这并不意味着具有高斯聚类的方法与问题完全不匹配。特别是,可以进行两个层次的聚类,其中每个高层聚类对应于您寻找的聚类。这些高层聚类将依次被定义为高斯混合聚类。建立这种模型的一种方法是使用高斯进行低级聚类,然后基于重叠聚类那些聚类。 - Ted Dunning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接