Thuật toán Remez


14

Thuật toán Remez là một thói quen lặp nổi tiếng để tính gần đúng một hàm theo một đa thức trong định mức minimax. Nhưng, như Nick Trefethen [1] nói về nó:

Hầu hết các [triển khai] này đã quay trở lại trong nhiều năm và trên thực tế, hầu hết chúng không giải quyết được vấn đề gần đúng tốt nhất như đã nêu ở trên mà là các biến thể liên quan đến các biến rời rạc hoặc lọc kỹ thuật số. Người ta có thể tìm thấy một vài chương trình máy tính khác đang lưu hành, nhưng nhìn chung, có vẻ như hiện tại không có chương trình nào được sử dụng rộng rãi để tính toán các xấp xỉ tốt nhất.

Người ta cũng có thể tính toán giải pháp minimax bằng cách áp dụng tối ưu hóa bình phương hoặc lồi tối thiểu, ví dụ như sử dụng Matlab và hộp công cụ CVX miễn phí được áp dụng cho hàm Runge trên [-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

Phép tính gần đúng với đa thức Ch Quashev có một chỉ tiêu minimax 0.1090trong khi cách tiếp cận này ở đây đạt đến mức tối thiểu 0.0654, cùng giá trị được tính toán với thuật toán Remez trong chebfunhộp công cụ Matlab .

Có bất kỳ lợi thế nào trong việc áp dụng thuật toán Remez phức tạp hơn nếu bạn có thể tính toán giải pháp minimax nhanh hơn và chính xác hơn với một bộ giải tối ưu hóa? Có bất kỳ báo cáo / bài viết so sánh hai phương pháp này về một số vấn đề khó khăn hoặc trường hợp thử nghiệm không?

-
[1] R. Pachon và LN Trefethen. BIT Toán số (2008) Tập. 46.

Câu trả lời:


4

Câu trả lời "đúng" phụ thuộc rất nhiều vào những gì bạn cần gần đúng. Bạn có thực sự cần xấp xỉ tốt nhất cho một số lỗi bị ràng buộc? Hay chỉ là một xấp xỉ tốt? Hay chỉ là một xấp xỉ tốt theo nghĩa minmax?

Nick Trefethen gần đây đã đưa ra một ví dụ hay trong đó xấp xỉ Remez là một ý tưởng tồi vì nó giảm thiểu lỗi tối đa bất kể lỗi trung bình trong toàn bộ khoảng thời gian, có thể không phải là điều bạn muốn. Tất nhiên, lỗi tối đa có thể lớn, nhưng điều này được giới hạn cho các chức năng trơn tru.

Cập nhật

Sau phần thảo luận trong các bình luận bên dưới, tôi đã tải xuống Hộp công cụ CVX và so sánh trực tiếp với thuật toán Chebfun Remez (từ chối trách nhiệm: Tôi là một phần của nhóm phát triển 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' );

Sau rất nhiều đầu ra, tôi nhận được, trên máy tính xách tay của tôi với Matlab 2012a, CVX phiên bản 1.22 và Ảnh chụp SVN mới nhất của Chebfun:

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

Lưu ý rằng Chebfun fđược sử dụng để đo lỗi là chính xác đến 15 chữ số. Vì vậy, Remez của Chebfun mất gấp đôi thời gian, nhưng bị lỗi toàn cầu nhỏ hơn. Cần chỉ ra rằng CVX sử dụng mã được biên dịch để tối ưu hóa trong khi Chebfun là Matlab bản địa 100%. Lỗi tối thiểu 0.00654là lỗi tối thiểu 'trên lưới', ngoài lưới đó, lỗi có thể lên đến 0.00659. Tăng kích thước lưới để m = 1001tôi nhận được

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

tức là gần như cùng tốc độ, nhưng tối ưu hóa rời rạc vẫn tệ hơn kể từ chữ số thập phân thứ tư. Cuối cùng, tăng kích thước lưới hơn nữa để m = 10001tôi có được

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

tức là tối ưu hóa rời rạc bây giờ chậm hơn mười lần và vẫn còn tệ hơn so với chữ số thứ sáu.

Điểm mấu chốt là Remez sẽ giúp bạn có được kết quả tối ưu toàn cầu. Mặc dù các tín hiệu tương tự rời rạc có thể nhanh trên các lưới nhỏ, nhưng nó sẽ không cho kết quả chính xác.


Và N. Trefethen đã nhấn mạnh tương tự và đưa ra một ví dụ tương tự trong bài báo tôi đang trích dẫn. Câu hỏi không phải là về xấp xỉ tốt nhất, nhưng: Ưu điểm của thuật toán Remez (ngày nay) là gì nếu bạn có thể nhận được kết quả tương tự với một bộ giải lồi hợp lý ?
Hans W.

1
@HansWerner, tôi xin lỗi, tôi đã đọc sai câu hỏi của bạn. Bộ giải lồi của bạn không cho bạn kết quả như nhau, ít nhất là không phải với tất cả các chữ số. Nếu tôi hiểu chính xác mã lồi của bạn, bạn sẽ giảm thiểu lỗi tối đa trên một tập hợp các điểm riêng biệt. Đây là một xấp xỉ tốt của - nhưng không giống như - giảm thiểu lỗi tối đa toàn cầu.
Pedro

Bộ giải lồi trong trường hợp này cho kết quả tốt hơn . Hãy nghĩ về nó, thuật toán Remez là một quy trình lặp, khá giống với một thói quen tối ưu hóa và cũng sẽ không trả về một kết quả chính xác. Trong trường hợp cụ thể ở trên, giải pháp từ tối ưu hóa là tốt hơn, tức là có một chỉ tiêu tối đa tổng thể nhỏ hơn, so với kết quả từ việc thực hiện Remez tốt nhất mà tôi biết. Câu hỏi vẫn còn bỏ ngỏ .
Hans W.

@HansWerner, làm thế nào bạn đo được sai số tối đa của giải pháp thu được với bộ giải lồi? Thuật toán Remez chebfunnên lặp đi lặp lại cho đến khi đạt được mức tối thiểu cho độ chính xác của máy (theo một nghĩa nào đó).
Pedro

Không cần thiết; có các tùy chọn như 'tol' (là dung sai tương đối) hoặc 'maxiter' cho chebfun/remez, nhưng có các tùy chọn tương tự cho tất cả các loại bộ giải tối ưu hóa. Theo một cách mà người ta có thể nói, Remez là một thói quen tối ưu hóa chuyên biệt cho một nhiệm vụ nhất định. Và câu hỏi là: Những người giải quyết mục đích chung có bắt kịp và không cần thiết nữa cho một người giải quyết chuyên ngành như vậy không? Tất nhiên, tôi có thể sai.
Hans W.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.