5

Tôi đang sử dụng scipy.optimize.curve_fit, nhưng tôi nghi ngờ nó hội tụ với mức tối thiểu địa phương và không tối thiểu toàn cầu.Đường cong tối thiểu toàn cầu SciPy phù hợp với

tôi đã cố gắng sử dụng ủ mô phỏng theo cách sau:

def fit(params): 
return np.sum((ydata - specf(xdata,*params))**2) 

p = scipy.optimize.anneal(fit,[1000,1E-10]) 

nơi specf là đường cong tôi đang cố gắng để phù hợp. Các kết quả trong p mặc dù rõ ràng tệ hơn mức tối thiểu được trả lại bởi curve_fit ngay cả khi giá trị trả lại cho biết mức tối thiểu toàn cầu đã đạt được (see anneal).

Làm cách nào để cải thiện kết quả? Có một fitter đường cong toàn cầu trong SciPy?

Trả lời

4

Bạn nói đúng, nó chỉ hội tụ về mức tối thiểu địa phương (khi nó hội tụ) vì nó sử dụng thuật toán Levenburg-Marquardt. Không có fitter đường cong toàn cầu trong SciPy, bạn phải viết cho bạn sở hữu bằng cách sử dụng existing global optimizers. Nhưng lưu ý, rằng điều này vẫn không phải hội tụ với giá trị bạn muốn. Đó là impossible trong hầu hết các trường hợp.

Phương pháp duy nhất để cải thiện kết quả của bạn là đoán các thông số khởi động khá tốt.

+0

Cảm ơn câu trả lời. Tôi nhận ra những rắc rối trong tối ưu hóa toàn cầu nhưng tôi đoán (hy vọng) rằng đường bao này là hành vi tương đối tốt. Cách tiếp cận của tôi trong việc sử dụng định mức L2 để đo lường chính xác có đúng không? – Gus

3

Bạn có thể muốn thử sử dụng leastsq() (curve_fit thực sự sử dụng điều này, nhưng bạn không nhận được đầu ra đầy đủ) hoặc ODR package thay vì curve_fit.

Đầu ra đầy đủ của giá trị nhỏ nhất() cung cấp cho bạn nhiều thông tin hơn, chẳng hạn như giá trị được chấp nhận (nếu bạn muốn sử dụng giá trị đó như một sự kiểm tra vừa vặn nhanh chóng và bẩn).

Nếu bạn cần phải cân phù hợp, bạn có thể chỉ là theo cách này:

fitfunc = lambda p,x: p[0]+ p[1]*exp(-x) 
errfunc = lambda p, x, y, xerr: (y-fitfunc(p,x))/xerr 
out = leastsq(errfunc, pinit, args=(x,y, xerr), full_output=1) 
chisq=sum(infodict['fvec']*infodict['fvec']) 
1

Đây là vấn đề không tầm thường. Bạn đã cân nhắc sử dụng chiến lược tiến hóa chưa? Tôi đã thành công rực rỡ với ecspy (xem http://code.google.com/p/ecspy/) và cộng đồng thì nhỏ nhưng rất hữu ích.