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

Posted

技术标签:

【中文标题】如何在 Java 中使用 Encog SVM 预测多个值【英文标题】:How to predict multiple values with Encog SVM in Java 【发布时间】:2014-07-04 15:39:35 【问题描述】:

很久以前,我一直在使用 Encog 库开发反向传播神经网络中的预测系统,现在我一直在研究支持向量机领域,我发现它比 NN 效率更高,这是我的目标是测试预测在 SVM 中的表现,并将其与 BPN 进行比较。 我有两个二维数组,一个是 INPUT,一个是 IDEAL。数组的每一行由 3 个元素(1/9 到 9 之间的实数)组成。 INPUT 中有 800 行对应的 IDEAL。还有另外 2 个数组用于 200 行的测试集。 使用 BPN 没有问题,我用 3 个输入层神经元、50 个中间层神经元和 3 个输出层神经元训练网络(在 5 分钟内收敛,误差小于 0.01)并且测试工作正常。 另一方面,在 SVM 中,我遇到了一些问题。我训练网络,在 3 秒内收敛,它似乎工作正常,但是当我测试数据时,它预测每行输出中只有 1 个元素,而不是 BPN 中的 3 个 asi。 不知道自己做错了什么,我复制一个简化的代码和运行的输出。

JAVA 代码

/* 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】:

我假设这是一个回归问题,其中您是 SVM 中的一个数字,而不是一个分类。

神经网络在模型中有些独特之处在于它们可以有多个输出。 SVM 用于回归时,只有一个输出。您可以使用 SVM 对多个类进行分类,但是,对于回归,您仅限于单个输出。

如果您尝试预测两个不同的数字,那么您将需要使用两个 SVM。如果你想分类为多个类,这里​​有更多信息:http://www.heatonresearch.com/content/encog_svm_multiclass.html

【讨论】:

嘿,那个链接现在坏了,我想知道如何在多类 svm 问题上使用 encog。我应该去哪里看?谢谢!

以上是关于如何在 Java 中使用 Encog SVM 预测多个值的主要内容,如果未能解决你的问题,请参考以下文章

足球预测程序encog:不一致的预测

用于时间序列预测的 HyperNEAT 网络需要 Encog 帮助

在 java 代码中使用 libsvm 在移动设备中执行预测

如何估计 Encog 使用 Levenberg-Marquardt 算法用特定样本集训练特定网络所需的 RAM 量?

OpenCV 3.0 svm 总是预测 0 (java)

在训练 SVM 时惩罚误报