-1

JavaでDBSCANを実装しています。ここ (ウィキペディア) で与えられたアルゴリズムに従いました。と思ったのですが、なぜかクラスターが1つしか形成されません。Javaコードは次のようになります

ArrayList<ArrayList<Node>> dbcluster = new ArrayList<>();
ArrayList<Node> points; // this contains my data assume
int min =10, esp =50;
int clustcount =0;
for(int i=0;i<points.size();i++){               
    Node tempdb = points.get(i);                
    if(tempdb.visited==false){
        tempdb.visited=true;
        ArrayList<Node> myNeighbors = getNeigbhors(tempdb,points, esp);
        if(myNeighbors.size() < min){
            tempdb.noise = true;
        }else{
            //ArrayList<Node> tempclust = new ArrayList<>();
            dbcluster.add(new ArrayList<Node>());
            expandCluster(tempdb,points,myNeighbors,dbcluster,esp,min,clustcount);
            clustcount++;
        }
}

public static ArrayList<Node> getNeigbhors(Node p ,ArrayList<Node> data,int  esp){
        ArrayList<Node> tempReturn =  new ArrayList<>();
        for(int i=0;i<data.size();i++){
            Node temptemp = data.get(i);            
            if(p.x != temptemp.x && p.y !=temptemp.y){
                double distance =Math.sqrt(((p.x - temptemp.x)*(p.x - temptemp.x))+((p.y - temptemp.y)*(p.y - temptemp.y)));
                if(distance <=esp){
                    tempReturn.add(temptemp);
                }
            }
        }       
        return tempReturn;      
}

public static void expandCluster(Node p, ArrayList<Node> data, ArrayList<Node> N, ArrayList<ArrayList<Node>> allCluster,int esp, int min,int clustcount){

    //ArrayList<Node> tempSmallClust = new ArrayList<>();
    //tempSmallClust.add(p);
    allCluster.get(clustcount).add(p);
    for(int i=0;i<N.size();i++){
        Node tempP = N.get(i);
        if(tempP.visited == false){
            tempP.visited=true;
            ArrayList<Node> tempNewNeighbors = new ArrayList<>();
            tempNewNeighbors = getNeigbhors(tempP, data, esp);
            if(tempNewNeighbors.size() >= min){
                ArrayList<Node> tempN=new ArrayList<>();
                tempN=mergeNeighbors(N, tempNewNeighbors);
                N = new ArrayList<>();
                N=tempN;                    
            }
        }
        if(!checkInCluster(tempP,allCluster)) {
            allCluster.get(clustcount).add(tempP);
        }
     }          
    //return tempSmallClust;
}

public static boolean checkInCluster(Node p, ArrayList<ArrayList<Node>> allCluster){

    for(int i=0;i<allCluster.size();i++){           
        ArrayList<Node> tempList = allCluster.get(i);
        if(tempList.contains(p)){                
            return true;
        }           
    }
    return false;
}

public static ArrayList<Node> mergeNeighbors(ArrayList<Node> N,ArrayList<Node> NewN){
    ArrayList<Node> tmpR = N;
    for(int i=0;i<NewN.size();i++){
        if(!N.contains(NewN.get(i))){
            tmpR.add(NewN.get(i));
        }
    }       
    return tmpR;
}

ノード クラスは単純で、int x int y とブール値のノイズと訪問済みです。データはここで提供されますここにデータ

4

1 に答える 1

1

あなたのデータは均一に分散されています。

このデータセットにはクラスターはありません。

IMHO すべてを 1 つのクラスターに入れること (eps が高すぎて minpts が低すぎる場合) は正しいか、すべてをノイズに入れること (eps と minpts が適切に設定されている場合) は正しいです。

実装エラーではないかもしれませんが、データが適切ではありません。

于 2014-10-26T10:15:27.797 に答える