2011-08-23 35 views
13

Tôi là một chút về chiều sâu của tôi về toán học liên quan đến vấn đề của tôi, vì vậy tôi xin lỗi vì bất kỳ danh pháp không chính xác nào.python phi tuyến ít nhất vuông phù hợp

Tôi đã xem xét sử dụng hàm tối thiểu của hàm scipy, nhưng không chắc liệu đó có phải là hàm chính xác hay không. Tôi có phương trình sau:

eq = lambda PLP,p0,l0,kd : 0.5*(-1-((p0+l0)/kd) + np.sqrt(4*(l0/kd)+(((l0-p0)/kd)-1)**2)) 

Tôi có dữ liệu (8 bộ) cho tất cả các điều khoản trừ kd (PLP, p0, l0). Tôi cần tìm giá trị của kd bằng hồi quy phi tuyến tính của phương trình trên. Từ các ví dụ tôi đã đọc, dường như không cho phép nhập dữ liệu, để có được kết quả tôi cần.

Cảm ơn bạn đã giúp đỡ của bạn

Trả lời

33

Đây là một bare-bones ví dụ về cách sử dụng scipy.optimize.leastsq:

import numpy as np 
import scipy.optimize as optimize 
import matplotlib.pylab as plt 

def func(kd,p0,l0): 
    return 0.5*(-1-((p0+l0)/kd) + np.sqrt(4*(l0/kd)+(((l0-p0)/kd)-1)**2)) 

Tổng số các ô vuông của residuals là chức năng của kd chúng tôi đang cố gắng để giảm thiểu:

def residuals(kd,p0,l0,PLP): 
    return PLP - func(kd,p0,l0) 

Ở đây tôi tạo một số dữ liệu ngẫu nhiên. Thay vào đó, bạn muốn tải dữ liệu thực của mình vào đây.

N=1000 
kd_guess=3.5 # <-- You have to supply a guess for kd 
p0 = np.linspace(0,10,N) 
l0 = np.linspace(0,10,N) 
PLP = func(kd_guess,p0,l0)+(np.random.random(N)-0.5)*0.1 

kd,cov,infodict,mesg,ier = optimize.leastsq(
    residuals,kd_guess,args=(p0,l0,PLP),full_output=True,warning=True) 

print(kd) 

mang lại một cái gì đó giống như

3.49914274899 

Đây là giá trị phù hợp nhất cho kd tìm thấy bằng optimize.leastsq.

Ở đây chúng ta tạo ra các giá trị của PLP sử dụng giá trị cho kd chúng tôi chỉ tìm thấy:

PLP_fit=func(kd,p0,l0) 

Dưới đây là một âm mưu của PLP so p0. Đường màu xanh là từ dữ liệu, đường màu đỏ là đường cong phù hợp nhất.

plt.plot(p0,PLP,'-b',p0,PLP_fit,'-r') 
plt.show() 

enter image description here

+0

cảm ơn bạn rất nhiều, tôi đã thêm dữ liệu của mình nhưng không hoạt động. Tôi tiếp tục điều chỉnh giá trị kd_guess nhưng nhận được lỗi: ValueError: toán hạng không thể được phát cùng với hình dạng (15) (8) – Anake

+1

@Anake: Có vẻ như dữ liệu của bạn có hình dạng khác nhau. Hãy thử in 'len (PLP)', 'len (p0)' và 'len (l0) 'để chắc chắn rằng tất cả chúng đều có cùng số mục. – unutbu

2

Một lựa chọn khác là sử dụng lmfit.

Chúng cung cấp một số lớn example để giúp bạn bắt đầu:.

#!/usr/bin/env python 
#<examples/doc_basic.py> 
from lmfit import minimize, Minimizer, Parameters, Parameter, report_fit 
import numpy as np 

# create data to be fitted 
x = np.linspace(0, 15, 301) 
data = (5. * np.sin(2 * x - 0.1) * np.exp(-x*x*0.025) + 
     np.random.normal(size=len(x), scale=0.2)) 

# define objective function: returns the array to be minimized 
def fcn2min(params, x, data): 
    """ model decaying sine wave, subtract data""" 
    amp = params['amp'] 
    shift = params['shift'] 
    omega = params['omega'] 
    decay = params['decay'] 
    model = amp * np.sin(x * omega + shift) * np.exp(-x*x*decay) 
    return model - data 

# create a set of Parameters 
params = Parameters() 
params.add('amp', value= 10, min=0) 
params.add('decay', value= 0.1) 
params.add('shift', value= 0.0, min=-np.pi/2., max=np.pi/2) 
params.add('omega', value= 3.0) 


# do fit, here with leastsq model 
minner = Minimizer(fcn2min, params, fcn_args=(x, data)) 
kws = {'options': {'maxiter':10}} 
result = minner.minimize() 


# calculate final result 
final = data + result.residual 

# write error report 
report_fit(result) 

# try to plot results 
try: 
    import pylab 
    pylab.plot(x, data, 'k+') 
    pylab.plot(x, final, 'r') 
    pylab.show() 
except: 
    pass 

#<end of examples/doc_basic.py> 
+1

Liên kết này bị hỏng. Bạn vẫn có ví dụ này và có thể đăng nó ở đây không? – Cleb

+0

Liên kết hiện đã được cập nhật. –

+1

Cảm ơn, nó thực sự là một ví dụ tốt đẹp. – Cleb

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