如何在python中实现模型的自动判断和二态模型拟合?
How to implement automatic model determination and two state model fitting in python?
目前,我一直在 Prism 中手动对我的所有数据进行模型拟合。这非常乏味且耗时。请问有什么方法可以提高数据分析的效率。我熟悉 Python 所以我想从 python 开始考虑更好的工作流程。非常感谢您的帮助。
两个问题:
如何在python中进行二态模型拟合(图1)?在我的例子中,它将有一个初始线性增加,然后是水平平台状态。我希望python中的实现方式和自动检测发生变化的转折点的方式(理想情况下我可以得到它发生的时间和斜率)
另一种情况是状态变为指数或多项式。 python有什么方法可以自动判断哪个模型最好。
Figure 1
Scipy提供最小二乘曲线拟合方法,支持自定义函数。这是第一个模型的示例:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
#custom fit function - first slope steeper than second slope
def two_lin(x, m1, n1, m2, n2):
return np.min([m1 * x + n1, m2 * x + n2], axis = 0)
#x/y data points
x = np.asarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.asarray([2, 4, 8, 12, 14, 18, 20, 21, 22, 23, 24])
#initial guess for a steep rising and plateau phase
start_values = [3, 0, 0, 3]
#curve fitting
fit_param, pcov = curve_fit(two_lin, x, y, p0 = start_values)
#output of slope/intercept for both parts
m1, n1, m2, n2 = fit_param
print(m1, n1, m2, n2)
#calculating sum of squared residuals as parameter for fit quality
r = y - two_lin(x, *fit_param)
print(np.sum(np.square(r)))
#point, where the parts intersect
if m1 != m2:
x_intersect = (n2 - n1) / (m1 - m2)
print(x_intersect)
else:
print("did not find two linear components")
#plot data and fit function
x_fit = np.linspace(-1, 11, 100)
plt.plot(x, y, 'o', label='data')
plt.plot(x_fit, two_lin(x_fit, *fit_param), '--', label='fit')
plt.axis([-2, 12, 0, 30])
plt.legend()
plt.show()
有关scipy.optimize.curve_fit
can be found in the reference guide. For polynomials, numpy provides standard functions with numpy.polyfit
and numpy.poly1d
的更多信息,但您仍然需要提供预期的学位。
残差平方和可以用来比较不同拟合函数的准确度。
目前,我一直在 Prism 中手动对我的所有数据进行模型拟合。这非常乏味且耗时。请问有什么方法可以提高数据分析的效率。我熟悉 Python 所以我想从 python 开始考虑更好的工作流程。非常感谢您的帮助。
两个问题:
如何在python中进行二态模型拟合(图1)?在我的例子中,它将有一个初始线性增加,然后是水平平台状态。我希望python中的实现方式和自动检测发生变化的转折点的方式(理想情况下我可以得到它发生的时间和斜率)
另一种情况是状态变为指数或多项式。 python有什么方法可以自动判断哪个模型最好。
Figure 1
Scipy提供最小二乘曲线拟合方法,支持自定义函数。这是第一个模型的示例:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
#custom fit function - first slope steeper than second slope
def two_lin(x, m1, n1, m2, n2):
return np.min([m1 * x + n1, m2 * x + n2], axis = 0)
#x/y data points
x = np.asarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.asarray([2, 4, 8, 12, 14, 18, 20, 21, 22, 23, 24])
#initial guess for a steep rising and plateau phase
start_values = [3, 0, 0, 3]
#curve fitting
fit_param, pcov = curve_fit(two_lin, x, y, p0 = start_values)
#output of slope/intercept for both parts
m1, n1, m2, n2 = fit_param
print(m1, n1, m2, n2)
#calculating sum of squared residuals as parameter for fit quality
r = y - two_lin(x, *fit_param)
print(np.sum(np.square(r)))
#point, where the parts intersect
if m1 != m2:
x_intersect = (n2 - n1) / (m1 - m2)
print(x_intersect)
else:
print("did not find two linear components")
#plot data and fit function
x_fit = np.linspace(-1, 11, 100)
plt.plot(x, y, 'o', label='data')
plt.plot(x_fit, two_lin(x_fit, *fit_param), '--', label='fit')
plt.axis([-2, 12, 0, 30])
plt.legend()
plt.show()
有关scipy.optimize.curve_fit
can be found in the reference guide. For polynomials, numpy provides standard functions with numpy.polyfit
and numpy.poly1d
的更多信息,但您仍然需要提供预期的学位。
残差平方和可以用来比较不同拟合函数的准确度。