Обучение нейронной сети в Ruby - PullRequest
6 голосов
/ 17 марта 2012

Я абсолютный новичок, когда дело доходит до нейронных сетей.Я боролся с ruby-fann и ai4r весь день, и, к сожалению, мне нечего показать, поэтому я решил, что зайду в Stack Overflow и спрошу здесь знающих людей.

У менянабор выборок - каждый день имеет одну точку данных, но они не соответствуют какой-либо четкой схеме, которую я смог выяснить (я попробовал пару регрессий).Тем не менее, я думаю, что было бы неплохо увидеть, есть ли какой-либо способ предсказать, что данные поступят в будущее, начиная с даты, и я подумал, что нейронная сеть будет хорошим способом создать функцию, которая может надеяться выразить эту связь.

Даты - это объекты DateTime, а точки данных - десятичные числа, например 7,68.Я преобразовал объекты DateTime в числа с плавающей точкой, а затем разделил на 10 000 000 000, чтобы получить число от 0 до 1, и я разделил десятичные числа на 1000, чтобы также получить число от 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 Ответ

3 голосов
/ 03 апреля 2012

Альфа имеет хороший комментарий в своем комментарии, альтернативные способы использования NN могут быть более подходящими.

Это зависит от проблемы, но если значение дня хотя бы частично является функцией предыдущих дней'значения, рассматривая это как временной ряд, могут дать лучшие результаты.

Вместо этого вы бы научили NN генерировать значение дня как функцию окна, скажем, значений предыдущих десяти дней;Вы также можете сохранить параметр даты в качестве реальной шкалы ввода между [0, 1], так как считаете, что он существенно влияет на значение дня.

...