这篇文章建立在我之前的问题上
我有一些X数据和一些Y数据,Y数据可以拟合为X数据的加权和,我的问题是找到最适合的系数。在
我现在明白了一种方法来做到这一点,尽管我意识到这可能不是最好或最佳的方法。在
然而,我所拥有的X数据有时可能会被移位,这样只有在X的每一列上下移动N个增量之后,才能获得最佳拟合。在
我想看看np.滚动可以用来做这个,但我卡住了,因为我的函数现在需要系数和整数值np.滚动可用于将列上下移动N以提高拟合度。在
我想我的主要问题是我不明白如何将这两种不同的参数传递给curvefit-有可能吗?在
也许吧np.滚动不是最好的办法吗?因此,如果有任何其他建议,我们也将不胜感激。在
在下面的示例中,将第二列移动-1将产生更好的扩展数据与Ydata的匹配。在
xdata = np.array([[1.0, 1.0],[1.0, 1.0], [2.0, 3.0], [4.0, 2.0], [2.0, 1.0],[1.0, 1.0]])
ydata = np.array([3.0, 5.0, 6.0, 9.0, 5.0, 3.0])
def fitfunc(xdata, *params):
ctx = 0.0
# y is not yet defined by somehow I would like it to take the values passed in the second np.array defined in c below
# the for loop should just run twice in this example
for n in range(len(params)):
ctx = params[n]*np.roll(xdata[:,n], y, axis=0) + ctx
return ctx, y
#initial guesses for fitting parameters
c = (np.array([0.6, 0.3]), np.array([1, 1])) # the second np.array is what I would like to pass a y's
# fit data using SciPy's Levenberg-Marquart method
nlfit, nlpcov = scipy.optimize.curve_fit(fitfunc, xdata, ydata, p0=(c), sigma=None)
print (nlfit)
谢谢你的帮助
curve_fit
需要一个参数数组,您可以在fitfunc
中使用它。在这个例子中,我们有p列,每个列都有一个斜率和一个移位,所以最后我们需要一个2*p元素的参数数组。初始参数数组需要如下所示:在
fitfunc
中,我将参数数组拆分为:slope_params
,一个斜率参数数组,使用params[:cols]
,它接受第一个p元素,并且shift_params
,一个移位参数数组,使用params[cols:]
,它接受最后一个p元素。在
^{pr2}$fitfunc
的完整代码:注意,我们必须使用
[int(round(n)) for n in params[cols:]]
将移位参数转换为整数。在将其与
curve_fit
一起使用根本不会更改移位参数,并给出警告:您可能可以调整优化设置以获得更好的结果,但我不认为这是解决您的问题的最有希望的方法。在
相关问题 更多 >
编程相关推荐