Scipy.optimizeのleastsq関数を使用して、直線と2次曲線を以下のデータセットにどのように適合させますか?私はそれを行うためにpolyfitを使用する方法を知っています。しかし、私はleastsq関数を使用する必要があります。
次にxおよびyデータセットを示します。
x: 1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7
y: 6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828
誰かが私を助けてくれますか?
Leastsq()メソッドは、エラー関数(yExperimentalとyFitの差)を最小化するパラメーターのセットを見つけます。タプルを使用して、線形および二次近似のパラメーターとラムダ関数を渡しました。
leastsqは最初の推測(パラメーターの初期タプル)から始まり、エラー関数を最小化しようとします。最後に、leastsqが成功すると、データに最適なパラメーターのリストが返されます。 (私はそれを見るために印刷しました)。よろしくお願いします
from scipy.optimize import leastsq
import numpy as np
import matplotlib.pyplot as plt
def main():
# data provided
x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7])
y=np.array([6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828])
# here, create lambda functions for Line, Quadratic fit
# tpl is a Tuple that contains the parameters of the fit
funcLine=lambda tpl,x : tpl[0]*x+tpl[1]
funcQuad=lambda tpl,x : tpl[0]*x**2+tpl[1]*x+tpl[2]
# func is going to be a placeholder for funcLine,funcQuad or whatever
# function we would like to fit
func=funcLine
# ErrorFunc is the diference between the func and the y "experimental" data
ErrorFunc=lambda tpl,x,y: func(tpl,x)-y
#tplInitial contains the "first guess" of the parameters
tplInitial1=(1.0,2.0)
# leastsq finds the set of parameters in the Tuple tpl that minimizes
# ErrorFunc=yfit-yExperimental
tplFinal1,success=leastsq(ErrorFunc,tplInitial1[:],args=(x,y))
print " linear fit ",tplFinal1
xx1=np.linspace(x.min(),x.max(),50)
yy1=func(tplFinal1,xx1)
#------------------------------------------------
# now the quadratic fit
#-------------------------------------------------
func=funcQuad
tplInitial2=(1.0,2.0,3.0)
tplFinal2,success=leastsq(ErrorFunc,tplInitial2[:],args=(x,y))
print "quadratic fit" ,tplFinal2
xx2=xx1
yy2=func(tplFinal2,xx2)
plt.plot(xx1,yy1,'r-',x,y,'bo',xx2,yy2,'g-')
plt.show()
if __name__=="__main__":
main()
from scipy.optimize import leastsq
import scipy as sc
import numpy as np
import matplotlib.pyplot as plt
optimize.curve_fitを使用すると、コードがより簡単になり、residual(error)関数を定義する必要がなくなります。
fig, ax = plt.subplots ()
# data
x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7])
y=np.array([6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828])
# modeling functions
def funcLine(x, a,b):
return a*x+b
def funcQuad(x, a, b, c):
return a*x**2+b*x+c
# optimize constants for the linear function
constantsLine, _ = sc.optimize.curve_fit (funcLine, x, y)
X=np.linspace(x.min(),x.max(),50)
Y1=funcLine(X, *constantsLine)
# optimize constants for the quadratic function
constantsQuad, _ = sc.optimize.curve_fit (funcQuad, x, y)
Y2=funcQuad(X,*constantsQuad)
plt.plot(X,Y1,'r-',label='linear approximation')
plt.plot(x,y,'bo',label='data points')
plt.plot(X,Y2,'g-', label='quadratic approximation')
matplotlib.pylab.legend ()
ax.set_title("Nonlinear Least Square Problems", fontsize=18)
plt.show()
これは非常に単純な例です。放物面のように成長する側面を持つボウルのような放物面を想像してください。座標(x、y)=(a、b)に底を置き、xとyのすべての値にわたって放物面の高さを最小化すると、最小値はx = aとy = bになると予想されます。これを行うコードは次のとおりです。
import random
from scipy.optimize import least_squares
a, b = random.randint(1, 1000), random.randint(1, 1000)
print("Expect", [a, b])
def f(args):
x, y = args
return (x-a)**2 + (y-b)**2
x0 = [-1, -3]
result = least_squares(fun=f, x0=x0)
print(result.x)