2012-03-17 15 views
6

Soy un principiante total en lo que respecta a redes neuronales. He estado luchando con ruby-fann y ai4r todo el día y, lamentablemente, no tengo nada que mostrar, así que pensé en entrar en Stack Overflow y preguntar a la gente conocedora aquí.Formación de red neuronal en Ruby

Tengo un conjunto de muestras: cada día tiene un punto de datos, pero no se ajustan a ningún patrón claro que haya podido deducir (intenté un par de regresiones). Aún así, creo que sería bueno ver si había alguna manera de predecir los datos que entrarán en el futuro solo a partir de la fecha, y pensé que una red neuronal sería una buena forma de generar una función que podría expresar esa relación. .

Las fechas son objetos DateTime y los puntos de datos son números decimales, como 7.68. He estado convirtiendo los objetos DateTime en flotantes y luego dividiéndolos por 10,000,000,000 para obtener un número entre 0 y 1, y he dividido los números decimales por 1,000 para obtener también un número entre 0 y 1. Tengo más de mil muestras ... esto es lo que se ve como un breve extracto:

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

lo cual, transformada se ve así:

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

que tipo de deseo esta transformación no eran necesarias, pero estoy divagando. El problema es que tanto ai4r como ruby-fann devuelven un número constante, generalmente algo en el medio del rango de las muestras, cuando los ejecuto. Aquí está el código de rubí 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 

Y para 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 

siento que me falta algo realmente básico aquí. Sé que esta es una pregunta bastante abierta, pero si alguien pudiera ayudarme a descubrir cómo estoy enseñando incorrectamente mis redes neuronales, ¡realmente lo agradecería!

+1

Uno de sus problemas es que se trata de números demasiado pequeños. Cuando configuro el error deseado en 0.0001, ni siquiera puedo predecir los datos de entrenamiento que mencionaste anteriormente correctamente. Debería pensar en otra forma de codificar su entrada y salida. ¿Es razonable dar un año, mes y día por separado? Tal vez pueda usar la codificación 1-de-c para cualquiera de estas características (ftp://ftp.sas.com/pub/neural/FAQ2.html#A_cat). – alfa

+0

Estoy teniendo el mismo problema, ¿alguna vez entendiste esto? Debemos estar haciendo algo mal con la red neuronal, no lo entiendo ... – Kevin

Respuesta

3

alfa tiene un buen punto en su comentario, una forma alternativa de usar el NN podría ser más apropiada.

Depende del problema, pero si el valor del día es incluso parcialmente una función de los valores de días anteriores, tratar esto como una serie temporal podría arrojar mejores resultados .

En su lugar, le enseñaría al NN a producir el valor del día como una función de una ventana de, por ejemplo, los valores de los diez días anteriores; también puede mantener el parámetro de fecha como una escala de entrada real entre [0, 1] ya que cree que tiene un efecto significativo en el valor del día.

Cuestiones relacionadas