我正在Encog3(使用libsvm
库的Java版本)中训练SVM,它目前具有3个分类类别。每个类别有9到13个输入,每个输入有大约14个数据点。
我正在用C = 0.1和Gamma = 1.0训练SVM。我曾经没有遇到任何错误,但是现在我没有得到ArrayIndexOutOfBoundsException
就无法训练它。堆栈跟踪如下:
java.lang.ArrayIndexOutOfBoundsException: -1
at org.encog.mathutil.libsvm.Cache.get_data(svm.java:129)
at org.encog.mathutil.libsvm.SVC_Q.get_Q(svm.java:1249)
at org.encog.mathutil.libsvm.Solver.Solve(svm.java:571)
at org.encog.mathutil.libsvm.svm.solve_c_svc(svm.java:1427)
at org.encog.mathutil.libsvm.svm.svm_train_one(svm.java:1604)
at org.encog.mathutil.libsvm.svm.svm_train(svm.java:2141)
at org.encog.ml.svm.training.SVMTrain.iteration(SVMTrain.java:210)
at net.PACKAGE.MY_PROJECT.PROJECT.utils.Analyzer.train(Analyzer.java:183)
at net.PACKAGE.MY_PROJECT.PROJECT.ANN.run(ANN.java:77)
原始数据是一个时间序列,其中包含每个间隔的数据,例如{ {5, 3, 2} {2 3 5} {5 7 8} }
,然后将每一列的数据转换为一组平均值/标准差:{5 1.53 5 1.53 10 1.53}
,然后将其输入到SVM中进行训练。
我试图规范化数据,但是它给了我同样的例外。对它进行非规范化后,SVM可以很好地训练。然后,我无故发现它开始抛出此异常。我目前正在非标准化数据集上对其进行测试,但最糟糕的是,这将导致分类不准确,并且不会引发异常。
我经过了跟踪,发现罪魁祸首是svm.java
的{{1}}中的变量,其索引为Cache.get_data
。我调查了调用它的代码,索引是某种迭代步骤的最小值。如果未找到最小值,则返回-1
作为最小值。因此,如果要迭代的数组的大小为1(最大值仍然可以)或最大值与最小值相同,或者存在一些我不知道的逻辑错误,则会出现错误。 >
我在-1
文件中添加了一些调试代码,因此某些行号可能有点不准确。据我所知,svm.java
函数在get_Q
的第563行被调用,该代码从何处开始变了。 here提供了svm.java
的完整代码。
如果有人能弄清导致此错误的原因以及如何纠正该错误,将不胜感激。