J'ai un problème (voir https://public.jmp.com/packages/Problematic-Nonlinear-Fit/js-p/kz0BFg2_XHtZjz6kNKdXg ) où j'ajuste un modèle non linéaire, et à cause des données, il y a une certaine instabilité dans l'ajustement du modèle. L'un des paramètres du modèle non linéaire a tendance à «glisser vers l'infini» lorsqu'il y a de petites erreurs dans les données par rapport au vrai modèle théorique. Ce que je voudrais faire, c'est ajuster le modèle non linéaire, mais mettre une pénalité sur ce paramètre (par exemple Norme L2), ce qui empêche le paramètre de sauter.
Ce que je veux dire par là:
Supposons que mon modèle non linéaire soit
f (t) = A * (1 - exp (-k * t)) + B * (1-exp (0,0193 * t))
normalement, la fonction de perte qui est minimisée pour trouver les estimations des paramètres est la perte d'erreur au carré
trouver (A, k,
de sorte que la somme {(yf (t)) ^ 2)} soit minimisée
ce que je veux faire est quelque chose de plus
trouver (A, k,
de sorte que la somme {(yf (t)) ^ 2 + lambda * k ^ 2} soit minimisée
où lambda est un paramètre de régularisation que je choisirais moi-même sur la base d'une simple recherche dans la grille.
J'ai cherché à utiliser une colonne de fonction de perte personnalisée, mais je ne sais pas si je peux inclure un paramètre de modèle d'une autre colonne dans cette colonne.
Avez-vous des idées sur la façon d'empêcher le taux ("k") d'exploser?
J'ai longuement réfléchi à ce problème, mais je ne vois pas comment faire apparaître les valeurs actuelles des paramètres afin qu'elles puissent être utilisées dans la fonction de perte régularisée. Il pourrait être possible de sauter la formule de prédiction et d'exprimer le modèle entier dans la fonction de perte. Les fonctions de perte personnalisées sont une faiblesse de mes connaissances.
Il existe une fonctionnalité intégrée qui pourrait aider à la place de la régularisation. Voir Aide> Bibliothèque de documentation JMP> Modélisation prédictive et spécialisée> Régression non linéaire> Exemples supplémentaires> Exemple de définition de limites de paramètres . Le problème avec cette solution est que votre paramètre se retrouverait probablement à la limite supérieure au lieu de l'infini.
Avez-vous essayé certains des paramètres non par défaut pour vous aider? je me demande si Dérivés numériques uniquement aiderait? Serait en utilisant le Deuxième dérivé option d'aide?
J'ai essayé d'utiliser des dérivées numériques, cela n'a pas changé les résultats. Les limites des paramètres font ce que vous pensiez, faites simplement que l'estimation soit la limite spécifiée.
J'ai également téléchargé les données d'exemple dans ce post.
J'ai pensé à un moyen de le faire, en utilisant le profileur de prédiction. Voici mon approche:
J'ai créé un tableau (voir ci-joint) qui avait les colonnes k, A, B, lambda et la colonne pour la fonction "perte" que je veux minimiser. Le tableau ci-joint a 2 fonctions de perte (QuadLoss et L2RegLoss). Chacune de ces colonnes a un script plus complexe comme formule. Je stocke les données de profil sous forme de matrice, j'extrais les valeurs y et t en tant que vecteur, puis je calcule la différence entre y et le modèle (en terminant l'écriture du modèle en fonction de t, k, A et
. Ensuite, je calcule la somme des erreurs au carré plus toute pénalité de régularisation supplémentaire comme dernier résultat. La valeur de lambda met à l'échelle la valeur de pénalité. J'ai "vectorisé" la fonction juste pour la rendre un peu plus facile à écrire. Voici la fonction du 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];
Voici la fonction pour 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;
Ensuite, en utilisant le Prediction Profiler et une fonction de désirabilité pour minimiser la perte, j'ai regardé ce que différentes valeurs de lambda (le paramètre de réglage de régularisation) ont donné pour la valeur k. Dans ce cas, je régularise uniquement k, pas A et B.

Le paramètre enregistré "NoReg" utilise uniquement la perte quadratique (somme des erreurs quadratiques), qui devrait être similaire à ce que fait la plate-forme non linéaire (mais pas exactement, car dans ce cas, j'utilise la routine d'optimisation dans le profileur, qui Je suis sûr que ce que la plate-forme non linéaire utilise est différent. Ensuite, j'ai essayé des valeurs de 0,01, 0,001, 0,1 pour lambda, et l'estimation de k est assez fortement impactée par la valeur du paramètre de réglage. Je ne suis donc pas entièrement satisfait de cette approche. Le choix du paramètre de réglage est difficile, je ne sais pas si c'est une approche raisonnable.