版权声明:博主委派超级玛丽进行维权,转载请附上链接 https://blog.csdn.net/So_that/article/details/83539908
1 在编写分类器时一定要继承AbstractClassifier或者它的子类;(这也是weka识别的方式吧)。
2 重写接口buildClassifier;这个方法重要作用是:构造分类器并训练模型;
3 重写classifyinstance,这个方法功能是对单个实例进行预测。
在weka中也有很多分类器并没有重写这个方法,而是直接使用父类(AbstractClassifier)的方法;如:SVM,RandomForest等
4 重写distributeForInstance;这个方法的作用是得到置信度(其实,在classifyinstance中也是调用了该方法)。
5 重写getCapabilities方法这个方法控制是否显示分类器(也就是在weka中选择分类器是否为灰色)
接下来举一个简单的例子:
@Override
public void buildClassifier(Instances arg0) throws Exception {
// TODO Auto-generated method stub
Instances ins = null;
if (arg0.numAttributes() <= 2) {
ins = atgc1(arg0);
lib.buildClassifier(ins);
}else {
lib.buildClassifier(arg0);
}
}
public double classifyInstance(Instance instance) throws Exception {
double result = 0;
Instances ii = null;
double dist[] = new double[2];
if (instance.numAttributes() <= 2) {
ii = atgc(instance);
dist = lib.distributionForInstance(ii.instance(0));
} else {
dist = lib.distributionForInstance(instance);
}
if (dist == null) {
throw new Exception("Null distribution predicted");
}
switch (instance.classAttribute().type()) {
case Attribute.NOMINAL:
double max = 0;
int maxIndex = 0;
for (int i = 0; i < dist.length; i++) {
if (dist[i] > max) {
maxIndex = i;
max = dist[i];
}
}
if (max > 0) {
return maxIndex;
} else {
return Utils.missingValue();
}
case Attribute.NUMERIC:
case Attribute.DATE:
return dist[0];
default:
return Utils.missingValue();
}
}
我只简单的重写了buildclassify和classifyinstance方法。
另外说一点就是在导入jar包时可以不用导入weka.jar.具体加载方法可以看添加自定义分类器到weka。