【发布时间】:2018-09-16 16:26:20
【问题描述】:
我正在尝试拟合幂律函数,以找到最佳拟合参数。但是,我发现如果参数的初始猜测不同,“最佳拟合”输出就会不同。除非我找到正确的初始猜测,否则我可以获得最佳优化,而不是局部优化。有没有办法找到**适当的初始猜测** ????。我的代码在下面列出。请随时输入。谢谢!
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
%matplotlib inline
# power law function
def func_powerlaw(x,a,b,c):
return a*(x**b)+c
test_X = [1.0,2,3,4,5,6,7,8,9,10]
test_Y =[3.0,1.5,1.2222222222222223,1.125,1.08,1.0555555555555556,1.0408163265306123,1.03125, 1.0246913580246915,1.02]
predict_Y = []
for x in test_X:
predict_Y.append(2*x**-2+1)
如果我与默认初始猜测一致,即 p0 = [1,1,1]
popt, pcov = curve_fit(func_powerlaw, test_X[1:], test_Y[1:], maxfev=2000)
plt.figure(figsize=(10, 5))
plt.plot(test_X, func_powerlaw(test_X, *popt),'r',linewidth=4, label='fit: a=%.4f, b=%.4f, c=%.4f' % tuple(popt))
plt.plot(test_X[1:], test_Y[1:], '--bo')
plt.plot(test_X[1:], predict_Y[1:], '-b')
plt.legend()
plt.show()
如果我将初始猜测更改为 p0 = [0.5,0.5,0.5]
popt, pcov = curve_fit(func_powerlaw, test_X[1:], test_Y[1:], p0=np.asarray([0.5,0.5,0.5]), maxfev=2000)
----------于 10.7.2018 更新------------- -------------------------------------------------- -------------------------------------------------- --------
由于我需要运行数千甚至 数百万 的幂律函数,因此使用 @James Phillips 的方法过于昂贵。那么除了curve_fit还有什么合适的方法呢?比如sklearn、np.linalg.lstsq等。
【问题讨论】:
标签: python scikit-learn scipy least-squares best-fit-curve