【问题标题】:How to set the initial centroids of KMColourSegmenter in OpenIMAJ library?如何在 OpenIMAJ 库中设置 KMColourSegmenter 的初始质心?
【发布时间】:2017-08-05 21:08:17
【问题描述】:

我想测量 OpenIMAJ 库中的 KMColourSegmenter 执行聚类所需的时间。

如果我没有使初始质心固定,而不是随机,我就无法衡量性能;因为它每次都会改变,给出不同的迭代次数,并且执行聚类的时间也会不同。

那么如何使初始质心固定,即手动设置它们?

更新:

@Jon 感谢您的回答,我正在努力实现您所说的。你能检查一下吗,尤其是“集群”数组,我认为这个数组初始化没有意义。如果我错了,请纠正我。

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
    }

}

【问题讨论】:

    标签: java image-processing k-means image-segmentation openimaj


    【解决方案1】:

    您必须自己实现;创建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);
        }
    
    }
    

    【讨论】:

    • 感谢@Jon 的工作。有没有办法知道算法需要多少次迭代才能收敛?
    • 谢谢,我去看看。
    猜你喜欢
    • 2017-09-14
    • 2019-05-14
    • 2015-09-17
    • 2017-02-09
    • 2019-03-04
    • 2016-11-16
    • 2016-06-27
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多