gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:26:14 26 4
gpt4 key购买 nike

应该对 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 缩放“挤压”我的样本并改变它们在一维上的相对距离。这会恶化聚类,不是吗?或者我理解某事。错误的?我是否需要应用一些预处理,或者我可以简单地输入我的“原始”数据?

最佳答案

这取决于您想要做什么。

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

是的,特别是非均匀缩放确实会扭曲距离。而非扭曲缩放相当于仅使用不同的 epsilon 值!

请注意,在第一个示例中,显然处理的是相似性而不是距离矩阵。 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 似乎很大程度上是由分类驱动的,而不是由聚类驱动的。通常,您不会拟合聚类,而仅针对监督方法进行聚类。另外,sklearn 目前不使用索引进行加速,并且需要 O(n^2) 内存(DBSCAN 通常不需要)。

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

关于scikit-learn - 如何在 scikit-learn 中缩放输入 DBSCAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com