Tengo un problema (ver https://public.jmp.com/packages/Problematic-Nonlinear-Fit/js-p/kz0BFg2_XHtZjz6kNKdXg ) donde estoy ajustando un modelo no lineal, y debido a los datos hay cierta inestabilidad en el ajuste del modelo. Uno de los parámetros en el modelo no lineal tiende a "deslizarse al infinito" cuando hay pequeños errores en los datos en comparación con el modelo teórico verdadero. Lo que me gustaría hacer es ajustar el modelo no lineal, pero aplicar una penalización a ese parámetro (p. Ej. L2) para evitar que el parámetro explote.
Lo que quiero decir con esto:
Supongamos que mi modelo no lineal es
f (t) = A * (1 - exp (-k * t)) + B * (1-exp (0.0193 * t))
normalmente, la función de pérdida que se minimiza para encontrar las estimaciones de los parámetros es la pérdida de error al cuadrado
encuentre (A, k,
para que la suma {(yf (t)) ^ 2)} se minimice
lo que quiero hacer es algo más como
encuentre (A, k,
para que la suma {(yf (t)) ^ 2 + lambda * k ^ 2} se minimice
donde lambda es un parámetro de regularización que elegiría por mi cuenta en base a una simple búsqueda de cuadrícula.
Estudié el uso de una columna de función de pérdida personalizada, pero no sé si puedo incluir un parámetro de modelo de otra columna en esa columna.
¿Alguna idea sobre cómo evitar que la tasa ("k") explote?
Pensé en este problema durante mucho tiempo, pero no puedo ver cómo mostrar los valores de los parámetros actuales para que puedan usarse en la función de pérdida regularizada. Es posible omitir la fórmula de predicción y expresar todo el modelo en la función de pérdida. Las funciones de pérdida personalizadas son una debilidad en mi conocimiento.
Hay una característica incorporada que podría ayudar en lugar de la regularización. Ver Ayuda> Biblioteca de documentación JMP> Modelado predictivo y especializado> Regresión no lineal> Ejemplos adicionales> Ejemplo de establecimiento de límites de parámetros . El problema con esta solución es que su parámetro probablemente terminaría en el límite superior en lugar de infinito.
¿Has probado algunas de las configuraciones no predeterminadas para ayudar? Me pregunto si Derivados numéricos solamente ¿ayudaría? Usaría el Segunda derivada opción de ayuda?
Intenté usar derivados numéricos, eso no cambió los resultados. Los límites de los parámetros hacen lo que pensabas, solo haz que la estimación sea el límite especificado.
Subí los datos de ejemplo en esta publicación, también.
Pensé en una forma de hacer esto, utilizando el generador de perfiles de predicción. Aquí está mi enfoque:
Creé una tabla (ver adjunto) que tenía columnas k, A, B, lambda y columna para la función de "pérdida" que quiero minimizar. La tabla adjunta tiene 2 funciones de pérdida (QuadLoss y L2RegLoss). Cada una de esas columnas tiene un script más complejo como fórmula. Almaceno los datos del perfil como una matriz, extraigo los valores y y t como un vector, y luego calculo la diferencia entre y y el modelo (completando la escritura del modelo en función de t, k, A y
. Luego calculo la suma de los errores al cuadrado más cualquier penalización de regularización agregada como último resultado. El valor de lambda escala el valor de penalización. "Vectorice" la función solo para que sea un poco más fácil de escribir. Aquí está la función para QuadLoss:
dmat = [0.061033 3, 0.0706 6, 0.0923 12, 0.104767 24, 0.122933 48, 0.1657 120, 0.2201 240];
yvec = dmat[0, 1];
tvec = dmat[0, 2];
rvec = yvec - (:A * (1 - Exp( -:k * tvec )) + :B * (1 - Exp( -0.0193 * tvec )));
(rvec` * rvec)[1];
Aquí está la función para L2RegLoss
dmat = [0.061033 3, 0.0706 6, 0.0923 12, 0.104767 24, 0.122933 48, 0.1657 120, 0.2201 240];
yvec = dmat[0, 1];
tvec = dmat[0, 2];
rvec = yvec - (:A * (1 - Exp( -:k * tvec )) + :B * (1 - Exp( -0.0193 * tvec )));
(rvec` * rvec)[1] + :lambda * :k ^ 2;
Luego, usando el Perfil de predicción y una función de deseabilidad para minimizar la pérdida, observé qué valores diferentes de lambda (el parámetro de ajuste de regularización) daban para el valor k. En este caso solo estoy regularizando k, no A y B.

La configuración guardada "NoReg" solo usa la pérdida cuadrática (suma de error al cuadrado), que debería ser similar a lo que está haciendo la plataforma no lineal (pero no exactamente, ya que en este caso estoy usando la rutina de optimización en el generador de perfiles, que Estoy bastante seguro de que es diferente de lo que usa la plataforma no lineal). Luego probé valores de 0.01, 0.001, 0.1 para lambda, y la estimación de k está bastante impactada por el valor del parámetro de ajuste. Así que no estoy completamente satisfecho con este enfoque. La elección del parámetro de ajuste es un desafío, no estoy seguro si este es un enfoque razonable.