2017-03-15 10 views
0

OpenIMAJライブラリのKMColourSegmenterがクラスタリングを実行する時間を測定したいと思います。OpenIMAJライブラリのKMColourSegmenterの初期重心を設定する方法は?

ランダムにではなく、最初の重心を固定しないと、測定値をパフォーマンスにすることはできません。これは、毎回変更され、異なる回数の反復を行い、クラスタリングを実行するために時間が変化するためです。

最初のセントロイドを固定する、つまり手動で設定する方法はありますか?

更新:答えてくれてありがとう@ジョン

、私はあなたが言ったことを実現しようとしています。あなたはそれを確認できますか、特に私はこの配列は初期化する意味がないと思う "クラスタ"配列。私が間違っているなら、私を修正してください。

public class MyFloatKMeansInit extends FloatKMeansInit{ 

    @Override 
    public void initKMeans(DataSource<float[]> bds, float[][] clusters) throws IOException { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < bds.size(); i++) { 
      for (int j = 0; j < bds.getData(i).length; j++) { 
       clusters[i][j]=bds.getData(i)[j]; 
      } 
     } 
    } 
} 

public class MyKMColourSegmenter extends KMColourSegmenter{ 

    public MyKMColourSegmenter(FloatArrayBackedDataSource bds, ColourSpace colourSpace, int K) throws IOException { 
     super(colourSpace, K); 
     MyFloatKMeansInit myFloatKMeansInit = new MyFloatKMeansInit(); 
     float[][] clusters = new float[K][];//#######I think there is something wrong here 
     myFloatKMeansInit.initKMeans(bds, clusters); 
     this.kmeans.setInit(myFloatKMeansInit); 
     // TODO Auto-generated constructor stub 
    } 

} 

答えて

0

これを自分で実装する必要があります。 KMColourSegmenterのサブクラスを作成し、重心を取り入れるコンストラクタ、およびKMColourSegmenterスーパークラスのコンストラクタの選択に必要なパラメータを作成します。その後、コンストラクタでsuperを呼び出した後、this.kmeans.setInit()メソッドを使用して、定義済みセントロイドを使用するように初期化を設定します。重心を外部に設定できるカスタムのFloatKMeansInitサブクラスを実装する必要がありますが、単一のメソッドの実装だけが必要なので、これは簡単です。改正質問に対して

更新:

あなたが直接initKMeansを呼び出すべきではありません。あなたがアルゴリズムを実行すると場面の裏側で起こります。また、セントロイド配列には、bdsからではなく、最初のセントロイドのセントロイドを設定する必要があります。たとえば(未テスト):

public class MyFloatKMeansInit extends FloatKMeansInit{ 
    private float [][] mycentroids; 

    public MyFloatKMeansInit(float [][] mycentroids) {//modifying data type here 
     this.mycentroids = mycentroids; 
    } 

    @Override 
    public void initKMeans(DataSource<float[]> bds, float[][] clusters) throws IOException { 
     for (int i = 0; i < mycentroids.length; i++) { 
      for (int j = 0; j < mycentroids[i].length; j++) { 
       clusters[i][j]=mycentroids[i][j]; //could use arraycopy instead 
      } 
     } 
    } 
} 

public class MyKMColourSegmenter extends KMColourSegmenter{ 

    public MyKMColourSegmenter(ColourSpace colourSpace, float[][] mycentroids) throws IOException { 
     super(colourSpace, mycentroids.length); 
     MyFloatKMeansInit myFloatKMeansInit = new MyFloatKMeansInit(mycentroids); 
     this.kmeans.setInit(myFloatKMeansInit); 
    } 

} 
+0

私の投稿に行った更新を確認できますか? –

+0

ありがとう@Jonは働いた。アルゴリズムが収束するまでに必要な繰り返しの回数を知る方法はありますか? –

+0

https://github.com/openimaj/openimaj/issues/121 – Jon

関連する問題