我找到了一种在 encog 框架内从 SVM 中哄骗预测概率的方法。此方法依赖于 libSVM 的 -b 选项的等效项(请参阅http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html)
为此,请从 encog 覆盖 SVM 类。构造函数将通过 smv_parameter 对象启用概率估计(见下文)。然后,在进行计算时,调用 svm_predict_probability 方法,如下所示。
警告:下面只是一个代码片段,为了有用,您可能需要编写其他构造函数并将结果概率从下面的方法中传递出去。此片段基于 encog 版本 3.3.0。
public class MySVMProbability extends SVM {
public MySVMProbability(SVM method) {
super(method.getInputCount(), method.getSVMType(), method.getKernelType());
// Enable probability estimates
getParams().probability = 1;
}
@Override
public int classify(final MLData input) {
svm_model model = getModel();
if (model == null) {
throw new EncogError(
"Can't use the SVM yet, it has not been trained, "
+ "and no model exists.");
}
final svm_node[] formattedInput = makeSparse(input);
final double probs[] = new double[svm.svm_get_nr_class(getModel())];
final double d = svm.svm_predict_probability(model, formattedInput, probs);
/* probabilities for each class are in probs[] */
return (int) d;
}
@Override
public MLData compute(MLData input) {
svm_model model = getModel();
if (model == null) {
throw new EncogError(
"Can't use the SVM yet, it has not been trained, "
+ "and no model exists.");
}
final MLData result = new BasicMLData(1);
final svm_node[] formattedInput = makeSparse(input);
final double probs[] = new double[svm.svm_get_nr_class(getModel())];
final double d = svm.svm_predict_probability(model, formattedInput, probs);
/* probabilities for each class are in probs[] */
result.setData(0, d);
return result;
}
}