Tôi đang cố gắng để giảm thiểu một hàm mẫu sau:Làm cách nào để sử dụng triển khai thực hiện levenberg không được hỗ trợ bởi Eigen?
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
Một cách thông thường để giảm thiểu một funct như vậy có thể là thuật toán Levenberg-Marquardt. Tôi muốn thực hiện việc giảm thiểu này trong C++ và đã thực hiện một số thử nghiệm ban đầu với Eigen dẫn đến giải pháp dự kiến.
Câu hỏi của tôi là như sau: Tôi được sử dụng để tối ưu hóa trong trăn bằng cách sử dụng tức là scipy.optimize.fmin_powell
. Ở đây các tham số hàm đầu vào là (func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None)
. Vì vậy, tôi có thể xác định một func(x0)
, cung cấp cho vector x0
và bắt đầu tối ưu hóa. Nếu cần, tôi có thể thay đổi thông số tối ưu hóa.
Bây giờ thuật toán Eigen Lev-Marq hoạt động theo một cách khác. Tôi cần phải xác định một chức năng vector (tại sao?) Hơn nữa tôi không thể quản lý để thiết lập các thông số tối ưu hóa. Theo:
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.html
Tôi có thể sử dụng setEpsilon()
và các chức năng được đặt khác.
Nhưng khi tôi có đoạn mã sau:
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.setEpsilon(); //doesn't exist!
Vì vậy, tôi có 2 câu hỏi:
Tại sao một vector chức năng cần thiết và tại sao không phải là một hàm vô hướng là đủ?
Tài liệu tham khảo mà tôi đã tìm kiếm một câu trả lời:
http://www.ultimatepp.org/reference$Eigen_demo$en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.phpLàm thế nào để thiết lập các thông số tối ưu hóa bằng cách sử dụng các chức năng thiết lập?
tôi kiểm tra mã mẫu của bạn như tôi cần làm một cái gì đó tương tự và nhận thấy rằng nếu thay vì tổng hợp 10 * pow (x (0) +3,2) + pow (x (1) -5, 2) trong f (0) và thiết lập f (1) 0 bạn đặt 10 * pow (x (0) +3,2) trong f (0) và pow (x (1) -5, 2) trong f (1) nó hội tụ ALOT nhanh hơn. Tại 30 lần lặp lại với việc tách các điều khoản, tôi đã có thể đạt tới mức độ chính xác thứ 100 và theo cách bạn đã thực hiện, mất khoảng 500. – coderdave
Đúng vậy! Nó có lẽ là do NumericalDiff. Câu hỏi tôi đã có là nếu nó có thể ở tất cả để chỉ có một vô hướng chức năng ở tất cả hoặc nếu có luôn luôn cần cho các vectơ chức năng khác nhau. Bằng cách viết nó theo cách này, tôi có thể định nghĩa f (0) và đặt f (1) thành 0. Để làm cho nó nhanh hơn tôi có thể chia chức năng thực sự trong f (0) và f (1), hoặc tạo một df sao cho chức năng NumericalDiff không còn cần thiết nữa. Hơn nữa, tôi đã ngừng sử dụng thuật toán Lev-Marq này và sử dụng thuật toán của riêng mình để có hiệu suất tốt hơn về tốc độ cho một vector chức năng với ~ 1500 mục ... – Deepfreeze
Ví dụ mã ở trên dường như được lấy từ ví dụ này [CurveFitting.cpp] (https://github.com/daviddoria/Examples/blob/master/c%2B%2B/Eigen/LevenbergMarquardt/CurveFitting.cpp). – nils