如何在 scikit-learn 中缩放输入 DBSCAN

Posted

技术标签:

【中文标题】如何在 scikit-learn 中缩放输入 DBSCAN【英文标题】:How to scale input DBSCAN in scikit-learn 【发布时间】:2013-07-01 18:42:00 【问题描述】:

是否应该对 sklearn.clustering.DBSCAN 的输入进行预处理?

在示例 http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py 中,输入样本 X 之间的距离被计算并归一化:

D = distance.squareform(distance.pdist(X))
S = 1 - (D / np.max(D))
db = DBSCAN(eps=0.95, min_samples=10).fit(S)

在 v0.14 (http://jaquesgrobler.github.io/online-sklearn-build/auto_examples/cluster/plot_dbscan.html) 的另一个示例中,完成了一些缩放:

X = StandardScaler().fit_transform(X)
db = DBSCAN(eps=0.3, min_samples=10).fit(X)

我的代码基于后一个示例,并让印象聚类在这种缩放下效果更好。然而,这种缩放“通过去除均值和缩放到单位方差来标准化特征”。我试图找到二维集群。如果我的集群分布在一个正方形区域中 - 比如说 100x100,我认为缩放没有问题。但是,如果它们分布在矩形区域中,例如800x200 缩放“挤压”我的样本并在一维中改变它们之间的相对距离。这会恶化聚类,不是吗?还是我理解某事。错误的? 我是否需要进行一些预处理,或者我可以简单地输入我的“原始”数据吗?

【问题讨论】:

【参考方案1】:

这取决于你想做什么。

如果您对地理数据运行 DBSCAN,并且距离以米为单位,您可能不想标准化任何内容,但也要以米为单位设置您的 epsilon 阈值。

是的,尤其是非均匀缩放确实会扭曲距离。虽然不失真的缩放相当于只使用不同的 epsilon 值!

请注意,在第一个示例中,显然处理的是 similarity 而不是 distance 矩阵。 S = (1 - D / np.max(D)) 是一种将相似矩阵转换为相异矩阵的启发式算法。 Epsilon 0.95 则实际上意味着最多“观察到的最大差异的 0.05”。应该产生相同结果的替代版本是:

D = distance.squareform(distance.pdist(X))
S = np.max(D) - D
db = DBSCAN(eps=0.95 * np.max(D), min_samples=10).fit(S)

而在第二个示例中,fit(X) 实际上处理原始输入数据,而不是距离矩阵。恕我直言,这是一个丑陋的黑客,以这种方式重载方法。这很方便,但有时会导致误解甚至不正确的使用。

总的来说,我不会将 sklearn 的 DBSCAN 作为参考。整个 API 似乎很大程度上受分类驱动,而不是集群驱动。通常,您不会fit 进行聚类,您只对有监督的方法这样做。另外,sklearn 目前不使用索引进行加速,需要O(n^2) 内存(DBSCAN 通常不需要)。

一般来说,您需要确保您的距离有效。如果您的距离函数不起作用no,基于距离的算法将产生所需的结果。在某些数据集上,当您首次规范化数据时,欧几里得距离等朴素距离效果更好。在其他数据集上,您对什么是距离有很好的理解(例如地理数据。对此进行标准化显然没有意义,欧几里得距离也没有!)

【讨论】:

非常感谢您的快速回复。我喜欢识别可能随机移动的闪烁光源,这会导致高斯拖尾。此外,我还覆盖了噪音。目前我忽略了眨眼强度,只输入眨眼事件的 2d 位置。所以我认为欧几里得距离可以吗?从您的回答中,我了解到在我的情况下,我不必预处理数据(以 nm 为单位的位置)。但是 sklearn 的实现呢?它实际上是否需要相似性作为输入,或者我可以只给它位置并应用欧几里德距离测量本身吗? 如果像素在 x 和 y 上等间距,则不要归一化并使用欧几里得。至于 sklearn,您必须深入研究文档和源代码。我相信如果你给它提供原始数据,它会自己计算一个欧几里得距离矩阵。 (但不要使用索引来加速。试试 ELKI,使用索引应该会快很多)。 好的,谢谢。我会看看 ELKI 并通过 sklearn 文档深入了解自己。

以上是关于如何在 scikit-learn 中缩放输入 DBSCAN的主要内容,如果未能解决你的问题,请参考以下文章

在 scikit-learn SVM 中缩放数据

如何调整 scale scikit-learn Logistic Regression coeffs 以对非缩放数据集进行评分?

在 scikit-learn 中拟合分类器之前进行特征缩放的必要性

如何在 Scikit-Learn 中重用 LabelBinarizer 进行输入预测

如何存储缩放参数以供以后使用

如何正确使用 scikit-learn 的高斯过程进行 2D 输入、1D 输出回归?