-
Vamos a crear una regresión no lineal con los datos que se muestran aquí en los puntos azules.
-
Vamos a crear esta correlación roja y ajustar los parámetros de esta expresión no lineal.
-
Comenzamos con estos datos: tenemos xm y ym.
-
Queremos crear un nuevo modelo. Desde GEKKO importamos GEKKO y creamos un nuevo modelo con m = GEKKO().
-
Ahí está nuestro nuevo modelo GEKKO.
-
Queremos configurar nuestra expresión.
-
La correlación que queremos ajustar es:
-
y = 0.1 * exp(a * x)
-
Esta es nuestra correlación no lineal que queremos ajustar.
-
Vamos a mantenerlo simple con un solo parámetro, pero podrías expandir esto a múltiples parámetros o ecuaciones si lo deseas.
-
x será igual a nuestros datos xm.
-
Creamos un parámetro a con un valor inicial, por ejemplo, 0.1, y permitimos que el optimizador lo ajuste.
-
Para nuestra salida, usamos una variable controlada en GEKKO con los valores de ym.
-
Indicamos que use las mediciones estableciendo status = 1.
-
Esto configura nuestros parámetros y variables con los datos en nuestro modelo.
-
Ahora configuramos nuestra ecuación:
-
y = 0.1 * exp(a * x)
-
Usamos m.exp() para que el solucionador basado en gradientes pueda calcular derivadas exactas de primer y segundo orden.
-
Ahora, establecemos la opción IMODE = 2 para indicar que estamos utilizando datos en estado estacionario.
-
Si deseas más información sobre los diferentes modos, te recomiendo consultar la documentación de GEKKO.
-
Estamos realizando una actualización de parámetros del modelo o regresión con datos en estado estacionario, por lo que IMODE = 2.
-
Continuamos con esto.
-
Ahora, resolvemos el modelo con m.solve(disp=False) para no mostrar la salida del solucionador.
-
Finalmente, imprimimos el valor de a.
-
Luego, graficamos los resultados.
-
Usamos xm y los valores predichos de y para trazar la línea roja de la correlación ajustada.
-
Esta es nuestra correlación regresada.
-
Ejecutamos una vez más y realizamos la regresión.
-
Resuelve y produce los valores regresados que puedes ver.
-
Parece que cometí un error con la leyenda.
-
Necesito establecer label='regression' para que no piense que quiero cambiar el eje y.
-
Ahí está la regresión y los datos.
-
Si deseas agregar otro parámetro, por ejemplo, b, para ver si obtienes un mejor ajuste, simplemente copias esto y agregas b.
-
Obtenemos el valor de b también.
-
Si obtienes un mejor ajuste usando un parámetro adicional, parece que fue casi cero, pero es -0.033, como puedes ver en los valores de los parámetros.
-
Este es un tutorial sobre regresión no lineal general.
-
Podemos usar regresión lineal, como mostramos en el video anterior, o regresión polinómica, que es otra forma de regresión lineal.
-
Una cosa a tener en cuenta con la regresión no lineal es que muchas correlaciones son en realidad lineales en el espacio de parámetros, por lo que puedes reorganizarlas y hacer una regresión lineal.
-
Otra cosa única del paquete GEKKO es que, por defecto, utiliza la suma del error absoluto en lugar de la suma del error cuadrático.
-
Si deseas cambiar eso, ve a m.options.EV_TYPE = 2 para usar la suma del error cuadrático.
-
Esto simplemente rehace la correlación con esa función objetivo diferente.
-
Obtendrás un resultado ligeramente diferente.
-
También puedes configurar la función objetivo tú mismo.
-
Por ejemplo, puedes definir una variable de estado o simplemente una variable y no establecer el estado.
-
Puedes tener una función objetivo que intentes minimizar.
-
Necesitamos cargar otro parámetro con los valores de ym.
-
Luego, podemos construir nuestra propia función objetivo, por ejemplo, (yp - y) / yp, y asegurarnos de que no cause problemas si yp es cero.
-
Esa es nuestra función objetivo.
-
Si queremos tener la diferencia normalizada, necesitamos elevar al cuadrado esta expresión.
-
Optimizamos una vez más.
-
Debería ejecutarse y darnos los resultados.
-
Ahí está el error cuadrático normalizado.
-
Supongo que esto debería estar al cuadrado.
-
Lo pondré dentro también, solo otra forma de hacerlo.
-
Será la diferencia fraccional entre los dos que minimizamos.
-
Hay muchas formas diferentes que puedes usar para la función objetivo: suma del error absoluto, suma del error cuadrático para esta regresión no lineal.
-
Dependiendo del problema que estés resolviendo, podemos configurarlo de diferentes maneras.
-
Eso es todo para este tutorial sobre regresión.
-
El código fuente está publicado aquí.
-
Solo baja a "nonlinear regression" y verás el código fuente que puedes copiar.
-
No recomiendo simplemente copiar eso, pero usa el enlace de código git que te dará una forma en bruto, solo texto, y puedes pegar eso y probarlo, modificarlo como desees.
-
El próximo tema que vamos a abordar será el aprendizaje automático con redes neuronales.
-
También haremos una regresión allí y luego abordaremos la resolución de ecuaciones diferenciales y más temas de optimización.