【问题标题】:How to implement multithreading on DBSCAN clustering algorithm?如何在 DBSCAN 聚类算法上实现多线程?
【发布时间】:2019-07-11 09:20:32
【问题描述】:

我已经实现了 dbscan 算法来聚类 3d 点云数据。它确实工作得很好,但唯一的问题是处理时间太长。 6000 点云几乎需要 15 秒。想实现多线程以减少处理时间。如果有人可以帮助在以下完整代码上实现多线程,将不胜感激。谢谢!

public ArrayList<List<Vector>> Run() {
    int index = 0;                      //index for each point cloud (cloud -->input data)
    List <Vector> neighbors;
    ArrayList<List<Vector>> resultList = new ArrayList<List<Vector>>();     //group of cluster --> ArrayList<list<Vector>>
    while (cloud.size() > index) {
        Vector p = cloud.get(index);
        if (!visited.contains(p)) {
            visited.add(p);
            neighbors = get_neighbors(p);
            if (neighbors.size() >= minPts) {                               //minpts = 5
                int ind = 0;
                while (neighbors.size() > ind) {
                    Vector r = neighbors.get(ind);
                    if (!visited.contains(r)) {
                        visited.add(r);
                        List<Vector> individualNeighbors = get_neighbors(r);
                        if (individualNeighbors.size() >= minPts) {
                            neighbors = merge_neighbors(
                                    neighbors,
                                    individualNeighbors);
                        }
                    }
                    ind++;
                }
                resultList.add(neighbors);
            }
        }
        index++;
    }
    return resultList;
}

private List<Vector> merge_neighbors(List<Vector>neighborPts1, List<Vector>neighborPts2) {
    for (Vector n2: neighborPts2) {
        if (!neighborPts1.contains(n2)) {
            neighborPts1.add(n2);
        }
    }
    return neighborPts1;
}

private List<Vector> get_neighbors(Vector pt){
    CopyOnWriteArrayList<Vector> pts = new  CopyOnWriteArrayList<>();
    for (Vector p: cloud) {
            if (computeDistance (pt,p)<=eps*eps) {
                pts.add(p);
        }
    }
    return pts;
}
private double computeDistance (Vector core,Vector target) {
    return Math.pow(core.getX()-target.getX(),2)
            + Math.pow(core.getY()-target.getY(),2)
            +Math.pow(core.getZ()-target.getZ(),2);
}       
}

【问题讨论】:

    标签: java multithreading cluster-analysis dbscan


    【解决方案1】:

    A) 在您的实现中存在很多优化潜力,比多线程更容易实现。所以首先优化你的代码。

    特别是,如果您将数据加载到 ELKI 等工具中(确保添加空间索引,这不是默认设置),您会发现即使仅使用单个线程,它们也运行得更快

    B) 有关于多核 DBSCAN 的出版物讨论了在处理 DBSCAN 时遇到的困难和挑战。那么请先阅读,因为整个故事都非常渴望这种问答形式:

    Patwary, M. A.、Palsetia, D.、Agrawal, A.、Liao, W. K.、Manne, F. 和 Choudhary, A.(2012 年 11 月)。一种使用不相交集数据结构的可扩展并行 DBSCAN 算法。在高性能计算、网络、存储和分析国际会议论文集(第 62 页)中。 IEEE 计算机学会出版社。

    Götz, M.、Bodenstein, C. 和 Riedel, M.(2015 年 11 月)。 HPDBSCAN:高度并行的 DBSCAN。在高性能计算环境中的机器学习研讨会论文集(第 2 页)中。 ACM。

    Welton, B.、Samanas, E. 和 Miller, B. P.(2013 年 11 月)。斯堪先生:使用基于树的 gpgpu 节点网络进行极端规模的基于密度的聚类。在 SC'13:高性能计算、网络、存储和分析国际会议论文集(第 1-11 页)。 IEEE。

    【讨论】:

    • 感谢您的回答!通过我自己的研究,我发现实现 k-d 树算法也可以显着提高其性能,并将其复杂度从 O(n^2) 降低到 O(n log n)。这看起来很神奇,不是吗?另外,我不明白为什么有些人不提任何反对这个问题。
    猜你喜欢
    • 2014-07-11
    • 2020-02-14
    • 2018-09-30
    • 1970-01-01
    • 2019-12-10
    • 2020-03-10
    • 2011-08-06
    • 2014-04-21
    • 2011-07-27
    相关资源
    最近更新 更多