用 Ruby 训练神经网络

6

当涉及神经网络时,我是一个彻头彻尾的新手。我一整天都在使用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]) # Always something random, and always the same number no matter what date I request it for

而对于ai4r:

@ai4r = Ai4r::NeuralNetwork::Backpropagation.new([1, 3, 3, 1])
1000.times do
  formatted_data.each do |data|
    @ai4r.train(data.first, data.last)
  end
end
@ai4r.eval([DateTime.now.to_f / 10000000000.0]) # A different result frmo above, but always seemingly random and the same for any requested date

我感觉自己漏掉了一些非常基础的东西。虽然这是一个比较开放式的问题,但如果有人能帮助我弄清楚我如何不正确地教导我的神经网络,我将不胜感激!


1
你面临的一个问题是你正在处理太小的数字。当我将期望误差设置为0.0001时,我甚至无法准确预测你上述提到的训练数据。你应该考虑其他编码输入和输出的方法。也许把年、月和日分别作为输入是合理的选择?也许你可以使用任何这些特征的一键式编码(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_cat)。 - alfa
我也遇到了同样的问题 - 你最终解决了吗?我们在神经网络方面肯定做错了什么,我简直搞不明白。 - Kevin
1个回答

3

阿尔法在他的评论中提出了一个好观点,使用神经网络的替代方法可能更合适。

这取决于问题,但如果当天的值部分取决于前几天的值,将其视为时间序列可能会产生更好的结果。

然后,您可以让NN学习以前10天的值作为函数来生成当天的值;您还可以将日期参数保留为[0,1]之间的实际输入比例,因为您认为它对当天的值有重大影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接