我对神经网络完全是个新手。我今天一直在与ruby-fann和ai4r这两个库搏斗,但不幸的是我没有任何成果,所以我想来Stack Overflow问问这里的专家们。
我有一组样本——每一天有一个数据点,但它们似乎不符合我能识别出的任何明显模式(我尝试了几种回归分析)。尽管如此,我认为如果能够预测未来数据仅凭日期将会非常有趣,我认为神经网络是一个生成能够表达这种关系的函数的好方法。
日期是DateTime对象,数据点是小数,例如7.68。我已经将DateTime对象转换为浮点数,然后除以10,000,000,000以得到0到1之间的数字,我还将小数除以1,000以同样得到0到1之间的数字。我有超过一千个样本…这里是一个简短摘录的样貌:
[ ["2012-03-15", "7.68"], ["2012-03-14", "4.221"], ["2012-03-13", "12.212"], ["2012-03-12", "42.1"]]
转换后看起来像这样:
[ [0.13317696, 0.000768], [0.13316832, 0.0004221], [0.13315968, 0.0012212], [0.13315104, 0.00421]]
我希望这种转换不是必要的,但这是题外话。问题是,当我运行ai4r和ruby-fann时,它们都返回一个常数,通常是样本范围中的中间值。这是ruby-fann的代码:
@fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 3], :num_outputs=>1)training_data = RubyFann::TrainData.new(:inputs => formatted_data.collect{|d| [d.first]}, :desired_outputs => formatted_data.collect{|d| [d.last]})@fann.train_on_data(training_data, 1000, 1, 0.0001)@fann.run([DateTime.now.to_f / 10000000000.0]) # 总是返回一个随机数,并且无论我请求什么日期,返回的数总是相同的
而对于ai4r:
@ai4r = Ai4r::NeuralNetwork::Backpropagation.new([1, 3, 3, 1])1000.times do formatted_data.each do |data| @ai4r.train(data.first, data.last) endend@ai4r.eval([DateTime.now.to_f / 10000000000.0]) # 与上面不同,但似乎总是随机的,并且对于任何请求的日期都是相同的
我觉得我在这里错过了什么非常基本的东西。我知道这是一个相当开放的问题,但如果有人能帮助我弄清楚我如何错误地训练我的神经网络,我将非常感激!
回答:
alfa在评论中提出了一个很好的观点,可能使用神经网络的其他方式会更合适。
这取决于问题,但如果当天的值部分是前几天值的函数,将其视为时间序列可能会产生更好的结果。
然后,你可以训练神经网络生成当天的值作为一个窗口的函数,例如前十天的值;你也可以保留日期参数作为一个真实的输入,缩放到[0, 1]之间,因为你认为它对当天的值有显著影响。