Ho un problema (vedi https://public.jmp.com/packages/Problematic-Nonlinear-Fit/js-p/kz0BFg2_XHtZjz6kNKdXg ) in cui sto adattando un modello non lineare e, a causa dei dati, esiste una certa instabilità nell'adattamento del modello. Uno dei parametri nel modello non lineare tende a "scorrere all'infinito" quando ci sono piccoli errori nei dati rispetto al vero modello teorico. Quello che vorrei fare è adattarsi al modello non lineare, ma mettere una penalità su quel parametro (es L2) in modo che ciò impedisca l'esplosione del parametro.
Cosa intendo con questo:
Supponiamo che il mio modello non lineare sia
f (t) = A * (1 - exp (-k * t)) + B * (1-exp (0.0193 * t))
normalmente, la funzione di perdita minimizzata per trovare le stime dei parametri è la perdita di errore al quadrato
trova (A, k,
in modo che la somma {(yf (t)) ^ 2)} sia minimizzata
quello che voglio fare è qualcosa di più simile
trova (A, k,
in modo che la somma {(yf (t)) ^ 2 + lambda * k ^ 2} sia minimizzata
dove lambda è un parametro di regolarizzazione che sceglierei da solo sulla base di una semplice ricerca nella griglia.
Ho esaminato l'utilizzo di una colonna della funzione di perdita personalizzata, ma non so se posso includere un parametro del modello da un'altra colonna in quella colonna.
Qualche idea su come evitare che il tasso ("k") esploda?
Ho riflettuto a lungo su questo problema, ma non riesco a vedere come emergere i valori dei parametri correnti in modo che possano essere utilizzati nella funzione di perdita regolarizzata. Potrebbe essere possibile saltare la formula di previsione ed esprimere l'intero modello nella funzione di perdita. Le funzioni di perdita personalizzate sono un punto debole delle mie conoscenze.
C'è una funzione integrata che potrebbe aiutare al posto della regolarizzazione. Vedere Guida> Libreria dei documenti JMP> Modellazione predittiva e specializzata> Regressione non lineare> Esempi aggiuntivi> Esempio di impostazione dei limiti dei parametri . Il problema con questa soluzione è che il tuo parametro probabilmente finirebbe al limite superiore anziché all'infinito.
Hai provato alcune delle impostazioni non predefinite per aiutarti? mi chiedo se Solo derivati numerici aiuterebbe? Usando il Secondo derivato aiuto opzione?
Ho provato a utilizzare derivate numeriche, che non ha modificato i risultati. I limiti dei parametri fanno ciò che si pensava avrebbe fatto, basta fare in modo che la stima sia il limite specificato.
Ho caricato anche i dati di esempio in questo post.
Ho pensato a un modo per farlo, usando il profiler di previsione. Ecco il mio approccio:
Ho creato una tabella (vedi allegato) che aveva le colonne k, A, B, lambda e colonna per la funzione "perdita" che voglio minimizzare. La tabella allegata ha 2 funzioni di perdita (QuadLoss e L2RegLoss). Ognuna di quelle colonne ha uno script più complesso come formula. Memorizzo i dati del profilo come matrice, estraggo i valori yey come vettore, quindi calcolo la differenza tra y e il modello (completando la scrittura del modello in funzione di t, k, A e
. Quindi ho calcolato la somma degli errori al quadrato più l'eventuale penalità di regolarizzazione aggiunta come ultimo risultato. Il valore per lambda ridimensiona il valore della penalità. Ho "vettorializzato" la funzione solo per rendere un po 'più semplice la scrittura. Ecco la funzione per 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];
Ecco la funzione per 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;
Quindi, utilizzando Prediction Profiler e una funzione di desiderabilità per ridurre al minimo la perdita, ho esaminato quali diversi valori di lambda (il parametro di ottimizzazione della regolarizzazione) davano per il valore k. In questo caso sto solo regolarizzando k, non A e B.

L'impostazione salvata "NoReg" utilizza solo la perdita quadratica (somma dell'errore quadrato), che dovrebbe essere simile a quella che sta facendo la piattaforma non lineare (ma non esattamente, poiché in questo caso sto usando la routine di ottimizzazione nel profiler, che Sono abbastanza sicuro che sia diverso da quello che utilizza la piattaforma non lineare). Quindi ho provato i valori di 0,01, 0,001, 0,1 per lambda e la stima di k è piuttosto forte influenzata dal valore del parametro tuning. Quindi non sono completamente soddisfatto di questo approccio. La scelta del parametro di ottimizzazione è impegnativa, non sono sicuro che si tratti di un approccio ragionevole.