如何在 OpenIMAJ 库中设置 KMColourSegmenter 的初始质心?
How to set the initial centroids of KMColourSegmenter in OpenIMAJ library?
我想测量 OpenIMAJ 库中的 KMColourSegmenter 执行聚类所需的时间。
如果我没有让初始质心固定,而不是随机的,我就无法衡量性能;因为它每次都会改变,给出不同的迭代次数,并在执行聚类的时间上有所不同。
那么如何固定初始质心,即手动设置它们?
更新:
@Jon 感谢您的回答,我正在努力实现您所说的。你能检查一下吗,尤其是 "clusters" 数组我认为这个数组初始化没有意义。如有错误请指正
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
}
}
您必须自己实施;创建 KMColourSegmenter
的子 class 并创建一个接受质心的构造函数,以及您在 KMColourSegmenter
超级 class 中选择的构造函数所需的任何参数。然后在您的构造函数中,在调用 super
之后,使用 this.kmeans.setInit()
方法设置初始化以使用您预定义的质心。您需要实现一个自定义 FloatKMeansInit
subclass,它允许您在外部设置质心,但这应该是微不足道的,因为它只需要实现一个方法。
更新以回应修改后的问题:
您不应该直接调用 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);
}
}
我想测量 OpenIMAJ 库中的 KMColourSegmenter 执行聚类所需的时间。
如果我没有让初始质心固定,而不是随机的,我就无法衡量性能;因为它每次都会改变,给出不同的迭代次数,并在执行聚类的时间上有所不同。
那么如何固定初始质心,即手动设置它们?
更新:
@Jon 感谢您的回答,我正在努力实现您所说的。你能检查一下吗,尤其是 "clusters" 数组我认为这个数组初始化没有意义。如有错误请指正
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
}
}
您必须自己实施;创建 KMColourSegmenter
的子 class 并创建一个接受质心的构造函数,以及您在 KMColourSegmenter
超级 class 中选择的构造函数所需的任何参数。然后在您的构造函数中,在调用 super
之后,使用 this.kmeans.setInit()
方法设置初始化以使用您预定义的质心。您需要实现一个自定义 FloatKMeansInit
subclass,它允许您在外部设置质心,但这应该是微不足道的,因为它只需要实现一个方法。
更新以回应修改后的问题:
您不应该直接调用 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);
}
}