Domanda

Sto cercando una curva di routine montaggio non lineare (probabilmente più probabilità di essere trovati in R o Python, ma sono aperto ad altre lingue), che avrebbe preso x, y di dati e montare una curva ad esso.

dovrei essere in grado di specificare come una stringa del tipo di espressione che voglio per adattarsi.

Esempi:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

Quello che vorrei uscire da questo è almeno i valori per le costanti (A, B, C, ecc) e si spera statistiche circa l'idoneità della partita.

Non ci sono programmi commerciali per fare questo, ma mi aspettavo di essere in grado di trovare qualcosa di così comune come raccordo a un'espressione desiderata in una libreria della lingua al giorno d'oggi. Ho il sospetto che roba ottimizzazione del SciPy potrebbe essere in grado di fare questo, ma non riesco a vedere che mi permette di definire un'equazione. Allo stesso modo, io non riesco a trovare esattamente quello che voglio in R.

è quello che sto cercando là fuori, o ho bisogno di rotolare il mio? Odio farlo se è lì e sto solo avendo difficoltà a trovarlo.


Edit: Voglio fare questo per un po 'più di controllo sul processo di quello che ricevo da LAB Fit. Il LAB Fit interfaccia utente è terribile. Mi piacerebbe anche essere in grado di rompere la gamma in più parti e hanno diverse curve rappresentano i diversi pezzi della gamma. Alla fine, il risultato deve essere in grado di (velocità-saggio) battere una LUT con interpolazione lineare o non mi interessa.

Nella mia attuale serie di problemi, che hanno funzioni trigonometriche o exp () e ho bisogno di eseguirli 352,800 volte al secondo in tempo reale (e utilizzare solo una frazione della CPU). Così ho Tracciare la curva e utilizzare i dati per guidare la curva montatore per ottenere approssimazioni meno costosi. Ai vecchi tempi, LUTs erano quasi sempre la soluzione, ma al giorno d'oggi per saltare le ricerche di memoria e di fare un'approssimazione è a volte più veloce.

È stato utile?

Soluzione

Per rispondere alla tua domanda in senso generale (per quanto riguarda la stima dei parametri in R) senza considerare le specificità delle equazioni si ha sottolineato, credo che siete alla ricerca di NLS () o Optim () ... 'NLS' è il mio prima scelta in quanto fornisce le stime di errore per ogni parametro stimato e quando non riesce uso 'Optim'. Se avete i vostri x, y variabili:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

per ottenere i coefficienti, qualcosa come

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

Se si desidera che gli errori standard nel caso di '' NLS,

summary(out)$parameters

I file di aiuto e r-help mailing list i messaggi contengono molte discussioni riguardanti gli algoritmi di minimizzazione specifiche attuate da ciascuna (il default usato in ogni caso nell'esempio precedente) e la loro adeguatezza per la specifica forma dell'equazione a portata di mano. Alcuni algoritmi in grado di gestire vincoli scatola, e un'altra funzione chiamata constrOptim () può gestire una serie di vincoli lineari. Questo sito può anche aiutare:

http://cran.r-project.org/web/views/ Optimization.html

Altri suggerimenti

Il primo modello è in realtà linear nei tre parametri e può essere in forma in R utilizzando

 fit <- lm(y ~ x + I(x^2), data=X)

che vi porterà i vostri tre parametri.

Il secondo modello può anche essere in forma utilizzando nls() in R con i soliti avvertimenti di dover ricavare dei valori iniziali ecc statistica problemi in ottimizzazione non sono necessariamente uguale al numerico problemi -. non si può solo ottimizzare qualsiasi forma funzionale, non importa quale lingua si sceglie

GNU Octave - tra la sua polyfit () e il vincoli non lineari risolutore dovrebbe essere possibile costruire qualcosa di adatto per il vostro problema.

In R, questo è abbastanza facile.

Il costruito nel metodo viene chiamato Optim (). Prende come argomenti un vettore di partenza di potenziali parametri, quindi una funzione. Devi andare a costruire la propria funzione di errore, ma questo è davvero semplice.

Poi si chiama come out = optim (1, err_fn)

dove err_fn è

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

Questo presuppone solo si dispone di un vettore di valori X e Y in eckses e dati. Modificare la riga model_y come meglio credi, anche aggiungere più parametri.

Si lavora su lineare bene, lo uso per quattro dimensionali e ^ x curve ed è molto veloce. I dati di uscita comprende il valore di errore al termine del raccordo, che è una misura di quanto bene si adatta, determinato come somma delle differenze al quadrato (nel mio err_fn).

EDIT: Se avete bisogno di prendere nel modello come una stringa, si può avere l'interfaccia utente costruire questo modello intero processo di adattamento come uno script R e caricarlo nel correre. R può prendere il testo da STDIN o da un file, quindi non dovrebbe essere troppo difficile per le imbarcazioni stringa equivalente di questa funzione, e lo hanno eseguito Optim automaticamente.

Si sta probabilmente non andare a trovare una sola routine con la flessibilità implicita nei tuoi esempi (polinomi e funzioni razionali che utilizzano la stessa routine), per non parlare di uno che analizzare una stringa per capire che tipo di equazione per adattarsi.

A minimi quadrati polinomio montatore sarebbe appropriato per il primo esempio. (Sta a voi quello che polinomio di grado da usare - quadradic, cubica, quarto grado, ecc). Per una funzione razionale come il tuo secondo esempio, potrebbe essere necessario "roll your own" se non è possibile trovare una libreria adeguata. Inoltre, tenete a mente che un polinomio sufficientemente alto grado può essere utilizzato per approssimare la funzione "reale", fino a quando non è necessario estrapolare oltre i limiti del set di dati che stai raccordo a.

Come altri hanno notato, ci sono altri, più generalizzati algoritmi di stima dei parametri che potrebbero anche rivelarsi utili. Ma questi algoritmi non sono abbastanza "plug and play": di solito richiedono di scrivere alcune routine di aiuto, e fornire un elenco dei valori iniziali per i parametri del modello. E 'possibile che questi tipi di algoritmi per divergono, o rimane bloccata in un minimo locale o massimo per una scelta sfortunata delle stime iniziali dei parametri.

se hai vincoli sui vostri coefficienti, e sai che c'è un tipo specifico di funzioni che ci si vuole adattare ai propri dati e che la funzione è un disordinato uno in cui i metodi di regressione standard o altri metodi di raccordo di curva non lo farà lavoro, avete considerato algoritmi genetici?

non sono la mia prima scelta, ma se si sta cercando di trovare i coefficienti della seconda funzione che lei ha citato, allora forse gas sarebbe lavorare --- soprattutto se si utilizza metriche non standard per valutare meglio si adattano. per esempio, se si voleva trovare i coefficienti di "(A + Bx + Cx ^ 2) / (Dx + Ex ^ 2)" in modo tale che la somma delle differenze quadrati tra la vostra funzione e dei dati è minima e che ci sia qualche vincolo sulla lunghezza di un arco della funzione risultante, poi un algoritmo stocastico potrebbe essere un buon modo per avvicinarsi a questo.

alcuni avvertimenti: 1) algoritmi stocastici non garantirà il migliore soluzione, ma sarà spesso molto vicino. 2) bisogna stare attenti circa la stabilità dell'algoritmo.

su una nota più a lungo, se si è nella fase in cui si desidera trovare una funzione da qualche spazio di funzioni che meglio si adatta i vostri dati (ad esempio, non si è intenzione di imporre, per esempio, il secondo modello sui vostri dati) , quindi le tecniche di programmazione genetici possono anche aiutare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top