Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cách triển khai thuật toán Nelder-Mead bằng SciPy trong Python

Thư viện SciPy có thể dùng để thực hiện các phép tính khoa học phức tạp với tốc độ cao, hiệu quả tốt. Thuật toán Nelder-Mead còn được gọi là thuật toán tìm kiếm đơn hình (simplex search algorithm).

Đây được coi là một trong những thuật toán tốt nhất để giải quyết bài toán ước lượng tham số và bài toán thống kê. Phù hợp sử dụng khi giá trị hàm không xác định hoặc có nhiều nhiễu đi kèm.

Thuật toán này cũng có thể dùng cho các hàm không liên tục xuất hiện thường xuyên trong thống kê. Đây là thuật toán đơn giản và dễ hiểu. Dùng để tối thiểu hóa tham số của hàm phi tuyến trong trường hợp tối ưu hóa không ràng buộc đa chiều.

Không khuyến khích dùng thuật toán này để tìm giá trị gradient tối ưu vì có thể mất thời gian dài.

Hãy xem ví dụ:

Ví dụ

import numpy as np
from scipy.optimize import minimize

def f(x):
    return .6 * (1 - x[0])**2

result = minimize(f, [2, -1], method="Nelder-Mead")
print(result)

Đầu ra

final_simplex: (array([[ 1. , -1.27109375],
        [ 1. , -1.27118835],
        [ 1. , -1.27113762]]), array([0., 0., 0.]))
    fun: 0.0
    message: 'Optimization terminated successfully.'
    nfev: 147
    nit: 69
    status: 0
    success: True
    x: array([ 1. , -1.27109375])

Giải thích

  • Nhập các thư viện cần thiết.
  • Định nghĩa hàm 'f' nhận một giá trị làm đối số và thực hiện một số phép tính toán học trên nó.
  • Hàm này được gọi bên ngoài định nghĩa hàm để truyền cho hàm 'f' tính toán giá trị.
  • Hàm này được truyền làm tham số cho hàm minimize trong lớp optimize của thư viện scipy.
  • Đầu ra này được hiển thị trên console.

Giải thích kết quả:

  • x: Điểm tối ưu tìm được [1.0, -1.271]
  • fun: Giá trị hàm tại điểm tối ưu (0.0)
  • nfev: Số lần đánh giá hàm (147)
  • nit: Số lần lặp (69)
  • success: True - Tối ưu hóa thành công

Lưu ý: Nelder-Mead không yêu cầu đạo hàm của hàm mục tiêu, phù hợp cho hàm không khả vi hoặc có nhiễu.