Come scegliere i valori iniziali per l'adattamento dei minimi quadrati non lineari


13

La domanda sopra dice tutto. Fondamentalmente la mia domanda è per una funzione di adattamento generica (potrebbe essere arbitrariamente complicata) che non sarà lineare nei parametri che sto provando a stimare, come scegliere i valori iniziali per inizializzare l'adattamento? Sto cercando di fare minimi quadrati non lineari. C'è qualche strategia o metodo? Questo è stato studiato? Qualche riferimento? Nulla oltre all'ipotesi ad hoc? In particolare, in questo momento una delle forme di adattamento con cui sto lavorando è una forma gaussiana più lineare con cinque parametri che sto cercando di stimare, come

y=Ae(xBC)2+Dx+E

dove (dati di ascissa) e (dati di ordinata) significa che nello spazio di registro-log i miei dati sembrano una linea retta più un bump che sto approssimando da un gaussiano. Non ho una teoria, niente che mi guidi su come inizializzare l'adattamento non lineare, tranne forse la rappresentazione grafica e il bulbo oculare come la pendenza della linea e qual è il centro / larghezza dell'urto. Ma ho più di cento di questi adattamenti per farlo, invece di rappresentare graficamente e indovinare, preferirei un approccio che può essere automatizzato. y = registro 10x=log10y=log10

Non riesco a trovare riferimenti, in biblioteca o online. L'unica cosa che mi viene in mente è di scegliere casualmente i valori iniziali. MATLAB offre di scegliere i valori in modo casuale tra [0,1] distribuiti uniformemente. Quindi, con ogni set di dati, eseguo il fit inizializzato casualmente mille volte e quindi scelgo quello con il più alto ? Altre idee (migliori)?r2


Addendum # 1

Innanzitutto, ecco alcune rappresentazioni visive dei set di dati solo per mostrarvi di che tipo di dati sto parlando. Sto pubblicando entrambi i dati nella sua forma originale senza alcun tipo di trasformazione e quindi la sua rappresentazione visiva nello spazio log-log in quanto chiarisce alcune delle caratteristiche dei dati mentre ne distorce altri. Sto pubblicando un campione di dati positivi e negativi.

buoni dati log-log dati validi dati errati log-log dati errati

Ciascuno dei sei pannelli in ciascuna figura mostra quattro set di dati tracciati insieme rosso, verde, blu e ciano e ogni set di dati ha esattamente 20 punti dati. Sto cercando di adattare ciascuno di loro con una linea retta più un gaussiano a causa dei dossi visti nei dati.

La prima cifra mostra alcuni dei buoni dati. La seconda figura è il diagramma log-log degli stessi buoni dati della figura uno. La terza cifra è alcuni dei dati errati. La quarta figura è il diagramma log-log della figura tre. Ci sono molti più dati, questi sono solo due sottoinsiemi. La maggior parte dei dati (circa 3/4) è buona, simile ai buoni dati che ho mostrato qui.

Ora alcuni commenti, per favore, abbi pazienza perché ciò potrebbe richiedere molto tempo ma penso che tutti questi dettagli siano necessari. Cercherò di essere il più conciso possibile.

Inizialmente mi aspettavo una legge di potenza semplice (che significa linea retta nello spazio log-log). Quando ho tracciato tutto nello spazio log-log, ho visto il bump inaspettato a circa 4,8 mHz. Il dosso è stato studiato a fondo ed è stato scoperto anche in altri lavori, quindi non è che abbiamo sbagliato. È fisicamente presente e anche altre opere pubblicate ne parlano. Quindi ho appena aggiunto un termine gaussiano alla mia forma lineare. Si noti che questo adattamento doveva essere fatto nello spazio log-log (quindi le mie due domande, compresa questa).

Ora, dopo aver letto la risposta di Stumpy Joe Pete a un'altra mia domanda (non collegata affatto a questi dati) e aver letto questo e questo e riferimenti in esso (roba di Clauset), mi rendo conto che non dovrei inserirmi nel log-log spazio. Quindi ora voglio fare tutto nello spazio pre-trasformato.

Domanda 1: guardando i buoni dati, penso ancora che un lineare più un gaussiano nello spazio pre-trasformato sia ancora una buona forma. Mi piacerebbe sentire da altri che hanno più esperienza dei dati ciò che pensano. Gaussian + linear è ragionevole? Dovrei fare solo un gaussiano? O una forma completamente diversa?

Domande 2: Qualunque sia la risposta alla domanda 1, avrei ancora bisogno (molto probabilmente) di minimi quadrati non lineari, quindi ho ancora bisogno di aiuto con l'inizializzazione.

I dati in cui vediamo due set, preferiamo fortemente catturare il primo bump a circa 4-5 mHz. Quindi non voglio aggiungere altri termini gaussiani e il nostro termine gaussiano dovrebbe essere centrato sul primo bump che è quasi sempre il bump più grande. Vogliamo "maggiore precisione" tra 0,8 mHz e circa 5 mHz. Non ci preoccupiamo troppo delle frequenze più alte, ma non vogliamo nemmeno ignorarle completamente. Quindi forse una sorta di pesatura? Oppure B può essere inizializzato sempre intorno a 4.8mHz?

I dati dell'ascissa sono la frequenza in unità di millihertz, denotata da . I dati ordinata è un coefficiente che stiamo computing, denotare facendo . Quindi nessuna trasformazione del log e il modulo èLfL

L=Ae(fBC)2+Df+E.
  • f è frequenza, è sempre positivo.
  • L è un coefficiente positivo. Quindi stiamo lavorando nel primo quadrante.
  • A > 0 AA , anche l'ampiezza dovrebbe essere sempre positiva, perché penso che abbiamo a che fare solo con i dossi. Quando guardo i dati vedo sempre picchi e nessuna valle. Sembra che in tutti i dati ci siano più dossi a frequenze più alte. Il primo dosso è sempre molto più grande di altri. In buoni dati, i dossi secondari sono molto deboli, ma in dati cattivi (pannello 2 e 5 per esempio), i dossi secondari sono forti. Quindi in realtà non abbiamo una valle, ma piuttosto due dossi. Significa che l'ampiezza . E poiché ci preoccupiamo principalmente del primo picco, una ragione in più per è positiva.A>0A
  • B è il centro del bump e lo vogliamo sempre su quel bump grande intorno a 4-5mHz. Nella nostra gamma di frequenza risolta, appare quasi sempre a 4.8mHz.
  • C - CC è la larghezza dell'urto. Immagino che sia simmetrico intorno allo zero, il che significa che avrebbe lo stesso effetto di perché è al quadrato. Quindi non ci interessa quale sia il suo valore. Diciamo che lo preferiamo positivo.CC
  • D è la pendenza della linea, sembra che potrebbe essere leggermente negativa, quindi non imporre alcuna restrizione su di essa. La pendenza è interessante a sé stante, quindi invece di imporre eventuali restrizioni su di essa, vogliamo solo vedere quale sarebbe. È positivo o negativo? Quanto è grande / piccola la grandezza? e così via.
  • L E L f = 0E è l' intercettazione (quasi) . La cosa sottile qui è che a causa del termine gaussiano, non è proprio l' intercettazione aL'intercettazione effettiva (se dovessimo estrapolare a ) sarebbeLELf=0

Ae(B/C)2+E.

Quindi l'unica limitazione qui è che anche l'intercettazione dovrebbe essere positiva. L'intercettazione è zero, non so cosa significherebbe. Ma il negativo sembrerebbe sicuramente privo di senso. Immagino che qui possiamo consentire che sia leggermente negativo con una piccola magnitudine, se necessario. Il motivo e l'intercettazione sono importanti qui, ma alcuni dei nostri colleghi sono effettivamente interessati anche all'estrapolazione. La frequenza minima che abbiamo è 0,8 mHz e vogliono estrapolare tra 0 e 0,8 mHz. La mia idea ingenua era quella di usare solo l'adattamento per scendere fino a .E f = 0EEf=0

So che l'estrapolazione è più dura / più pericolosa dell'interpolazione ma usare una linea retta più un gaussiano (sperando che decada abbastanza velocemente) mi sembra ragionevole. Un po 'come delle spline cubiche naturali con condizioni al contorno naturali, la pendenza all'estremità sinistra, basta estendere la linea e vedere dove attraversa l' asseSe non è negativo, utilizzare quella riga per l'estrapolazione.L

Domande 3: Cosa ne pensate estrapolare in questo caso? Qualche pro / contro? Altre idee per l'estrapolazione? Ancora una volta ci preoccupiamo solo delle frequenze più basse in modo da estrapolare tra 0 e 1mHz ... a volte frequenze molto piccole, vicine allo zero. So che questo post è già pieno. Ho fatto questa domanda qui perché le risposte potrebbero essere correlate, ma se preferite, posso separare questa domanda e farne un'altra in seguito.

Infine, ecco due set di dati di esempio su richiesta.

0.813010000000000   0.091178000000000   0.012728000000000
1.626000000000000   0.103120000000000   0.019204000000000
2.439000000000000   0.114060000000000   0.063494000000000
3.252000000000000   0.123130000000000   0.071107000000000
4.065000000000000   0.128540000000000   0.073293000000000
4.878000000000000   0.137040000000000   0.074329000000000
5.691100000000000   0.124660000000000   0.071992000000000
6.504099999999999   0.104480000000000   0.071463000000000
7.317100000000000   0.088040000000000   0.070336000000000
8.130099999999999   0.080532000000000   0.036453000000000
8.943100000000001   0.070902000000000   0.024649000000000
9.756100000000000   0.061444000000000   0.024397000000000
10.569000000000001   0.056583000000000   0.025222000000000
11.382000000000000   0.052836000000000   0.024576000000000
12.194999999999999   0.048727000000000   0.026598000000000
13.008000000000001   0.045870000000000   0.029321000000000
13.821000000000000   0.041454000000000   0.067300000000000
14.633999999999999   0.039596000000000   0.081800000000000
15.447000000000001   0.038365000000000   0.076443000000000
16.260000000000002   0.036425000000000   0.075912000000000

La prima colonna è le frequenze in mHz, identiche in ogni singolo set di dati. La seconda colonna è un buon set di dati (dati validi figura uno e due, riquadro 5, indicatore rosso) e la terza colonna è un insieme di dati errato (dati errati figura tre e quattro, riquadro 5, indicatore rosso).

Spero che questo sia abbastanza per stimolare qualche discussione più illuminata. Grazie a tutti


+1 per ulteriori informazioni, ma ora sembra una nuova domanda. Per inciso, se si desidera eliminare quello precedente ora penso che andrebbe bene, sembra che ora hai coperto le informazioni aggiuntive che aveva.
Glen_b

@Glen_b Perché è così? Perché sembra una nuova domanda? Per quanto riguarda la vecchia domanda, siamo tutti puttana per i punti ;-D e la vecchia ha due voti, un modo per unirlo con questo in modo da poter mantenere anche quei due voti?
Risolto il punto

Bene, per cominciare, ora stai chiedendo cosa dovresti adattare, piuttosto che specificare cosa adattare, come prima. Ci sono molte altre differenze, alcune delle quali ritengo piuttosto significative. Vedrò di cambiare la mia risposta, ma penso che questa potrebbe essere la domanda e la risposta originali e le tue nuove parti in cui stai chiedendo altre cose potrebbero essere nuove. Per il momento lo lascerò al tuo giudizio.
Glen_b

@Glen_b Abbastanza giusto, ho eliminato le domande extra. Quindi la domanda è ancora, ho alcuni dati che voglio adattare usando la forma lineare + gaussiana, posso fare meglio dell'inizializzazione casuale?
Risolto il punto

Penso che la mia risposta attuale mostri che, almeno in alcune circostanze, puoi fare di meglio, e @whuber suggerisce qualcosa di ancora più semplice del mio processo. Potrei tornare indietro e vedere come ho eseguito i tuoi dati, ma anche così com'è ora mi viene in mente come impostare tali punti di partenza.
Glen_b

Risposte:


10

Se ci fosse una strategia che fosse sia buona che generale - una che ha sempre funzionato - sarebbe già stata implementata in ogni programma non lineare dei minimi quadrati e i valori iniziali non sarebbero un problema.

Per molti problemi specifici o famiglie di problemi, esistono alcuni approcci piuttosto buoni ai valori di partenza; alcuni pacchetti vengono forniti con buoni calcoli del valore iniziale per specifici modelli non lineari o con approcci più generali che spesso funzionano ma che potrebbero dover essere aiutati con funzioni più specifiche o input diretto di valori iniziali.

Esplorare lo spazio è necessario in alcune situazioni, ma penso che la tua situazione sia probabilmente tale da rendere probabilmente utili strategie più specifiche - ma progettarne una buona richiede praticamente molta conoscenza del dominio che difficilmente possederemo.

Per il tuo problema particolare, è possibile progettare probabilmente buone strategie, ma non è un processo banale; più informazioni hai sulla probabile dimensione ed estensione del picco (i valori dei parametri tipici e le tipiche darebbero un'idea), più si può fare per progettare una buona scelta del valore iniziale.x

Quali sono gli intervalli tipici di e che ottieni? Come si presentano i risultati medi? Quali sono i casi insoliti? Quali valori di parametro conosci essere possibili o impossibili?xyx

Un esempio: la parte gaussiana genera necessariamente un punto di svolta (un picco o depressione)? O a volte è così piccolo rispetto alla linea che non lo fa? è sempre positivo? eccetera.A

Alcuni dati di esempio potrebbero essere utili - casi tipici e casi difficili, se possibile.


Modifica: ecco un esempio di come puoi fare abbastanza bene se il problema non è troppo rumoroso:

Ecco alcuni dati generati dal tuo modello (i valori della popolazione sono A = 1.9947, B = 10, C = 2.828, D = 0.09, E = 5):

dati nls

I valori iniziali che sono stato in grado di stimare sono
(As = 1.658, Bs = 10.001, Cs = 3.053, Ds = 0.0881, Es = 5.026)

La vestibilità di quel modello iniziale è simile al seguente:

nlstart

I passaggi sono stati:

  1. Montare una regressione di Theil per ottenere una stima approssimativa di D ed E
  2. Sottrarre l'adattamento della regressione di Theil
  3. Utilizzare LOESS per adattarsi a una curva regolare
  4. Trova il picco per ottenere una stima approssimativa di A e il valore x corrispondente al picco per ottenere una stima approssimativa di B
  5. Prendi gli adattamenti LOESS i cui valori y sono> 60% della stima di A come osservazioni e adatta un quadratico
  6. Utilizzare il quadratico per aggiornare la stima di B e stimare C
  7. Dai dati originali, sottrarre la stima del gaussiano
  8. Adatta un'altra regressione di Theil ai dati corretti per aggiornare la stima di D ed E

In questo caso, i valori sono molto adatti per iniziare un adattamento non lineare.

Ho scritto questo come Rcodice ma la stessa cosa potrebbe essere fatta in MATLAB.

Penso che cose migliori di questa siano possibili.

Se i dati sono molto rumorosi, questo non funzionerà affatto bene.


Edit2: questo è il codice che ho usato in R, se qualcuno è interessato:

gausslin.start <- function(x,y) {

  theilreg <- function(x,y){
    yy <- outer(y, y, "-")
    xx <- outer(x, x, "-")
    z  <- yy / xx
    slope     <- median(z[lower.tri(z)])
    intercept <- median(y - slope * x)
    cbind(intercept=intercept,slope=slope)
  }

  tr <- theilreg(x,y1)
  abline(tr,col=4)
  Ds = tr[2]
  Es = tr[1]
  yf  <- y1-Ds*x-Es
  yfl <- loess(yf~x,span=.5)

  # assumes there are enough points that the maximum there is 'close enough' to 
  #  the true maximum

  yflf   <- yfl$fitted    
  locmax <- yflf==max(yflf)
  Bs     <- x[locmax]
  As     <- yflf[locmax]

  qs     <- yflf>.6*As
  ys     <- yfl$fitted[qs]
  xs     <- x[qs]-Bs
  lf     <- lm(ys~xs+I(xs^2))
  bets   <- lf$coefficients
  Bso    <- Bs
  Bs     <-  Bso-bets[2]/bets[3]/2
  Cs     <- sqrt(-1/bets[3])
  ystart <- As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es

  y1a <- y1-As*exp(-((x-Bs)/Cs)^2)
  tr  <- theilreg(x,y1a)
  Ds  <- tr[2]
  Es  <- tr[1]
  res <- data.frame(As=As, Bs=Bs, Cs=Cs, Ds=Ds, Es=Es)
  res
}

.

# population parameters: A = 1.9947 , B = 10, C = 2.828, D = 0.09, E = 5
# generate some data
set.seed(seed=3424921)
x  <- runif(50,1,30)
y  <- dnorm(x,10,2)*10+rnorm(50,0,.2)
y1 <- y+5+x*.09 # This is the data
xo <- order(x)

starts <- gausslin.start(x,y1)
ystart <- with(starts, As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es)
plot(x,y1)
lines(x[xo],ystart[xo],col=2)

3
+1. Ripetere la misura mille volte e scegliere il migliore (se ho capito bene) sembra un'idea strana: i minimi quadrati non lineari dovrebbero convergere se il modello è ragionevole per i dati e ci sono buoni valori iniziali. Naturalmente, il secondo è quello che stai chiedendo. Ma sembra pessimista implicare che potrebbe essere necessario scegliere valori iniziali diversi per ogni adattamento.
Nick Cox,

1
@NickCox Dipende dalla gamma di problemi riscontrati: se ricordo bene dai post precedenti, l'OP ottiene un numero enorme di questi problemi, ma non ricordo di aver visto abbastanza dettagli per dare buoni suggerimenti prima, anche se ho investito un po 'di tempo a giocare con potenziali approcci (che non ha prodotto nulla di abbastanza definitivo da pubblicare). L'OP ha probabilmente il tipo di conoscenza del dominio che potrebbe produrre buoni valori iniziali che risolvono quasi sempre i suoi problemi.
Glen_b

1
Proprio così. Ho perso il post precedente su stats.stackexchange.com/questions/61724/…
Nick Cox,

3
|A|BA>0CA1/4A>0A<0

2
BB

6

Esiste un approccio generale per adattarsi a questo tipo di modelli non lineari. Implica una nuova parametrizzazione dei parametri lineari con i valori della variabile dipendente, ad esempio il primo, l'ultimo valore di frequenza e un buon punto nel mezzo, ovvero il sesto punto. quindi è possibile mantenere questi parametri fissi e risolvere per il parametro non lineare nella prima fase della minimizzazione e quindi ridurre al minimo 5 parametri complessivi.

Schnute e io l'abbiamo capito intorno al 1982 quando abbiamo adattato i modelli di crescita per i pesci.

http://www.nrcresearchpress.com/doi/abs/10.1139/f80-172

Tuttavia non è necessario leggere questo documento. Dato che i parametri sono lineari, è semplicemente necessario impostare e risolvere un sistema di equazioni 3x3 lineare per utilizzare la parametrizzazione stabile del modello.

M

M=(exp(((x(1)B)/C)2)x(1)1exp(((x(6)B)/C)2)x(6)1exp(((x(n)B)/C)2)x(n)1)
n=20
DATA_SECTION
  init_int n
  int mid
 !! mid=6;
  init_matrix data(1,n,1,3)
  vector x(1,n)
  vector y(1,n)
 !! x=column(data,1);
 !! y=column(data,3);   //use column 3
PARAMETER_SECTION
  init_number L1(3)     //(3) means estimate in phase 3
  init_number Lmid(3)
  init_number Ln(3)

  vector L(1,3)
  init_number log_B       // estimate in phase 1
  init_number log_C(2)    // estimate in phase 2 
  matrix M(1,3,1,3);
  objective_function_value f
  sdreport_vector P(1,3)
  sdreport_number B
  sdreport_number C
  vector pred(1,n);
PROCEDURE_SECTION
  L(1)=L1;
  L(2)=Lmid;
  L(3)=Ln;
  B=exp(log_B);
  C=exp(log_C);
  M(1,1)=exp(-square((x(1)-B)/C));
  M(1,2)=x(1);
  M(1,3)=1;
  M(2,1)=exp(-square((x(mid)-B)/C));
  M(2,2)=x(mid);
  M(2,3)=1;
  M(3,1)=exp(-square((x(n)-B)/C));
  M(3,2)=x(n);
  M(3,3)=1;

  P=solve(M,L);  // solve for standard parameters 
                 // P is vector corresponding to A,D,E

  pred=P(1)*exp(-square((x-B)/C))+P(2)*x+P(3);
  if (current_phase()<4)
    f+=norm2(y-pred);
  else
    f+=0.5*n*log(norm2(y-pred))  //concentrated likelihood

BCBBC

inserisci qui la descrizione dell'immagine

Per il tuo caso con dati errati, si adatta abbastanza facilmente e le stime (abituali) dei parametri sono:

         estimate    std dev
A      2.0053e-01 5.8723e-02
D      1.6537e-02 4.7684e-03
E     -1.8197e-01 7.3355e-02
B      3.0609e+00 5.0197e-01
C      5.6154e+00 9.4564e-01]

Dave, questo è interessante, ma solleva alcune domande. Cosa intendi esattamente con "questo tipo di modelli non lineari"? La domanda inizia facendo riferimento a una "funzione di adattamento generico", ma la descrizione si riferisce solo a "5 parametri complessivi".
whuber

Intendo modelli come il vonbertalanffy, o logistico o doppio esponenziale per esempio. In tutti i casi il modello è lineare in alcuni parametri e non lineare in altri. Le persone generalmente cercano di trasformarle per ottenere parametri più stabili concentrandosi sui parametri non lineari. Tuttavia, questo è l'approccio sbagliato. È la parametrizzazione lineare che dovrebbe essere modificata. Ad esempio, per un logistico a 4 parametri il modello è lineare nell'asintoto superiore e inferiore, ma anziché utilizzare questi parametri si dovrebbero usare i valori previsti per l'ind più piccolo e il più grande. var.
Dave Fournier,

@davefournier Grazie per aver risposto e indicato il tuo documento. Il tuo documento sembra un po 'difficile da capire ma la tecnica sembra interessante, quindi non vedo l'ora di leggerlo.
Punto fisso

2

Se dovessi farlo molte volte, suggerirei di utilizzare un algoritmo evolutivo sulla funzione SSE come front-end per fornire i valori iniziali.

D'altra parte, è possibile utilizzare GEOGEBRA per creare la funzione utilizzando i cursori per i parametri e giocare con essi per ottenere i valori iniziali.

O i valori iniziali dei dati possono essere stimati mediante l'osservazione.

  1. D ed E provengono dalla pendenza e dall'intercettazione dei dati (ignorando il gaussiano)
  2. A è la distanza verticale del massimo del gaussiano dalla stima della linea Dx + E.
  3. B è il valore x del massimo del gaussiano
  4. C è metà della larghezza apparente del gaussiano

1

Per i valori iniziali potresti fare un normale adattamento dei minimi quadrati. La sua pendenza e intercettazione sarebbero i valori iniziali per D ed E. Il residuo più grande sarebbe il valore iniziale per A. La posizione del residuo più grande sarebbe il valore iniziale per B. Forse qualcun altro può suggerire un valore iniziale per sigma.

Tuttavia, i minimi quadrati non lineari senza derivare alcun tipo di equazione meccanicistica dalla conoscenza della materia sono affari rischiosi e fare molti adattamenti separati rende le cose ancora più discutibili. C'è qualche conoscenza in merito all'equazione proposta? Ci sono altre variabili indipendenti che si riferiscono alle differenze tra i 100 accoppiamenti separati? Potrebbe essere utile se è possibile incorporare tali differenze in una singola equazione che si adatta a tutti i dati contemporaneamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.