Una de las aplicaciones de las redes neuronales es el ajuste de datos. Para ver cómo lo hace, comenzamos creando un conjunto de datos cualquiera. Por ejemplo, nos valdría una curva hecha como se ve en el siguiente código.
import neurolab as nl
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.arange(0.0, 10.0, 0.1)
secuencia = np.sin(x-1)*0.5+0.1*np.sin(5*x) # Nuestra secuencia de valores
Visualizamos la gráfica mediante algunos comandos de matplotlib.
plt.plot(x, secuencia)
plt.xlabel('x')
plt.ylabel('valores')
plt.title('Secuencia de valores')
plt.grid(True)
plt.show()
longitud_muestra = 10 #Elegido arbitrariamente
muestras_vector = []
etiquetas_vector = []
for i in range(len(secuencia)-longitud_muestra):
muestras_vector.append(secuencia[i:i+longitud_muestra])
etiquetas_vector.append([secuencia[i+longitud_muestra]])
print(muestras_vector[0])
print(etiquetas_vector[0])
print("----------------------")
print(muestras_vector[1])
print(etiquetas_vector[1])
print("----------------------")
print(muestras_vector[2])
print(etiquetas_vector[2])
intervalos = [[-1.0, 1.0] for i in range(longitud_muestra)] #intervalos de valores de entrada
Definimos la red con dos capas
red = nl.net.newff(intervalos,[5, 1],[nl.trans.TanSig(), nl.trans.TanSig()])
Comenzamos el entrenamiento
error = red.train(muestras_vector, etiquetas_vector, epochs=500, show=10, goal=0.00001)
Veremos ahora qué tal se ajusta nuestra red a los datos originales
resultados = []
for i in range(longitud_muestra):
resultados.append(muestras_vector[0][i])
for i in range(len(secuencia)-longitud_muestra):
resultados.append(red.sim([resultados[i:i+longitud_muestra]])[0][0])
etiquetas_vector = ([[0]]*longitud_muestra) + etiquetas_vector
plt.plot(resultados, 'r-', etiquetas_vector, 'g-')
plt.xlabel('Longitud de muestra')
plt.ylabel('Valores')
plt.title('Resultados')
plt.grid(True)
plt.show()