2016-11-24 14 views
7

Tôi đã tự hỏi sự khác biệt giữa hai phương pháp scipy.optimize.leastsqscipy.optimize.least_squares là gì?Sự khác biệt giữa scipy.leastsq và scipy.least_squares

Khi tôi thực hiện với họ rằng họ mang lại sự khác biệt tối thiểu trong chi^2:

>>> solution0 = ((p0.fun).reshape(100,100)) 
>>> # p0.fun are the residuals of my fit function np.ravel'ed as returned by least_squares 
>>> print(np.sum(np.square(solution0))) 
0.542899505806 

>>> solution1 = np.square((median-solution1)) 
>>> # solution1 is the solution found by least_sq, it does not yield residuals thus I have to subtract it from the median to get the residuals (my special case) 
>>> print(np.sum((solution1))) 
0.54402852325 

Ai có thể mở rộng trên đó hoặc chỉ ra nơi tôi có thể tìm thấy một tài liệu khác, là từ scipy là một chút khó hiểu.

Trả lời

5

Từ các tài liệu cho least_squares, có thể thấy rằng leastsq là một trình bao bọc cũ hơn.

cũng

leastsq   Xem Một wrapper di sản để thực hiện MINPACK của thuật toán Levenberg-Marquadt.

Vì vậy, bạn chỉ nên sử dụng least_squares. Có vẻ như least_squares có chức năng bổ sung. Quan trọng nhất trong số đó là mặc định "phương pháp" (nghĩa là thuật toán) được sử dụng là khác nhau:

  • trf: Khu vực Tin tưởng thuật toán phản quang, đặc biệt thích hợp cho các vấn đề thưa thớt lớn với giới hạn. Nói chung là phương pháp mạnh mẽ.
  • dogbox: thuật toán dogleg với vùng tin cậy hình chữ nhật, trường hợp sử dụng điển hình là vấn đề nhỏ với giới hạn. Không được đề xuất cho các sự cố với Jacobian cấp bậc thiếu.
  • lm: Thuật toán Levenberg-Marquardt như được triển khai trong MINPACK. Không xử lý giới hạn và người Jacobs thưa thớt. Thông thường, phương pháp hiệu quả nhất đối với các vấn đề nhỏ không bị giới hạn.

Mặc định là trf. Xem Ghi chú để biết thêm thông tin.

Các cũ leastsq thuật toán chỉ là một wrapper cho phương pháp lm, mà — như các tài liệu nói — là tốt chỉ dành cho các vấn đề nhỏ không bị giới hạn.

Sự khác biệt bạn thấy trong kết quả có thể là do sự khác biệt trong thuật toán được sử dụng.

2

Trong least_squares bạn có thể cho ranh giới trên và dưới cho mỗi biến

Có một số tính năng hơn mà leastsq không cung cấp nếu bạn so sánh docstrings

2

Lý do chính để viết hàm Scipy mới least_squares là cho phép giới hạn trên và dưới trên các biến (còn được gọi là "ràng buộc hộp"). Đây là một tính năng được yêu cầu cao.

này dường như đơn giản Ngoài ra là thực sự xa các thuật toán hoàn toàn mới tầm thường và cần thiết, đặc biệt là dogleg (method="dogleg" trong least_squares) và sự tin tưởng vùng phản chiếu (method="trf"), trong đó cho phép một xử lý mạnh mẽ và hiệu quả hạn chế hộp (chi tiết trên các thuật toán được đưa ra trong các tham chiếu đến Scipy documentation).

Điều quan trọng nữa là sự hỗ trợ cho các vấn đề quy mô lớn và người Jacob thưa thớt.

Khi giới hạn trên các biến không cần thiết, và vấn đề là không phải là rất lớn, các thuật toán trong mới scipy chức năng least_squares có rất ít, nếu có, lợi thế đối với việc thực hiện Levenberg-Marquardt MINPACK sử dụng trong cũ leastsq với một.

Tuy nhiên, mã MINPACK Fortran rất giống nhau được gọi là cả cũ leastsq và bởi least_squares mới với tùy chọn method="lm". Vì lý do này, leastsq cũ hiện đã lỗi thời và không được khuyến nghị cho mã mới.

Các vấn đề liên quan