2012-03-17 34 views
6

Jestem całkowicie początkującym, jeśli chodzi o sieci neuronowe. Przez cały dzień zmagałem się z rubin-fann i ai4r i niestety nie mam nic do pokazania, więc pomyślałem, że pójdę na Stack Overflow i zapytam tutaj kompetentnych ludzi.Szkolenia sieci neuronowej w Ruby

Mam zestaw próbek - każdy dzień ma jeden punkt danych, ale nie pasuje do żadnego jasnego wzoru, który udało mi się wymyślić (próbowałem regresji para). Mimo to, myślę, że byłoby fajnie sprawdzić, czy istnieje jakiś sposób przewidywania danych idących w przyszłość od samego początku i myślałem, że sieć neuronowa byłaby dobrym sposobem na wygenerowanie funkcji, która mogłaby wyrazić nadzieję na wyrażenie tego związku. .

Daty są obiektami DateTime, a punkty danych są liczbami dziesiętnymi, jak 7,68. Konwertowałem obiekty DateTime na pływające, a następnie dzieląc je przez 10.000.000.000, aby uzyskać liczbę od 0 do 1, i dzielę liczby dziesiętne przez 1000, aby uzyskać także liczbę od 0 do 1. Mam ponad tysiąc próbki ... oto co krótki fragment wygląda tak:

[ 
    ["2012-03-15", "7.68"], 
    ["2012-03-14", "4.221"], 
    ["2012-03-13", "12.212"], 
    ["2012-03-12", "42.1"] 
] 

które po transformacji wygląda następująco:

[ 
    [0.13317696, 0.000768], 
    [0.13316832, 0.0004221], 
    [0.13315968, 0.0012212], 
    [0.13315104, 0.00421] 
] 

I niby życzymy ta transformacja nie były konieczne, ale to dygresja. Problem polega na tym, że zarówno ai4r, jak i ruby-fann zwracają jedną stałą liczbę, zwykle coś w środku zakresu próbek, kiedy je uruchamiam. Oto kod dla 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 

I 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 

czuję się jakbym brakuje czegoś naprawdę podstawowe tutaj. Wiem, że jest to raczej otwarte pytanie, ale jeśli ktoś mógłby mi pomóc dowiedzieć się, jak niewłaściwie uczę moich sieci neuronowych, naprawdę bym to docenił!

+1

Jednym z twoich problemów jest to, że masz do czynienia ze zbyt małymi liczbami. Kiedy ustawiam pożądany błąd na 0,0001, nie mogę nawet poprawnie przewidzieć danych treningowych, o których wspomniałeś powyżej. Powinieneś wymyślić jakikolwiek inny sposób kodowania wejścia i wyjścia. Czy rozsądnie jest podać rok, miesiąc i dzień osobnymi danymi wejściowymi? Być może możesz użyć kodowania 1-c-cowego dla dowolnej z tych funkcji (ftp://ftp.sas.com/pub/neural/FAQ2.html#A_cat). – alfa

+0

Mam ten sam problem - czy kiedykolwiek to zrozumiałeś? Musimy zrobić coś złego z siecią neuronową, nie rozumiem ... – Kevin

Odpowiedz

3

alfa ma dobry punkt w swoim komentarzu, alternatywne sposoby użycia NN mogą być bardziej odpowiednie.

To zależy od problemu, ale jeśli wartość dnia jest nawet częściowo funkcją wartości z poprzednich dni, potraktowanie tego jako szeregu czasowego może dać lepsze wyniki .

W takim przypadku użytkownik uczyłby NN, aby wygenerował wartość dnia jako funkcję o wartości, powiedzmy, poprzednich dziesięciu dniach; możesz także zachować wartość parametru daty jako rzeczywistą skalę wejściową między wartościami [0, 1], ponieważ uważasz, że ma ona znaczący wpływ na wartość dnia w dniu .

Powiązane problemy