Quick Start¶
If you simply want the most important parts about symfit, you came to the right place.
Single Variable Problem¶
from symfit.api import Parameter, Variable, exp, Fit
A = Parameter(100, min=0)
b = Parameter()
x = Variable()
model = A * exp(x * b)
xdata = # your 1D xdata. This is a quick start guide, so I'm assuming you know how to get it.
ydata = # 1D ydata
fit = Fit(model, xdata, ydata)
fit_result = fit.execute()
# Plot the fit.
# The model *has* to be called by keyword arguments to prevent any ambiguity
y = model(x=xdata, **fit_result.params)
plt.plot(xdata, y)
plt.show()
symfit.api exposes sympy.api¶
symfit.api exposes the sympy api as well, so mathematical expressions such as exp, sin and pi are importable from symfit.api as well. For more, read the sympy docs.
Initial Guess¶
For fitting to work as desired you should always give a good initial guess for a parameter.
The Parameter object can therefore be initiated with the following keywords:
valuethe initial guess value.minMinimal value for the parameter.maxMaximal value for the parameter.fixedFix the value of the parameter during the fitting tovalue.
In the example above, we might change our Parameter‘s to the following after looking at a plot of the data:
a = Parameter(value=4, min=3, max=6)
Multivariable Problem¶
Let M be the number of variables in your model, and N the number of data point in xdata. Symfit assumes xdata to be of shape \(N \times M\) or even \(N_1 \times \dots N_i \times M\) dimensional, as long as either the first or last axis of the array is of the same length as the number of variables in your model. Currently it is assumed that the function is not vector valued, meaning that for every datapoint in xdata, only a single y value is returned. Vector valued functions are on my ToDo list.
from symfit.api import Parameter, Variable, Fit
a = Parameter()
b = Parameter()
x = Variable()
y = Variable()
model = a * x**2 + b * y**2
xdata = # your NxM data.
ydata = # ydata
fit = Fit(model, xdata, ydata)
fit_result = fit.execute()
# Plot the fit.
z = model(x=xdata[:, 0] y=xdata[:, 1], **fit_result.params)
plt.plot(xdata, z)
plt.show()