Python bình phương tối thiểu 3D

Curve_fit là một phần của scipy. tối ưu hóa và trình bao bọc cho scipy. tối ưu hóa. leastsq khắc phục khả năng sử dụng kém của nó. Giống như leastsq, trong nội bộ Curve_fit sử dụng phương pháp gradient Levenburg-Marquardt [thuật toán tham lam] để giảm thiểu hàm mục tiêu

Hãy để chúng tôi tạo một số dữ liệu đồ chơi

import numpy

# Generate artificial data = straight line with a=0 and b=1
# plus some noise.
xdata = numpy.array[[0.0,1.0,2.0,3.0,4.0,5.0]]
ydata = numpy.array[[0.1,0.9,2.2,2.8,3.9,5.1]]
# Initial guess.
x0    = numpy.array[[0.0, 0.0, 0.0]]

Lỗi dữ liệu cũng có thể dễ dàng được cung cấp

sigma = numpy.array[[1.0,1.0,1.0,1.0,1.0,1.0]]

Hàm mục tiêu dễ dàng [nhưng ít tổng quát hơn] được định nghĩa là mô hình

def func[x, a, b, c]:
    return a + b*x + c*x*x

Cách sử dụng rất đơn giản

import scipy.optimize as optimization

print optimization.curve_fit[func, xdata, ydata, x0, sigma]

Điều này đưa ra ước tính tham số thực tế [a=0. 1, b=0. 88142857, c=0. 02142857] và ma trận hiệp phương sai 3x3

scipy. tối ưu hóa. nhỏ nhấtq¶

scipy cung cấp một phương thức gọi là leastsq như là một phần của gói tối ưu hóa của nó. Tuy nhiên, có hai vấn đề

  • Phương pháp này không được ghi chép đầy đủ [không có ví dụ dễ hiểu]
  • Ước tính lỗi/hiệp phương sai trên các tham số phù hợp không dễ dàng để có được

Trong nội bộ, leastsq sử dụng phương pháp gradient Levenburg-Marquardt [thuật toán tham lam] để giảm thiểu hàm điểm

Bước đầu tiên là khai báo hàm mục tiêu cần được tối thiểu hóa

# The function whose square is to be minimised.
# params .. list of parameters tuned to minimise function.
# Further arguments:
# xdata .. design matrix for a linear model.
# ydata .. observed data.
def func[params, xdata, ydata]:
    return [ydata - numpy.dot[xdata, params]]

Dữ liệu đồ chơi bây giờ cần được cung cấp theo cách phức tạp hơn

# Provide data as design matrix: straight line with a=0 and b=1 plus some noise.
xdata = numpy.transpose[numpy.array[[[1.0,1.0,1.0,1.0,1.0,1.0],
              [0.0,1.0,2.0,3.0,4.0,5.0]]]]

Bây giờ, chúng ta có thể sử dụng phương pháp bình phương nhỏ nhất

print optimization.leastsq[func, x0, args=[xdata, ydata]]

Lưu ý đối số args, cần thiết để truyền dữ liệu cho hàm

Điều này chỉ cung cấp các ước tính tham số [a=0. 02857143, b=0. 98857143]

Thiếu vững chắc¶

Các phương pháp chuyển màu như Levenburg-Marquardt được sử dụng bởi leastsq/curve_fit là các phương pháp tham lam và chỉ đơn giản chạy vào mức tối thiểu cục bộ gần nhất

Chủ Đề