SciPy - Tối ưu hóa
Các scipy.optimize packagecung cấp một số thuật toán tối ưu hóa thường được sử dụng. Mô-đun này chứa các khía cạnh sau:
Tối thiểu hóa không bị ràng buộc và bị ràng buộc của các hàm vô hướng đa biến (tối thiểu hóa ()) bằng cách sử dụng nhiều thuật toán (ví dụ: BFGS, Nelder-Mead simplex, Newton Conjugate Gradient, COBYLA hoặc SLSQP)
Quy trình tối ưu hóa toàn cầu (brute-force) (ví dụ: anneal (), basinhopping ())
Thuật toán thu nhỏ bình phương tối thiểu (tối thiểu ()) và phù hợp đường cong (curve_fit ())
Bộ giảm thiểu hàm đơn biến vô hướng (Minimalar_scalar ()) và bộ tìm gốc (newton ())
Bộ giải hệ phương trình đa biến (root ()) sử dụng nhiều thuật toán (ví dụ: hybrid Powell, Levenberg-Marquardt hoặc các phương pháp quy mô lớn như Newton-Krylov)
Giảm thiểu không bị ràng buộc & bị ràng buộc của các hàm vô hướng đa biến
Các minimize() function cung cấp một giao diện chung cho các thuật toán giảm thiểu không bị ràng buộc và hạn chế cho các hàm vô hướng đa biến trong scipy.optimize. Để chứng minh hàm tối thiểu hóa, hãy xem xét vấn đề tối thiểu hóa hàm Rosenbrock của các biến NN -
$$ f (x) = \ sum_ {i = 1} ^ {N-1} \: 100 (x_i - x_ {i-1} ^ {2}) $$
Giá trị nhỏ nhất của hàm này là 0, đạt được khi xi = 1.
Thuật toán Nelder – Mead Simplex
Trong ví dụ sau, quy trình thu nhỏ () được sử dụng với Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(được chọn thông qua tham số phương thức). Chúng ta hãy xem xét ví dụ sau.
import numpy as np
from scipy.optimize import minimize
def rosen(x):
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')
print(res.x)
Chương trình trên sẽ tạo ra kết quả sau.
[7.93700741e+54 -5.41692163e+53 6.28769150e+53 1.38050484e+55 -4.14751333e+54]
Thuật toán simplex có lẽ là cách đơn giản nhất để giảm thiểu một hàm hoạt động khá tốt. Nó chỉ yêu cầu đánh giá chức năng và là một lựa chọn tốt cho các vấn đề giảm thiểu đơn giản. Tuy nhiên, vì nó không sử dụng bất kỳ đánh giá gradient nào, nên có thể mất nhiều thời gian hơn để tìm ra mức tối thiểu.
Một thuật toán tối ưu hóa khác chỉ cần gọi hàm để tìm giá trị tối thiểu là Powell‘s method, có sẵn bằng phương thức setting = 'powell' trong hàm Reduce ().
Bình phương nhỏ nhất
Giải bài toán bình phương nhỏ nhất phi tuyến tính với giới hạn của các biến. Cho phần dư f (x) (một hàm thực m chiều của n biến thực) và hàm mất mát rho (s) (một hàm vô hướng), các hàm giá trị nhỏ nhất tìm thấy điểm cực tiểu cục bộ của hàm chi phí F (x). Chúng ta hãy xem xét ví dụ sau.
Trong ví dụ này, chúng tôi tìm thấy mức tối thiểu của hàm Rosenbrock không có giới hạn trên các biến độc lập.
#Rosenbrock Function
def fun_rosenbrock(x):
return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)
print res
Lưu ý rằng, chúng tôi chỉ cung cấp véc tơ của các phần dư. Thuật toán xây dựng hàm chi phí dưới dạng tổng bình phương của các phần dư, cho hàm Rosenbrock. Giá trị nhỏ nhất chính xác là x = [1.0,1.0].
Chương trình trên sẽ tạo ra kết quả sau.
active_mask: array([ 0., 0.])
cost: 9.8669242910846867e-30
fun: array([ 4.44089210e-15, 1.11022302e-16])
grad: array([ -8.89288649e-14, 4.44089210e-14])
jac: array([[-20.00000015,10.],[ -1.,0.]])
message: '`gtol` termination condition is satisfied.'
nfev: 3
njev: 3
optimality: 8.8928864934219529e-14
status: 1
success: True
x: array([ 1., 1.])
Tìm kiếm gốc rễ
Hãy để chúng tôi hiểu cách tìm gốc giúp ích cho SciPy.
Các hàm vô hướng
Nếu một phương trình có một biến, có bốn thuật toán tìm căn khác nhau, có thể được thử. Mỗi thuật toán này yêu cầu các điểm cuối của một khoảng trong đó gốc được mong đợi (vì hàm thay đổi dấu hiệu). Nói chung,brentq là lựa chọn tốt nhất, nhưng các phương pháp khác có thể hữu ích trong những trường hợp nhất định hoặc cho mục đích học tập.
Giải quyết điểm cố định
Một bài toán liên quan chặt chẽ đến việc tìm các số không của một hàm là bài toán tìm một điểm cố định của một hàm. Điểm cố định của một hàm là điểm mà tại đó đánh giá của hàm trả về điểm: g (x) = x. Rõ ràng là điểm cố định củagglà nghiệm nguyên của f (x) = g (x) −x. Tương tự, gốc củafflà điểm cố định của g (x) = f (x) + x. Điểm cố định thường trình cung cấp một phương pháp lặp lại đơn giản bằng cách sử dụngAitkens sequence acceleration để ước tính điểm cố định của gg, nếu một điểm bắt đầu được đưa ra.
Bộ phương trình
Tìm nghiệm nguyên của một tập phương trình phi tuyến tính có thể đạt được bằng cách sử dụng root() function. Một số phương pháp có sẵn, trong đóhybr (mặc định) và lm, lần lượt sử dụng hybrid method of Powell và Levenberg-Marquardt method từ MINPACK.
Ví dụ sau đây xem xét phương trình siêu việt một biến.
x2 + 2cos(x) = 0
Một gốc trong số đó có thể được tìm thấy như sau:
import numpy as np
from scipy.optimize import root
def func(x):
return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol
Chương trình trên sẽ tạo ra kết quả sau.
fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
nfev: 10
qtf: array([ -2.77644574e-12])
r: array([-3.34722409])
status: 1
success: True
x: array([-0.73908513])