如何使用Java中的Encog SVM预测多个值

时间:2014-05-16 00:51:16

标签: java svm prediction encog

很久以前,我一直在使用库Encog进行反向传播神经网络的预测系统,现在我一直在研究支持向量机领域,我发现它比NN更有效率,我的目标是测试SVM中的预测行为,并将其与BPN进行比较。

我有两个二维数组,一个数组是INPUT,一个是IDEAL。数组的每一行由3个元素组成(实数在1/9和9之间)。 INPUT中有800行与对应的IDEAL。 TEST集还有另外2个数组,有200行。

使用BPN没有问题,我训练网络中输入层有3个神经元,中间层有50个神经元,输出层有3个神经元(5分钟收敛,误差小于0.01),测试工作正常。登记/>
另一方面,在SVM中,我遇到了一些问题。我训练网络,在3秒内收敛,似乎工作正常,但是当我测试数据时,它预测每行输出中只有1个元素,而不是BPN中的3个asi。 我不知道我做错了什么,我复制了一个简化的代码和运行的输出。

JAVA CODE

/* SVM Structure */
SVM svm = new SVM(3, true); 

/* Training Set */
BasicMLDataSet trainingSet = new BasicMLDataSet(INPUT_ARRAY, IDEAL_ARRAY);

/* Train SVM */
SVMSearchTrain train = new SVMSearchTrain(svm, trainingSet);

int epoch = 1;
do {
   train.iteration();
   System.out.println("Epoch #" + epoch + " Error:" + train.getError());
   epoch++;
} while(train.getError() > 0.01);

// Test the SVM
BasicMLDataSet testSet = new BasicMLDataSet(INPUT_TEST_ARRAY, IDEAL_TEST_ARRAY);
//Normalize/Denormalize class -> 0.11111111111111111 - 9 into 0 - 1
NormalizedField norm = new NormalizedField(NormalizationAction.Normalize, null,9,0.11111111111111111,1,0);

for(MLDataPair dataPair: testSet ) {
   final MLData output = svm.compute(dataPair.getInput());
   System.out.print("Input: [ ");           
   int elementos = (orden*(orden-1))/2;
   for(int i=0; i<elementos; i++){
       System.out.print(norm.deNormalize(dataPair.getInput().getData(i))+" ");
   }
   System.out.print("] - ");
   System.out.print("Ideal: [ ");           
   for(int i=0; i<elementos; i++){
       System.out.print(norm.deNormalize(dataPair.getIdeal().getData(i))+" ");
   }
   System.out.print("] - ");
   System.out.print("Ideal: [ "); 
   for(int i=0; i<output.size();i++){
      System.out.print(norm.deNormalize(output.getData(0))+" ");
   }
   System.out.print("]\n");         
}

Encog.getInstance().shutdown();

输出

Epoch #1 Error:0.0040788759553631255
Input: [ 0.1111111111111111 0.14285714285714285 4.0 ] - Ideal: [ 0.1111111111111111 0.16666666666666666 4.0 ] - Actual: [ -0.41164113104867955 ]
Input: [ 0.125 0.125 4.0 ] - Ideal: [ 0.125 0.5 3.0 ] - Actual: [ -0.4085939985232357 ]
Input: [ 1.0 1.0 0.25 ] - Ideal: [ 1.0 0.5 0.25 ] - Actual: [ 1.6604401446928032 ]
.
.
.
Input: [ 8.0 4.0 0.16666666666666666 ] - Ideal: [ 8.0 4.0 0.2 ] - Actual: [ 7.545661375461256 ]

非常感谢任何帮助,感谢阅读!

1 个答案:

答案 0 :(得分:1)

我认为这是一个回归问题,你是SVM中的一个数字,而不是分类。

神经网络在模型中有些独特,因为它们可以具有多个输出。当用于回归时,SVM具有单个输出。您可以使用SVM分类到多个类,但是,对于回归,您只能使用单个输出。

如果您要预测两个不同的数字,那么您将需要使用两个SVM。如果您想要分类为多个类,请在此处获取更多信息:http://www.heatonresearch.com/content/encog_svm_multiclass.html