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.