【问题标题】:Higher Dimensional DBSCAN In Sklearn [duplicate]Sklearn中的高维DBSCAN [重复]
【发布时间】:2019-07-16 22:55:21
【问题描述】:

sklearn 中是否有允许通过 DBSCAN 算法进行更高维聚类的方法?就我而言,我想对 3 维和 4 维数据进行聚类。我检查了一些源代码,发现 DBSCAN 类调用了 sklearn utils 包中的 check_array 函数,该包包含一个参数 allow_nd。默认情况下它被设置为 false 并且似乎没有办法通过 DBSCAN 类构造函数来设置它。有什么想法/想法还是我错过了一些简单的东西?谢谢!

编辑:最少的代码(我使用的是 sklearn 版本 0.20.2)。

import numpy as np
from sklearn.cluster import DBSCAN

data = np.random.rand(128, 416, 1)
db = DBSCAN()
db.fit_predict(data)

这是一个示例,但它也适用于我加载的任何真实数据。这是返回的确切错误:

ValueError: Found array with dim 3. Estimator expected <= 2.

这是上面ndarray的shape和ndim。

(128, 416, 1)
3

【问题讨论】:

  • sklearnDBSCAN对开箱维数没有限制。
  • check_array 方法中有一个名为 allow_nd 的硬检查,默认设置为 False。当我尝试传递超过 2 个维度的 np.ndarray 时,我收到一个特别是维度的错误。
  • 您的数据的.shape 是什么?你的意思是对张量进行聚类?距离是多少?另外:你有来源 - 你可以删除检查,看看是否适合你......
  • 我已经对随机 numpy 生成的数据和合法的图像数据进行了尝试。我会将最少的代码添加到原始帖子中。
  • 既然你的最后一个维度是 1,你为什么不能把它改造成(128, 416)在整形不等价的情况下,您使用什么距离

标签: python scikit-learn cluster-analysis dbscan


【解决方案1】:

DBSCAN确实没有数据维度的限制。

证明:

from sklearn.cluster import DBSCAN
import numpy as np
np.random.seed(42)
X = np.random.randn(100).reshape((10,10))
clustering = DBSCAN(eps=3, min_samples=2).fit(X)
clustering.labels_
array([ 0,  0,  0, -1,  0, -1, -1, -1,  0,  0])

您真正的问题是您试图将 3d 维图像数据提供给 2d 算法。

在您的情况下,您有几个行动方案:

  1. 将您的数据转换为二维(查看thisthis
  2. 通过正确定义问题的根源和您想要的内容重新打开您的问题。
  3. allow_nd=True重新编译源代码试试运气

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2018-01-08
    • 2017-01-13
    • 2015-09-10
    • 2019-04-11
    • 2020-09-24
    • 2014-12-02
    • 2018-02-26
    • 2013-04-15
    相关资源
    最近更新 更多