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