L'algoritmo di Remez


14

L'algoritmo di Remez è una routine iterativa ben nota per approssimare una funzione con un polinomio nella norma minimax. Ma, come dice Nick Trefethen [1] al riguardo:

La maggior parte di queste [implementazioni] risale a molti anni fa e, di fatto, la maggior parte di esse non risolve il problema generale di approssimazione migliore come esposto sopra, ma varianti che coinvolgono variabili discrete o filtri digitali. Si possono trovare alcuni altri programmi per computer in circolazione, ma nel complesso sembra che al momento non ci siano programmi ampiamente utilizzati per calcolare le migliori approssimazioni.

Si può calcolare la soluzione minimax anche applicando l'ottimizzazione dei minimi quadrati o convessi, ad esempio usando Matlab e il toolbox CVX gratuito applicato alla funzione Runge su [-1, 1]:

m = 101; n = 11;            % 101 points, polynomial of degree 10
xi = linspace(-1, 1, m);    % equidistant points in [-1, 1]
ri = 1 ./ (1+(5*xi).^2);    % Runge function

tic                         % p is the polynomial of degree (n-1)
cvx_begin                   % minimize the distance in all points
    variable p(n);
    minimize( max(abs(polyval(p, xi) - ri)) );
cvx_end
toc                         % 0.17 sec for Matlab, CVX and SeDuMi

L'approssimazione con i polinomi di Chebyshev ha una norma minimax 0.1090mentre questo approccio qui raggiunge un minimo di 0.0654, lo stesso valore che viene calcolato con l'algoritmo Remez nella chebfuncasella degli strumenti Matlab .

Esistono dei vantaggi nell'applicazione dell'algoritmo Remez più complicato se è possibile calcolare la soluzione minimax in modo più rapido e preciso con un risolutore di ottimizzazione? Ci sono rapporti / articoli che confrontano questi due approcci su alcuni problemi difficili o casi di test?

-
[1] R. Pachon e LN Trefethen. BIT Numerical Mathematics (2008) Vol. 46.

Risposte:


4

La risposta "giusta" dipende fortemente da ciò di cui hai bisogno del tuo approssimativo. Hai davvero bisogno della migliore approssimazione per qualche limite di errore? O solo una buona approssimazione? O solo una buona approssimazione in senso minmax?

Nick Trefethen ha recentemente fornito un bell'esempio in cui l'approssimazione di Remez è una cattiva idea poiché minimizza l'errore massimo indipendentemente dall'errore medio sull'intero intervallo, che potrebbe non essere quello che desideri. Naturalmente, l'errore massimo può essere grande, ma questo è limitato per le funzioni regolari.

Aggiornare

Seguendo la discussione nei commenti qui sotto, ho scaricato CVX Toolbox e ho fatto un confronto diretto con l'algoritmo Chebfun Remez (dichiarazione di non responsabilità: faccio parte del team di sviluppo di Chebfun):

% Do the convex optimization bit.
m = 101; n = 11;            % 101 points, polynomial of degree 10
xi = linspace(-1, 1, m);    % equidistant points in [-1, 1]
ri = 1 ./ (1+(5*xi).^2);    % Runge function

tic                         % p is the polynomial of degree (n-1)
cvx_begin                   % minimize the distance in all points
    variable p(n);
    minimize( max(abs(polyval(p, xi) - ri)) );
cvx_end
toc_or = toc                % 0.17 sec for Matlab, CVX and SeDuMi

% Extract a Chebfun from the result
x = chebfun( [-1,1] );
A = [ chebfun(1) , x ];
for k=3:n, A(:,k) = A(:,k-1).*x; end
or = A * flipud(p)

% Make a chebfun of Runge's function
f = chebfun( @(x) 1 ./ ( 1 + 25*x.^2 ) )

% Get the best approximation using Remez
tic, cr = remez( f , 10 ); toc_cr = toc

% Get the maximum error in each case
fprintf( 'maximum error of convex optimization: %e (%f s)\n' , norm( f - or , inf ) , toc_or );
fprintf( 'maximum error of chebfun remez: %e (%f s)\n' , norm( f - cr , inf ) , toc_cr );

% Plot the two error curves
plot( [ f - cr , f - or ] );
legend( 'chebfun remez' , 'convex optimization' );

Dopo un sacco di output, ottengo sul mio laptop con Matlab 2012a, CVX versione 1.22 e l'ultima istantanea SVN di Chebfun:

maximum error of convex optimization: 6.665479e-02 (0.138933 s)
maximum error of chebfun remez: 6.592293e-02 (0.309443 s)

Si noti che il Chebfun futilizzato per misurare l'errore ha una precisione di 15 cifre. Quindi Remez di Chebfun impiega il doppio del tempo, ma ottiene un errore globale più piccolo. Va sottolineato che CVX utilizza il codice compilato per l'ottimizzazione, mentre Chebfun è Matlab nativo al 100%. L'errore minimo di 0.00654è l'errore minimo 'sulla griglia', fuori da quella griglia, l'errore può essere fino a 0.00659. Aumentando le dimensioni della griglia per m = 1001ottenere

maximum error of convex optimization: 6.594361e-02 (0.272887 s)
maximum error of chebfun remez: 6.592293e-02 (0.319717 s)

cioè quasi alla stessa velocità, ma l'ottimizzazione discreta è ancora peggiore della quarta cifra decimale. Infine, ncreasing la dimensione della griglia in seguito m = 10001ottengo

maximum error of convex optimization: 6.592300e-02 (5.177657 s)
maximum error of chebfun remez: 6.592293e-02 (0.312316 s)

cioè l'ottimizzazione discreta è ora più di dieci volte più lenta ed è ancora peggio della sesta cifra.

La linea di fondo è che Remez ti darà il risultato ottimale a livello globale. Mentre l'analogo discreto può essere veloce su griglie di piccole dimensioni, non darà un risultato corretto.


E N. Trefethen stava sottolineando lo stesso e ha dato un esempio simile nell'articolo che stavo citando. La domanda non riguardava la migliore approssimazione, ma: qual è il vantaggio dell'algoritmo di Remez (oggi) se puoi ottenere lo stesso risultato con un risolutore convesso ragionevole ?
Hans W.

1
@HansWerner, mi dispiace, ho letto male la tua domanda. Il tuo risolutore convesso non ti dà lo stesso risultato, almeno non a tutte le cifre. Se capisco correttamente il tuo codice convesso, stai minimizzando l'errore massimo su una serie discreta di punti. Questa è una buona approssimazione di - ma non uguale a - minimizzare l'errore massimo globale.
Pedro

Il risolutore convesso in questo caso ha dato un risultato migliore . Pensaci, l'algoritmo Remez è una procedura iterativa, abbastanza simile a una routine di ottimizzazione, e non restituirà anche un risultato esatto. Nel caso concreto sopra, la soluzione dall'ottimizzazione era migliore, cioè aveva una norma massima complessivamente più piccola, rispetto al risultato della migliore implementazione di Remez che conosco. La domanda è ancora aperta .
Hans W.

@HansWerner, come hai misurato il massimo errore della soluzione ottenuta con il risolutore convesso? L'algoritmo di Remez chebfundovrebbe scorrere fino al raggiungimento del minimo per la precisione della macchina (in un certo senso).
Pedro

Non necessariamente; ci sono opzioni come 'tol' (che è la tolleranza relativa) o 'maxiter' per chebfun/remez, ma ci sono opzioni simili per tutti i tipi di solutori di ottimizzazione. In un certo senso, Remez è una routine di ottimizzazione specializzata per un determinato compito. E la domanda è: hanno risolto i solutori generici e non c'è più bisogno di un risolutore così specializzato? Certo, potrei sbagliarmi.
Hans W.
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.