使用 python 和 DBSCAN 对高维数据进行聚类
Posted
技术标签:
【中文标题】使用 python 和 DBSCAN 对高维数据进行聚类【英文标题】:Cluster high dimensional data with python and DBSCAN 【发布时间】:2013-04-15 11:44:26 【问题描述】:我有一个 1000 维的数据集,我正在尝试使用 Python 中的 DBSCAN 对数据进行聚类。我很难理解要选择什么指标以及为什么要选择。
有人能解释一下吗?我应该如何决定将eps
设置为哪些值?
我对更精细的数据结构感兴趣,因此将min_value
设置为 2。现在我使用为 sklearn 中的 dbscan 预设的常规指标,但对于较小的 eps 值,例如 eps
我已阅读this question 以及关于 10 个维度的答案,我有 1000 个 :) 我也不知道如何评估我的指标,所以如果有更详细的解释会很有趣:评估您的指标!
编辑:或有关使用现有 python 实现处理高维数据的其他聚类算法的提示。
【问题讨论】:
【参考方案1】:首先,使用minPts=2
,您实际上并没有进行 DBSCAN 聚类,但结果将退化为单链接聚类。
您确实应该使用minPts=10
或更高版本。
很遗憾,您没有告诉我们您实际使用的距离指标!
Epsilon 在很大程度上取决于您的数据集和指标。如果不知道参数和您的数据集,我们将无法为您提供帮助。您是否尝试过绘制距离直方图来查看哪些值是典型值?这可能是选择此阈值的最佳启发式方法:查看距离直方图(或其样本)的分位数。
但是,请注意,OPTICS 确实去掉了这个参数(至少当您有正确的实现时)。使用 Xi 方法提取集群时,您只需要足够大的 epsilon 就不会切割您感兴趣的结构(并且足够小以获得您想要的运行时间 - 越大越慢,尽管不是线性的)。然后,Xi 给出了距离的相对增加,这被认为是显着的。
【讨论】:
好吧,我写道:“我使用在 sklearn 中为 dbscan 预设的常规度量”:) 我假设该度量是常规欧几里得距离!这里的问题之一是我不精通聚类理论,所以我真的不太明白你的观点。 OPTICS 似乎没有在 python 中实现,所以它不是我的首选。与低维数据相比,尝试对 1000 维数据进行聚类时可能会遇到哪些问题?在我绘制了距离直方图并发现了典型的距离值之后,下一步应该是什么,或者我可以在哪里阅读下一步? 不要在 1000 维中使用欧几里得距离。欧几里得距离对低维数据有好处,但在高维数据中没有数值对比,使得设置阈值变得越来越困难(查阅:“维度诅咒”)。首先为您的数据集找到合适的相似性度量。以上是关于使用 python 和 DBSCAN 对高维数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章
rapidminer 和 scikit-learn 中的 DBSCAN 算法
Python:使用 scikit-learn 的 dbscan 进行字符串聚类,使用 Levenshtein 距离作为度量: