Java DBSCAN 伪代码实现

Posted

技术标签:

【中文标题】Java DBSCAN 伪代码实现【英文标题】:Java DBSCAN Pseudocode Implementation 【发布时间】:2016-02-24 02:20:05 【问题描述】:

我觉得我的逻辑是正确的,但我认为我错过了它的语法。这是我第一次使用 List 或 Vectors,但我觉得这将是实现的最佳方式,因为我必须将数据读入算法。我正在尝试按照伪代码来实现它。我已将 expandCluster 并入 DBSCAN 部分,因为我觉得这样会更好。

伪代码

这是我的实现。忽略我所有的测试打印语句。

package dbscanAlgo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;



public class dbscanAlgo
    public static List <Vector>Data;
    public static List <Clusters> Clusters;
    public static List <Boolean > Pvisited;
    public static List <Boolean > clustered;
    public static List  neighborpts;
    public static List  neighbors;
    public static List  noise;


public static void read(int String)

    String[] values;
     //System.out.println("Working Directory = " +
             // System.getProperty("user.dir"));

    Data= new ArrayList();
    Pvisited= new ArrayList();
    Double ve;

    try
    
    BufferedReader in = new BufferedReader(new FileReader("wholesale.csv"));    
        String line;
        Vector<Double> v= null;
        int j =0;
        while ((line = in.readLine()) != null)  
        
            values = line.split(",");
            v = new Vector();
            for (int i =0; i<values.length; i++)
                
                ve = Double.parseDouble(values[i]);

                v.add(ve);

                
            Data.add(v);
            //System.out.println(Data);
            Pvisited.add(false);
            //System.out.println(Pvisited.get(j));
            v =null;
            j++;
            

        in.close();

    catch( IOException ioException ) 


public static void DBSCAN (int esp, int minPts)
    int c=0;
    //System.out.println(c);
    Clusters = new <Clusters> ArrayList();
    neighborpts= new ArrayList();
    for(int i=0 ; i<Data.size(); i++)
        neighborpts.add(null);
    
    noise= new ArrayList();
    for(int i =0 ; i< Data.size(); i++)
        //System.out.println("The size of the file is: "+ Data.size());
        if(!Pvisited.get(i))
            Pvisited.set(i,true);
            neighborpts.set(i,regionQuery(Data.get(i),esp));
            //System.out.println(neighborpts);
            int size=neighborpts.size();
            //System.out.println(minPts);
            if(size< minPts)
                //System.out.println(noise);
                noise.add(i);
                //System.out.println(noise.get(i));
        else
            //System.out.println("HEy");
            Clusters.addAll(Data.get(i));
            //System.out.println(c);
            c++;
            //System.out.println("This is c" + c);
            Clusters C= new Clusters(c);
            C.setPoint(Data.get(c));
            Clusters.add(C);
            //System.out.println(size);
            //C.printC().toString();//System.out.print(C.printC());
            for(int j= 0; j<size;j++)
                //if P' is not visited
                    if(!Pvisited.get(neighborpts.indexOf(j)))
                        Pvisited.set(j,true);
                        neighbors.add(regionQuery((Vector) neighborpts.get(j),esp));
                        //System.out.println(neighbors);
                        int nSize=neighbors.size();
                        //System.out.println(nSize);
                        if (nSize>= minPts)
                            neighborpts.add(neighbors);
                        
                    
                    // if P' is not yet a member of any cluster
                    // add P' to cluster c
                    if(!clustered.get(neighborpts.indexOf(j)))
                        int x=(int) neighborpts.get(j);
                        Clusters f= Clusters.get(c);
                        ((List<Integer>) f).add(x);
                    
            
        
        
    //end of the main for loop



public static double ecluediean (Vector center, Vector L)
    Double result = (double) 0;
    for(int i =0; i< center.size(); i++)
        result +=Math.pow(((double) center.get(i))-(double)(L.get(i)), 2);
    

    return Math.sqrt(result);


public static List regionQuery(Vector p, int eps)
    List <Vector> n = new ArrayList();
    for(int i=0 ; i<Data.size(); i++)
         n.add(null);
    
    double dis=0;
    for(int i =0; i<Data.size();i++)
        dis=ecluediean(p,Data.get(i));

        if(dis<= eps)

            n.set(i,Data.get(i));
        
    
    //System.out.println(n);
    return n;


public static void main(String[]args)
    int N =3;
    read(1);

    DBSCAN(3,5);


    //System.out.println(((List<Vector>) Clusters.get(0)).get(1));
   

【问题讨论】:

您忽略了一些 java 代码样式约定,但您的语法很好。但我不认为这是你的意思;) - 你能具体说明你的问题吗? 当我运行我的代码时,它一直有效,直到我明确指出。我觉得 RegionQuery 是我搞砸的地方。我从未使用过 List 或 ArrayList 甚至 Vectors。我相信当我试图增加我或让我搞砸时。有没有这样的情况? 您知道else 属于if(size&lt; minPts) 【参考方案1】:

问题可能是您将null 值放入您的邻居列表中。不要这样做。特别是,您的size 不正确。

查看 API,并使用例如add 而不是 set

【讨论】:

以上是关于Java DBSCAN 伪代码实现的主要内容,如果未能解决你的问题,请参考以下文章

数据挖掘算法:DBSCAN算法的C++实现

无监督学习DBSCAN聚类算法原理介绍,以及代码实现

⭐K-Means和DBSCAN聚类算法——理论结合代码的实现

⭐K-Means和DBSCAN聚类算法——理论结合代码的实现

深度解读 python 实现 dbscan算法

聚类算法之DBScan(Java实现)