0

apache.commons.math3.ml.clustering から DBSCANClusterer を使用しようとしています。関数 cluster はクラスターのリストを返しますが、私にとってリストのサイズは常に 0 です。何が間違っていますか? 以下は私のテストコードです:

public class ClusterTest {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        DBSCANClusterer dbscan = new DBSCANClusterer(.05, 15);
        List<DoublePoint> points = getData();
        List<Cluster<DoublePoint>> cluster = dbscan.cluster(points);
        for(Cluster<DoublePoint> p : cluster)
            System.out.println(p.getPoints().toString());                             
    }

    private static List<DoublePoint> getData() throws FileNotFoundException, IOException {
        List<DoublePoint> data = new ArrayList<DoublePoint>();      
        BufferedReader reader = new BufferedReader(new FileReader(new File("clust.txt")));
        String line;
        double[] d = new double[2];
        while ((line = reader.readLine()) != null) {
            try {                   
                String[] l = line.split("\t");
                d[0] = Double.parseDouble(l[0]);
                d[1] = Double.parseDouble(l[1]);
                data.add(new DoublePoint(d));
            } catch (Exception e) { }
        }       
        return data;
    }
}

ファイル clust.txt には、X 値と Y 値が tabulator で区切られた 2 つの列が含まれています。いくつかの異なるデータを試してみましたが、常に 0 になります。

4

1 に答える 1

1

代わりにELKIのバージョンを試してください。残念ながら、Apache Commons の数学はあまり良くありません。さまざまな小さな問題のために、コモンズ数学から離れました。ELKIは私にとってはるかにうまく機能します。

ざっと見てみると、commons-math はクラスター分析に関してはまだかなり死んでいます... MATH-917で最後に触れられました。そこにある DBSCAN コードはまだかなり非効率的です。以前のバージョンでは、DBSCAN は非推奨クラスをすべて使用していました。しかし、x 年間で 4 件のコミットを受けています。

クラスターが得られない場合は、おそらくイプシロンが小さすぎ、minPts の値が高すぎます... DBSCAN のコモンズ数学実装はすべてのノイズ オブジェクトを失います-これはおそらく取得しているものです:すべてのノイズ.

于 2014-12-07T16:47:31.897 に答える