使用Python和DBSCAN对高维数据进行聚类

7
我有一个1000维度的数据集,我正在尝试使用Python中的DBSCAN对数据进行聚类。但我很难理解应该选择什么指标以及为什么选择它。

可以有人解释一下吗?我该如何决定设置eps值的大小?

我对数据的细节结构很感兴趣,因此将min_value设置为2。现在我使用sklearn中预设的常规指标进行dbscan,但对于小的eps值,例如eps<0.07,我得到了一些聚类但错过了许多点,而对于较大的值,我得到了几个较小的聚类和一个巨大的聚类。我明白这一切都取决于手头的数据,但我想知道如何以连贯和结构化的方式选择eps值以及要选择哪些指标!

我已经阅读了这个问题,那里的答案是关于10个维度的,而我有1000个 :) 我也不知道如何评估我的指标,因此如果提供更详细的说明,那会很有趣:评估您的指标!

编辑:或者有关已存在Python实现的高维数据聚类算法的其他提示。

1个回答

7
首先,如果您将minPts = 2,实际上并没有进行DBSCAN聚类,但结果会退化为单链接聚类。
建议使用minPts = 10或更高。
不幸的是,您并没有告诉我们您实际使用的距离度量!
Epsilon非常依赖于数据集和度量方式。如果不知道参数和数据集,我们无法提供帮助。您是否尝试绘制距离直方图以查看哪些值是典型的?这可能是选择此阈值的最佳启发式方法:查看距离直方图(或其样本)的分位数。
但是请注意,当您拥有适当的实现时,OPTICS会摆脱此参数。使用Xi方法提取簇时,您只需要使epsilon足够大,以不切断您感兴趣的结构(并且足够小,以获得所需的运行时间-更大的值会使速度变慢,虽然不是线性的)。然后,Xi给出了被认为是显着的距离相对增加。

我写道:“我使用sklearn中预设的常规度量标准来进行dbscan聚类。” :) 我认为这个度量标准是常规欧几里得距离!这里的一个问题是,我对聚类理论不是很熟悉,所以我真的不太明白你的观点。OPTICS似乎没有在Python中实现,所以它不是我的首选。相比低维数据,尝试对1000维数据进行聚类可能会遇到哪些问题?在绘制距离直方图并发现典型距离值之后,下一步应该怎么做或者在哪里可以阅读下一步的内容? - Ekgren
不要在1000维中使用欧几里得距离。欧几里得距离适用于低维数据,但在高维数据中没有数值对比性,使得设置阈值越来越困难(查找:“维度灾难”)。首先为您的数据集找到一个合适的相似度度量。 - Has QUIT--Anony-Mousse

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