![](/img/trans.png)
[英]Python and lmfit: How to fit multiple datasets with shared parameters?
[英]Python LMFIT restriction fit parameters
我正在嘗試使用針對非線性函數的LMFIT庫使函數適合Python中的某些數據。 這很容易,但是我想知道是否有辦法限制擬合值的某些屬性。
例如,在下面的代碼中,我適合我的數據以優化值A,B和C。但是我還希望A與B的比率為pi / 4某個整數的倍。 有沒有辦法施加這種限制?
from lmfit import Model
import numpy
from numpy import cos, sin, pi, linspace
上傳數據:
data = numpy.genfromtxt('data')
axis = numpy.genfromtxt('axis')
定義功能:
def func(x, A, B, C):
return (A*cos(x)*cos(x) + B*sin(x)*sin(x) + 2*C*sin(x)*cos(x))**2
我必須對我的參數進行初步猜測:
a = 0.009
b = 0.3
c = 0.3
然后創建一個適合我功能的模型:
func_model = Model(func)
使用初始猜測值將函數擬合為輸入數據(A = a,B = b,C = c):
result = func_model.fit(data, x=axis, A = a, B = b, C = c)
fitted_vals = result.best_values #dictionary structure
Afit = fitted_vals['A']
Bfit = fitted_vals['B']
Cfit = fitted_vals['C']
如何確定Afit與Bfit的比率是某個整數的pi / 4倍?
如果不可能,是否有人知道具有此功能的軟件?
標准擬合的問題是雅可比估計。 如果參數是離散的,則幾乎在任何地方導數均為零。 一種解決方法可能是使用帶有自定義殘差函數的leastsq
並另外提供導數。 可以在殘差函數中設置參數離散,但在導數中使其連續。 我並不是說這是解決此類問題的常規方法,但是在使用OP功能的情況下,它的工作效果還不錯。
編輯-代碼為:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import leastsq
def f0( x, A, B, C ):
return ( A * np.cos( x )**2 + B * np.sin( x )**2 + 2 * C * np.sin( x ) * np.cos( x ) )
def func(x, A, B, C):
return f0( x, A, B, C )**2
a = 0.009
b = 0.3
c = 0.4
xList = np.linspace( -1, 6, 500 )
yList = np.fromiter( ( func( x, a, b, c ) for x in xList ), np.float )
def residuals( p, x, y ):
return func(x, p[0], int(p[1]) * np.pi / 2. * p[0], p[2] ) - y
def dfunc( p, x, y ): #Derivative
return [
f0( x, p[0], int( p[1] ) * np.pi / 2. * p[0] , p[2] ) * ( np.cos( x )**2 + p[1] * np.pi / 2. * np.sin( x )**2 ),
f0( x, p[0], int( p[1] ) * np.pi / 2. * p[0] , p[2] ) * ( p[0] * np.pi / 2.* np.sin( x )**2 ),
f0( x, p[0], int( p[1] ) * np.pi / 2. * p[0] , p[2] ) * ( 2 * np.sin( x ) * np.cos( x ) ),
]
plsq, cov, infodict, mesg, ier = leastsq( residuals, [ 0.009, .3/.01, .4 ], args=( xList, yList ), Dfun=dfunc, col_deriv=1, full_output=True )
fit = func(xList, plsq[0], int( plsq[1] ) * np.pi / 2. * plsq[0], plsq[2] )
print plsq
print int( plsq[1] )
fig1 = plt.figure( 1, figsize=( 6, 4 ), dpi=80 )
ax = fig1.add_subplot( 1, 1, 1 )
ax.plot( xList, yList )
ax.plot( xList, fit, ls='--')
plt.show()
提供:
>>[8.68421935e-03 2.22248626e+01 4.00032135e-01]
>>22
我認為答案是否定的。scipy.optimize中的求解器優化lmfit換行不支持離散變量,僅支持連續變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.