2015-02-06 17 views
27

Python của curve_fit tính toán các thông số phù hợp nhất cho một hàm với một biến độc lập duy nhất, nhưng là có một cách, sử dụng curve_fit hay cái gì khác, để phù hợp cho một chức năng với nhiều biến độc lập? Ví dụ:Python curve_fit với nhiều biến độc lập

def func(x, y, a, b, c): 
    return log(a) + b*log(x) + c*log(y) 

trong đó x và y là biến độc lập và chúng tôi muốn phù hợp cho a, b và c.

Trả lời

27

Bạn có thể vượt qua curve_fit mảng đa chiều cho các biến độc lập, nhưng sau đó func của bạn phải chấp nhận điều tương tự. Ví dụ, gọi mảng này X và giải nén nó vào x, y cho rõ ràng:

import numpy as np 
from scipy.optimize import curve_fit 

def func(X, a, b, c): 
    x,y = X 
    return np.log(a) + b*np.log(x) + c*np.log(y) 

# some artificially noisy data to fit 
x = np.linspace(0.1,1.1,101) 
y = np.linspace(1.,2., 101) 
a, b, c = 10., 4., 6. 
z = func((x,y), a, b, c) * 1 + np.random.random(101)/100 

# initial guesses for a,b,c: 
p0 = 8., 2., 7. 
print curve_fit(func, (x,y), z, p0) 

Cung cấp cho phù hợp:

(array([ 9.99933937, 3.99710083, 6.00875164]), array([[ 1.75295644e-03, 9.34724308e-05, -2.90150983e-04], 
    [ 9.34724308e-05, 5.09079478e-06, -1.53939905e-05], 
    [ -2.90150983e-04, -1.53939905e-05, 4.84935731e-05]])) 
+0

Nếu x và y không có cùng kích thước một cách để sửa đổi các giải pháp để sử dụng phù hợp với đường cong. Ví dụ, x = linspace (0,1,1,1,101) và y = np.array ([1.0,2.0])? –

+0

Tôi không chắc chắn tôi theo bạn: 'func' đại diện cho một hàm bivariate (lấy hai biến độc lập), do đó, cho phù hợp, nó phải được định nghĩa là cho kết quả f (x_i, y_i) cho bất kỳ giá trị đầu vào được cung cấp x_i và y_i . Nếu 'x' và' y' không có cùng kích thước thì bạn đang cố gắng đánh giá nó, ví dụ: tại một số 'x' nhưng với' y' undefined mà chắc chắn không thể được thực hiện. – xnx

0

Có, có: chỉ cần cung cấp curve_fit mảng đa chiều cho xData.

+0

Tôi đã cố gắng để lần x và y vào một mảng single 'z = [x, y], sao cho 'x = z [0] và' y = z [1] '. Nhưng 'curve_fit' dường như không thích điều đó và cho tôi một lỗi:' TypeError: loại toán hạng không được hỗ trợ cho /: 'list' và 'float'' – mcglashan

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