2012-03-17 5 views
6

私はニューラルネットワークに関しては初心者です。私は一日中ルビー・ファンとai4rと対戦していましたが残念なことに私はそれを見せてくれることはないので、スタックオーバーフローに遭遇して知識豊かな人たちに質問しました。Rubyでのトレーニングニューラルネットワーク

私は毎日1データポイントを持っていますが、私は理解できた明確なパターンには合っていません(私はいくつかの回帰を試しました)。それでも、将来データが将来予測されるかどうかを予測する方法があるかどうかを確認するのはうれしいと思うし、神経ネットワークがその関係を表現することができる機能を生成する良い方法だと思った。

日付はDateTimeオブジェクトで、データポイントは7.68などの小数です。私はDateTimeオブジェクトを浮動小数点数に変換して、0から1の間の数値を得るために10,000,000,000で割っています。また、0から1の間の数値を取得するために10進数を1,000で割っています。変換

[ 
    ["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の両方が、一般的にサンプルの範囲の真ん中にある定数を返すことです。ここでルビー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

あなたの問題の1つは、あまりにも小さな数字を扱っているということです。希望のエラーを0.0001に設定すると、上記のトレーニングデータを正しく予測できません。あなたは、あなたの入力と出力をエンコードする他の方法を考えるべきです。年、月、日に別々の入力を与えるのはおそらく合理的でしょうか?おそらく、これらの機能(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_cat)のいずれかに1-of-cエンコードを使用することができます。 – alfa

+0

私は同じ問題を抱えています - あなたはこれを理解しましたか?私たちはニューラルネットワークに何か間違っていなければならない、私はそれを取得しない.. – Kevin

答えて

3

alfaはコメントに良い点がありますが、NNを使用する別の方法が適切かもしれません。

これは問題によって異なりますが、その日の値が部分的には の前日の値の関数であっても、これを時系列として扱うと、より良い結果が得られるかもしれません。 結果

代わりに、NNに、たとえば前の10日間の値のウィンドウの関数 として日付の値を生成するように教えてください。実際の入力スケールとして の日付を[0、1]の間に維持することもできます。これは、その日の値に有意な影響があると考えています。

関連する問題