2013-09-28 307 views
12

Tôi đang chuyển đổi một số mã Matlab thành python bằng cách sử dụng numpy. Mọi thứ hoạt động khá trơn tru nhưng gần đây tôi đã gặp phải chức năng fminsearch.tương tự numpy/scipy của fminsearch của MATLAB

Vì vậy, để cắt nó ngắn: là có một cách dễ dàng để thực hiện trong một cái gì đó trăn như thế này:

banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2; 
[x,fval] = fminsearch(banana,[-1.2, 1]) 

đó sẽ trở lại

x = 1.0000 1.0000 
fval = 8.1777e-010 

Cho đến bây giờ tôi đã không tìm thấy bất cứ điều gì trông có vẻ tương tự. Điều duy nhất tôi thấy tương tự là scipy.optimize.fmin. Dựa trên định nghĩa nó

Giảm thiểu chức năng bằng thuật toán đơn giản xuống dốc.

Nhưng ngay bây giờ tôi không thể tìm để viết mã Matlab nêu trên sử dụng chức năng này

Trả lời

15

Nó chỉ là một chuyển đổi thẳng về phía trước từ Matlab cú pháp cú pháp python:

import scipy.optimize 

banana = lambda x: 100*(x[1]-x[0]**2)**2+(1-x[0])**2 
xopt = scipy.optimize.fmin(func=banana, x0=[-1.2,1]) 

với đầu ra:

Optimization terminated successfully. 
     Current function value: 0.000000 
     Iterations: 85 
     Function evaluations: 159 
array([ 1.00002202, 1.00004222]) 
8

fminsearch thực hiện các phương pháp Nelder-Mead, xem Matlab tài liệu: http://www.mathworks.com/help/matlab/ref/fminsearch.html. Trong phần tham chiếu.

Để tìm số tương đương trong scipy, bạn chỉ cần kiểm tra chuỗi tài liệu của các phương thức được cung cấp trong scipy.optimize. Xem: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html#scipy.optimize.fmin. fmin cũng thực hiện phương pháp Nelder-Mead.

Tên không luôn dịch trực tiếp từ matlab thành scipy và đôi khi thậm chí gây hiểu lầm. Ví dụ: phương thức của Brent được triển khai dưới dạng fminbnd trong Matlab nhưng optimize.brentq trong scipy. Vì vậy, việc kiểm tra các chuỗi tài liệu luôn là một ý tưởng hay.