【问题标题】:Run DBSCAN on trajectories在轨迹上运行 DBSCAN
【发布时间】:2019-03-26 08:37:21
【问题描述】:

我正在尝试在轨迹数据集上运行 DBSCAN (sklearn.cluster)。数据集是数组(点)数组(轨迹)的数组

dataset_test =

array([[[46.37017059, 30.954216  ],
    [46.39661026, 30.94524956],
    [46.46545792, 30.94379807],
    [46.47494888, 30.94352913],
    [46.53890991, 30.94241714],
    [46.54576111, 30.95412064]],

   [[46.3741684 , 30.96355057],
    [46.40998077, 30.94839096],
    [46.43452072, 30.94845963],
    [46.47270966, 30.94708061],
    [46.48934174, 30.94626999],
    [46.5067749 , 30.94859695]],

   [[46.02920151, 31.13430023],
    [46.08929825, 31.13030052],
    [46.21580124, 31.04080009],
    [46.3125    , 30.96290016],
    [46.40140152, 30.95050049],
    [46.47000122, 30.94930077]],

   ...,

   [[44.21621323, 36.12607193],
    [44.35692596, 37.2990303 ],
    [44.42433167, 37.44826889],
    [44.47311783, 37.58980179],
    [44.50473022, 37.72211075],
    [44.52869034, 37.83360672]],

   [[41.54032898, 31.87997246],
    [41.60663986, 31.83249092],
    [41.63148117, 31.81200027],
    [41.67761993, 31.77362061],
    [41.69719315, 31.75731087],
    [41.7834549 , 31.68216133]],

   [[46.3062439 , 30.72232246],
    [46.298069  , 30.74869919],
    [46.28075409, 30.79483032],
    [46.2546196 , 30.86957932],
    [46.24847794, 30.96400261],
    [46.25270081, 30.97114944]]])

我已经定义了一个距离函数。 运行时

from sklearn.cluster import DBSCAN clustering = DBSCAN(eps=3, min_samples=2, metric=hsdf_distance).fit(dataset_test)

我得到错误:

ValueError: 找到暗淡为 3 的数组。预计估计器

有什么想法吗?

【问题讨论】:

  • DBSCAN 需要一个按维度包含形状样本的数组。您正在按维度提供具有样本形状路径的数组。您是要对路径上的点进行聚类,还是要对路径进行聚类?
  • 我正在尝试对路径进行聚类。
  • 从显示的数据来看,您的数据的形状为 N,6,2,其中 N 为 6,表示上面显示的数据。对于 DBSCAN 或任何 ML 算法,数据应位于 (N, D) 中,其中 N 是样本数,D 是特征数。您可能需要根据您的问题重塑数据。
  • 我不太确定该怎么做。一些轨迹(我没有包括在上面)中有不同数量的点,这也是理想的下一步。我基本上只需要算法将每条路径视为一个点。
  • 基本上,您想使用np.reshape(data_set, (len(data_set), -1)) 重塑您的阵列。但是,这仅在每条路径上的点数相同时才有效。

标签: python scikit-learn cluster-analysis


【解决方案1】:

您可能遇到了 sklearn API 的限制。

但是,由于对自定义距离度量使用“pyfunc”方法非常慢 - 并且不可扩展 - 您可能可以改为使用距离矩阵。无论如何,您不会从索引中受益太多。然后生成 NxN 距离矩阵并使用distance="precomputed" 通常会更快。

或者,您可以使用诸如 ELKI 之类的工具,它不会对输入数据施加任何此类限制 - 它不需要是数字或数组。

特别是,当您还不知道要使用的 epsilon 和 minpts 的值时,使用预先计算的 Marie's 距离非常有用,因为您可以多次重复使用它。

距离矩阵的明显缺点是 O(n²) 运行时间和内存需求,对于索引友好的数据集,通常可以减少这些需求。

【讨论】:

  • 谢谢。问题不在于距离度量函数(尽管我最后使用了距离矩阵)。问题在于输入,例如,将点数组作为输入而不是点。理论上它不应该是算法的问题,但我猜对于特定的 sklearn 实现它是(或者我没有正确使用它)。它似乎在开始时有一个检查,当输入的维度大于 2 时停止算法。我在这个网站上找到了我定制的 DBSCAN 算法的代码,它现在可以工作了。
  • 好吧,如果你现在仍然使用距离矩阵,那么我会考虑使用 sklearn 版本(经过充分测试)而不是随机帖子中未经验证的代码(这些经常有缺陷,并且人们一次又一次地复制和粘贴这些缺陷)。
  • 然后用一维索引替换每个输入数组(如上面的六个),我可以在聚类后映射回数组?我没有意识到这可能是您在第一条评论中的建议。可以的,谢谢。
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多