Алгоритм Ремеза


14

Алгоритм Remez - це добре відома ітеративна програма для наближення функції поліномом у нормі minimax. Але, як про це говорить Нік Трефефен [1]:

Більшість із цих [реалізацій] проходять багато років назад, і фактично більшість з них не вирішує загальну проблему найкращого наближення, поставлену вище, але варіанти, що передбачають дискретні змінні чи цифрову фільтрацію. В обігу можна знайти декілька інших комп’ютерних програм, але в цілому, здається, що зараз немає широко використовуваної програми для обчислення найкращих наближень.

Можна розрахувати рішення minimax також, застосувавши найменші квадрати або опуклу оптимізацію, наприклад, використовуючи Matlab та вільний інструментарій CVX, застосований до функції Runge на [-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

Наближення до поліномів Чебишева має 0.1090мінімальну норму, хоча цей підхід тут досягає мінімуму 0.0654, такого ж значення, яке обчислюється алгоритмом Remez в chebfunпанелі інструментів Matlab .

Чи є якась перевага у застосуванні складнішого алгоритму Remez, якщо ви можете обчислити рішення minimax швидше і точніше за допомогою оптимізатора? Чи є звіти / статті, що порівнюють ці два підходи щодо деяких складних проблем або тестових випадків?

-
[1] Р. Пашон та Л. Н. Трефетен. Числова математика BIT (2008) Vol. 46.

Відповіді:


4

"Правильна" відповідь сильно залежить від того, для чого вам потрібен ваш наближений. Вам справді потрібне найкраще наближення для деяких помилок? Або просто гарне наближення? Або просто гарне наближення у сенсі minmax?

Нещодавно Нік Трефетен дав приємний приклад коли наближення є поганою ідеєю, оскільки воно мінімізує максимальну помилку незалежно від середньої помилки протягом усього інтервалу, яка може бути не такою, яку ви хочете. Звичайно, максимальна похибка може бути великою, але це обмежено для плавних функцій.

Оновлення

Після обговорення в коментарях нижче, я завантажив CVX Toolbox і зробив пряме порівняння з алгоритмом Chebfun Remez (відмова від відповідальності: Я є членом команди розробників 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' );

Після багато результатів я отримую на своєму ноутбуці з Matlab 2012a, CVX версії 1.22 та найновішим знімком SVN Snabhot від Chebfun:

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

Зауважте, що Chebfun, який fвикористовується для вимірювання помилки, точний до 15 цифр. Тож Remez Chebfun займає вдвічі більше, але отримує меншу глобальну помилку. Слід зазначити, що CVX використовує для оптимізації скомпільований код, тоді як Chebfun є 100% рідним Matlab. Мінімальна помилка 0.00654- це мінімальна помилка "в сітці", поза цією сіткою помилка може бути до 0.00659. Збільшення розміру сітки m = 1001я отримую

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

тобто майже з однаковою швидкістю, але дискретна оптимізація все ж гірша за четвертий десятковий розряд. Нарешті, зменшуючи розмір сітки далі m = 10001я отримую

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

тобто дискретна оптимізація зараз більш ніж у десять разів повільніша і все ще гірша за показниками шостої цифри.

Суть полягає в тому, що Remez отримає вам глобально оптимальний результат. Хоча дискретний аналог може бути швидким на невеликих сітках, він не дасть правильного результату.


І Н. Трефефен наголосив на тому ж самому і навів подібний приклад у статті, яку я цитував. Питання полягало не в найкращому наближенні, а в тому, яка перевага алгоритму Remez (нині), якщо ви можете отримати той же результат за допомогою розумного опуклого розв'язувача ?
Ганс В.

1
@HansWerner, вибачте, я неправильно прочитав ваше запитання. Ваш опуклий розв'язувач не дає вам однакового результату, принаймні, не для всіх цифр. Якщо я правильно розумію ваш опуклий код, ви мінімізуєте максимальну помилку щодо дискретного набору точок. Це гарне наближення - але не те саме, що - мінімізація глобальної максимальної помилки.
Педро

Опуклий розв'язувач у цьому випадку дав кращий результат. Подумайте про це, алгоритм Remez - це ітеративна процедура, досить схожа на процедуру оптимізації, і не призведе до точного результату. У конкретному випадку вище рішення від оптимізації було кращим, тобто загалом меншою максимальною нормою, ніж результатом найкращої реалізації Remez, яку я знаю. Питання досі залишається відкритим .
Ганс В.

@HansWerner, як ти виміряв максимальну похибку розчину, одержаного опуклим розв’язувачем? Алгоритм Remez chebfunмає повторюватись до досягнення мінімального рівня машинної точності (у певному сенсі).
Педро

Не обов'язково; є такі варіанти, як "tol" (що є відносною толерантністю) або "maxiter" для chebfun/remez, але є аналогічні варіанти для всіх видів вирішувачів оптимізації. Певним чином можна сказати, що Remez - це програма оптимізації, спеціалізована для певного завдання. І питання полягає в тому: чи не наздогнали вирішувачі загального призначення і більше немає необхідності в такому спеціалізованому вирішувачі? Звичайно, я можу помилятися.
Ганс У.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.