【问题标题】:Best programming language to implement DBSCAN algorithm querying a MongoDB database?实现查询 MongoDB 数据库的 DBSCAN 算法的最佳编程语言?
【发布时间】:2012-06-02 06:13:06
【问题描述】:

我必须实现 DBSCAN 算法。 假设从这个伪代码开始

DBSCAN(D, eps, MinPts)
   C = 0
   for each unvisited point P in dataset D
      mark P as visited
      NeighborPts = regionQuery(P, eps)
      if sizeof(NeighborPts) < MinPts
         mark P as NOISE
      else
         C = next cluster
         expandCluster(P, NeighborPts, C, eps, MinPts)

expandCluster(P, NeighborPts, C, eps, MinPts)
   add P to cluster C
   for each point P' in NeighborPts 
      if P' is not visited
         mark P' as visited
         NeighborPts' = regionQuery(P', eps)
         if sizeof(NeighborPts') >= MinPts
            NeighborPts = NeighborPts joined with NeighborPts'
      if P' is not yet member of any cluster
         add P' to cluster C

regionQuery(P, eps)
   return all points within P's eps-neighborhood

我的代码必须在具有 Ubuntu Linux 64 位的 Amazon EC2 实例上运行。

regionQuery 函数查询 MongoDB 数据库以获取 P 的 eps-neighborhood 内的所有点。

那么,根据您的说法,实现它以提高性能的最佳编程语言是什么? CPHPJava(我不认为)?

【问题讨论】:

  • 只是好奇; C = next cluster 是如何实现的?某处是否有未提及的集群列表?
  • 请注意,DBSCAN 拼写正确,DBSCAN 是缩写。例如 N 代表噪声。

标签: mongodb cluster-analysis dbscan


【解决方案1】:

我假设您有很多积分并且需要快速获得结果 - 否则您几乎可以使用任何东西。

这对我来说似乎是 map-reduce 工作

地图部分将是“针对每个未访问点”的循环,并且应该发出包含以下内容的数据构造 邻居,候选集群和其他任何东西。如果点被归类为噪声,它不应该发出任何声音。

集群扩展将进入 reduce 并可能完成部分 - 语言选择也将是 javascript,一切都将在 mongo 内部发生

【讨论】:

  • 真的伟大的建议 :) 谢谢
  • 一开始,所有的点都是“未访问的”。抱歉,这不适用于单个 map-reduce 步骤。另外,mapper如何构造邻居?
  • @Anony-Mousse 在 Konstantin 的建议下,我意识到 DBScan-MapReduce 的一个版本可以在 MongoDB 中完全工作。当它准备好时,我会在这里发布;)
  • @KonstantinPribluda 抱歉耽搁了,here 是:)
【解决方案2】:

Google 搜索“并行 DBSCAN”,您会发现许多文章讨论如何并行化该算法。通常,它会对算法进行相当大的更改,例如需要合并集群。

树冠预聚类可能也是 DBSCAN 的一个很好的预处理步骤。

【讨论】:

    【解决方案3】:

    我忘了回答我自己的问题。我终于实现了 DBSCAN 算法的 MapReduce 版本。 你可以找到它here (Hadoop)。

    这是其工作原理的伪代码:

    function map(P, eps, MinPts)
        if P is unvisited then
            mark P as visited
            NeighborPts = regionQuery(P, eps)
            if sizeof(NeighborPts) < MinPts then
                do nothing
            else
                mark P as clusterized
                prepare the key
                create new cluster C
                C.neighborPoints = NeighborPts
                C.points = P
                emit(key, C)
    
    function reduce(key, clusters, eps, MinPts)
        finalC is the final cluster
        for all C in clusters do
            finalC.points = finalC.points ∪ C.points
            for all P in C.neighborPoints do
                if P′ is not visited then
                    mark P′ as visited
                    NeighborPts′ = regionQuery(P′,eps)
                    if sizeof(NeighborPts′) ≥ MinPts then
                        NeighborPts = NeighborPts ∪ NeighborPts′
                    end if
                end if
                if P′ is not yet member of any cluster then
                    add P′ to cluster C
                end if
    

    【讨论】:

    • 如何在 MapReduce 上高效地使用regionQuery
    • @Anony-Mousse 感谢 MongoDB 中的地理空间索引,我只是运行一个查询
    • 这可能会影响您的表现。抱歉,但这看起来是在 MapReduce 中计算 DBSCAN 的最幼稚和性能最低的方法。如果 - 特别是对于 2D 数据 - 任何具有单主机 DBSCAN 的经典数据库都会在性能方面表现出色,我一点也不感到惊讶,抱歉。您进行基准测试了吗?
    • @Anony-Mousse 我们选择 MongoDB 并以这种方式实现系统的原因有很多。请赐教,你会怎么做?
    • 重点是:当您使用区域查询淹没数据库服务器时,不再 MapReduce了。这根本不能以 MapReduce 方式扩展,并且这些函数既不是映射,也不是 MapReduce 方案的缩减。因此,当您(ab-)使用您的 MR 引擎时,它不再是正式的 MapReduce(并且您失去了所有性能保证)。看看你的 CPU 使用率。映射器和减速器可能空闲 99%,而数据库服务器处于最大负载下。您需要使用并行方式进行范围连接;并且 不能 是 MapReduce 程序,因为它不是线性的。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多