笑顔ライブラリのCLARANSメソッドを使用して、カスタム距離行列と私のデータをクラスタ化する方法

バヘKarapetyan:

私は、カスタムの距離行列ではなく、内蔵のアルゴリズム(すなわちユークリッド)と私のデータをクラスタ化します。そして、それを行うための明確な方法はないように思われます。

私はスマイルプロジェクトのデモを私のコードの一部を追加しようとしました。また、私のプロジェクトでテストして、それを実行しようとしました、ここでのコードの塊です:

        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = vrpJsonFromFile.readLine()) != null) {
            sb.append(line).append("\n");
        }
        JSONArray jsonArray = new JSONObject(sb.toString()).getJSONArray("services");
        Double[][] data = new Double[jsonArray.length()][2];
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject address = jsonArray.getJSONObject(i).getJSONObject("address");
            data[i][0] = Double.parseDouble(address.getString("lon"));
            data[i][1] = Double.parseDouble(address.getString("lat"));
        }

        // here
        Distance<Double[]> distance1 = (x, y) -> Math.sqrt(Math.pow(y[1]-x[1],2) + Math.pow(y[0]-x[0], 2));
        CLARANS<Double[]> clarans = new CLARANS<>(data, distance1, 3);
        System.out.println(clarans);

このコードは、ユークリッドアルゴリズム(//ここではコメントの下の行を参照)でクラスタリングCLARANSを作成します。私は自分の距離行列でそれを変更する必要がありますし、私はスマイルでそれを行うの方法があると思います。

終了しました - Anony-ムースを:

あなたは、おそらく使用することができます

Distance<Integer> d = (i,j) -> matrix[i][j];

オブジェクト番号ではなく、そのベクトルをクラスタリングします。

しかし、価値は、距離行列のクラスを事前定義、および使用が最適化されたオブジェクトのセットの表現をいうより箱入り高価使用せたその代わりELKIを見ることができるInteger上記ラムダのように。のでij箱入りの整数であり、これはパフォーマンスの多くを減らすことができ、各距離計算のための追加のメモリ間接(およびキャッシュミス)が必要です。それはまた、より良いFastCLARANSはO(k)の倍速いはずですFastPAMと同様に、アルゴリズムがあります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=214394&siteId=1