죄송합니다. 저는 파이썬과 스택 흐름이 처음입니다. 그래서 이미지를 게시 할 수 없습니다.
파이썬에서 curve_fit 함수로 멱 법칙 회귀를하고 싶습니다. 그러나 그 결과는 나에게 아주 이상합니다. 나는 그것을 더 확인하기 위해 엑셀을 사용합니다. 이 둘 사이에는 큰 차이가 있습니다. 검은 색 선은 curve_fit의 결과이고 빨간색 선의 매개 변수는 excel입니다. 누군가 나에게 차이점을 알려줄 수 있습니까? 감사합니다!
x=[164000,400,13000,700,57000,108,12000]
y=[0.011970,0.000098,0.066100,0.004300,0.042600,0.000061,0.002858 ]
def f(x,a,b):
return a*x**b
popt,pocv=curve_fit(f,x,y)
ax.set_xscale("log")
ax.set_yscale("log")
ax.set_ylim(0.00001,0.1)
ax.set_xlim(10,1000000)
ax.scatter(x,y)
px=np.linspace(10,1000000,1000)
#parameter form curve_fit
py=a*px**b
[enter image description here][1]
#parameter from excel
pyy=3E-6*px**0.8305
ax.loglog(px,pyy,color="red")
ax.loglog(px,py,color="k")
로그-로그 공간에 데이터를 플로팅한다는 사실은 로그 공간에 적합한 힌트를 제공해야 합니다 . 즉 np.log(a*x**b)
, np.log(y)
. 실제로 실행되고 잘 맞는 스크립트 수정은 다음과 같습니다.
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
x=[164000,400,13000,700,57000,108,12000]
y=[0.011970,0.000098,0.066100,0.004300,0.042600,0.000061,0.002858 ]
def f(x, a, b):
return np.log(a*x**b)
popt,pcov=curve_fit(f, x, np.log(y), [1.e-6, 0.9])
ax = plt.gca()
ax.set_xscale("log")
ax.set_yscale("log")
ax.set_ylim(0.00001,0.1)
ax.set_xlim(10,1000000)
ax.scatter(x,y)
px = np.linspace(10,1000000,1000)
a, b = popt
print("Parameters: a=%g, b=%g" % (a, b))
#parameter form curve_fit
py=a*px**b
#parameter from excel
pyy=3e-6*px**0.8305
ax.loglog(px,pyy, color="red")
ax.loglog(px,py, color="k")
plt.show()
항상 매개 변수에 대한 초기 값을 제공하고 결과를 인쇄해야합니다. 예를 들어, 이것을 실행하면 출력되고 Parameters: a=2.78612e-06, b=0.829763
두 예측 라인이 서로 거의 위에있는 것을 보여줍니다.
더 나은 곡선 맞춤 경험을 위해 lmfit
( https://lmfit.github.io/lmfit-py/ ) 유용 할 수 있습니다 (예, 저는 주 저자이며 편향적입니다). 를 사용하면 다음 lmfit
과 같이 적합 할 수 있습니다.
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from lmfit import Model
x=[164000,400,13000,700,57000,108,12000]
y=[0.011970,0.000098,0.066100,0.004300,0.042600,0.000061,0.002858 ]
def f(x, a, b):
return np.log(a*x**b)
model = Model(f)
params = model.make_params(a=1.e-6, b=0.9)
result = model.fit(np.log(y), params, x=x)
print(result.fit_report())
px = np.linspace(10,1000000,1000)
plt.scatter(x,y)
plt.loglog(px, np.exp(result.eval(x=px)), color="k")
plt.show()
lmfit에서 매개 변수는 모델 함수 의 이름을 사용하여 이름 이 지정f()
됩니다. 이렇게하면 추정 된 불확실성이 포함 된 적합 보고서가 인쇄됩니다.
[[Model]]
Model(f)
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 16
# data points = 7
# variables = 2
chi-square = 14.7591170
reduced chi-square = 2.95182340
Akaike info crit = 9.22165592
Bayesian info crit = 9.11347621
[[Variables]]
a: 2.7861e-06 +/- 6.3053e-06 (226.31%) (init = 1e-06)
b: 0.82976271 +/- 0.25700150 (30.97%) (init = 0.9)
[[Correlations]] (unreported correlations are < 0.100)
C(a, b) = -0.958
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다