0

我想测量 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
    }

}
4

1 回答 1

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);
    }

}
于 2017-03-15T08:51:56.317 回答