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

Posted

技术标签:

【中文标题】用于时间序列预测的 HyperNEAT 网络需要 Encog 帮助【英文标题】:HyperNEAT network for Time Series forecasting with Encog help needed 【发布时间】:2015-02-12 15:52:54 【问题描述】:

我正在使用 Encog AI 框架通过 HyperNEAT 网络进行时间序列预测。

这是我用来创建网络的简单代码。

                Substrate substrate = SubstrateFactory.factorSandwichSubstrate(columns*windowSize,days);                    
                CalculateScore score = new TrainingSetScore(trainingSet);
                NEATPopulation pop = new NEATPopulation(substrate, 500);
                pop.setActivationCycles(4);
                pop.reset();
                EvolutionaryAlgorithm train = NEATUtil.constructNEATTrainer(pop, score);
                OriginalNEATSpeciation speciation = new OriginalNEATSpeciation();
                speciation.setCompatibilityThreshold(1);
                train.setSpeciation(speciation = new OriginalNEATSpeciation());

                System.out.println("Is HyperNEAT "+pop.isHyperNEAT());
                // train the neural network

                int epoch = 1;

                do 
                    train.iteration();
                    if(writeOnStdOut)
                        System.out.println("Epoch #" + epoch + " Error:" + train.getError());
                    epoch++;
                    if(Math.abs(train.getError()-previousError)<0.000000001) iterationWithoutImprovement++; else iterationWithoutImprovement = 0;
                    previousError = train.getError();
                    Date dtemp = new Date();
                 while(train.getError() > maximumAcceptedErrorTreshold && epoch < maxIterations && iterationWithoutImprovement < maxiter);

                NEATGenome genome = (NEATGenome) pop.getBestGenome();
                HyperNEATCODEC codec = new HyperNEATCODEC();
                 network2 = (NEATNetwork) codec.decode(pop, substrate, genome);     

取自 Box 示例 https://github.com/encog/encog-java-examples/tree/master/src/main/java/org/encog/examples/neural/neat/boxes

其中 columns 是特征的数量,windowSize 是预测未来值所需的前几天数(在我的示例中,windowSize 是 1)。

我得到了这个例外:

Exception in thread "pool-2-thread-416" java.lang.ArrayIndexOutOfBoundsException at org.encog.util.EngineArray.arrayCopy(EngineArray.java:107) at org.encog.neural.neat.NEATNetwork.compute(NEATNetwork.java:194) at org.encog.util.error.CalculateRegressionError.calculateError(CalculateRegressionError.java:46) at org.encog.neural.networks.training.TrainingSetScore.calculateScore(TrainingSetScore.java:61) at org.encog.ml.ea.score.parallel.ParallelScoreTask.run(ParallelScoreTask.java:83) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

似乎处理线程有问题。 有人可以帮我解决这个问题吗? 我的第二个问题是:如何在 Encog 中使用反向传播训练 NEAT 网络?

【问题讨论】:

【参考方案1】:

关于数组越界异常。我查看了那条线,唯一可能导致它的原因是您发送的输入向量具有比输入神经元更多的元素。我会确保您将神经网络定义为与最终数据相同的输入维度。

至于反向传播和 NEAT/HyperNEAT,这不是这些网络被设计用来训练的方式。至少 Kenneth Stanley 的实现不起作用。这都是基因训练。可能有一种方法可以通过反向传播微调 NEAT 网络,但我还没有尝试过。

【讨论】:

好的,我已经用这个Substrate substrate = SubstrateFactory.factorSandwichSubstrate(columns*windowSize,days); 修改了之前的代码,但它仍然无法正常工作并抛出相同的异常。 Days 是要预测的未来天数。【参考方案2】:

我已经声明了

Substrate substrate = SubstrateFactory.factorSandwichSubstrate((int)Math.sqrt(NDataSetFeatures),1);

最后一个参数是类,这对我有用。

【讨论】:

以上是关于用于时间序列预测的 HyperNEAT 网络需要 Encog 帮助的主要内容,如果未能解决你的问题,请参考以下文章

用于温度时间序列预测的 LSTM 神经网络

预测 - 用于回归的神经网络预测相同的值

R中的LSTM网络用于时间序列预测

用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan

LSTM神经网络用于时间序列预测

.NET 神经网络或 AI 用于未来预测