在处理数据时经常需要进行曲线拟合,在拟合过程中我们采用了插值的思想。
对于给定的数据x=[...]和y=[...],插值的目的是找到参数β的最优集 合,使函数
能够与原数据最为相似。
其中一种方法是通过调整β使:
能够最小化,这种方法称之为最小二乘法。
如果yi的值有相应的误差,那么使下式最小化
称之为β的最大似然估计。在给定xi与yi的情况下,这样得到的β值最为准确。
我们给定以下随机数据点并绘制散点图:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit
x_data = np.array([0. , 0.15789474, 0.31578947, 0.47368421, 0.63157895,
0.78947368, 0.94736842, 1.10526316, 1.26315789, 1.42105263,
1.57894737, 1.73684211, 1.89473684, 2.05263158, 2.21052632,
2.36842105, 2.52631579, 2.68421053, 2.84210526, 3. ])
y_data = np.array([ 2.95258285, 3.49719803, -2.1984975 , -4.88744346,
-7.41326345, -8.44574157, -10.01878504, -13.83743553,
-12.91548145, -16.41149046, -14.93516299, -13.42514157,
-14.12110495, -17.6412464 , -16.1275509 , -17.11533771,
-15.66076021, -12.48938865, -11.33918701, -11.70467566])
plt.scatter(x_data,y_data)
plt.show()
我们使用下式的模型进行拟合:
我们需要求解出符合上述数据点的最优的a、b、c的值,需要在python中:
(1)需要定义模型方程;
(2)使用scipy库中的curve_fit函数,使用该函数时需要定义一个β的初始值,对于一些复杂的模型,初始值决定了函数能否顺利运算。
下面定义函数并进行拟合
def fitfun(x, a, b, c):
return a*(x-b)**2 + c
popt, pcov = curve_fit(fitfun, x_data, y_data, p0=[3,2,-16])
其中:
popt为我们定义的函数fitfun的最佳参数。
pcov为协方差矩阵,用于给定误差。
接下来我们就可以绘制出拟合好的曲线
a, b, c = popt
x_model = np.linspace(min(x_data), max(x_data), 100)
y_model = fitfun(x_model, a, b, c)
plt.scatter(x_data,y_data)
plt.plot(x_model,y_model, color='r')
plt.show()