在数据分析和科学研究中,数据拟合是一项非常重要的任务。通过拟合,我们可以找到数据的内在规律,从而进行预测和解释。本文将介绍三种常见的数据拟合方法:多项式拟合、最小二乘法拟合和高斯分布拟合,并附上相应的Python代码示例。
1、多项式拟合
多项式拟合是一种通过多项式函数来逼近数据的方法。在Python中,我们可以使用numpy
库中的polyfit
函数来进行多项式拟合。
以下是一个简单的示例代码,用于对一组数据进行4次多项式拟合:
import numpy as np
import matplotlib.pyplot as plt
t = [1, 2, 3]
y = [1, 3, 5]
# 进行4次多项式拟合
f1 = np.polyfit(t, y, 4)
print("a, b, c, d = :\n", f1) # 返回拟合函数的系数
p1 = np.poly1d(f1)
print("多项式曲线拟合函数:\n", p1)
# 计算拟合函数在t处的值
yvals = np.polyval(f1, t)
# 绘图
plot1 = plt.plot(t, y, "ob")
plot2 = plt.plot(t, yvals, "r")
plt.xlabel("t")
plt.ylabel("y")
plt.legend(loc=4) # 指定legend在图中的位置
plt.title('polyfitting')
plt.show()
在这个例子中,polyfit
函数返回了拟合多项式的系数,poly1d
函数将这些系数转换为一个多项式函数,polyval
函数则用于计算多项式函数在给定点的值。最后,我们使用matplotlib
库将原始数据和拟合曲线绘制出来。
2、最小二乘法拟合
最小二乘法拟合是一种通过最小化误差的平方和来寻找数据最佳函数匹配的方法。在Python中,我们可以使用scipy.optimize
库中的curve_fit
函数来进行非线性最小二乘法拟合。
以下是一个示例代码,用于对一个自定义的e指数形式函数进行拟合:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# 自定义函数 e指数形式
def func(x, a, b, c):
return a * np.sqrt(x) * (b * np.square(x) + c)
# 定义x、y散点坐标
x = np.array([20, 30, 40, 50, 60, 70])
y = np.array([453, 482, 503, 508, 498, 479])
# 非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
# 输出拟合系数
a, b, c = popt
print('popt:', popt)
print('系数a:', a)
print('系数b:', b)
print('系数c:', c)
print('系数pcov:', pcov)
# 计算拟合函数在x处的值
yvals = func(x, a, b, c)
# 绘图
plot1 = plt.plot(x, y, 's', label='original values')
plot2 = plt.plot(x, yvals, 'r', label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) # 指定legend的位置
plt.title('curve_fit')
plt.show()
在这个例子中,我们定义了一个自定义的e指数形式函数,并使用curve_fit
函数对其进行拟合。curve_fit
函数返回了最佳拟合参数popt
和协方差矩阵pcov
。然后,我们使用这些参数来计算拟合函数在给定点的值,并使用matplotlib
库将原始数据和拟合曲线绘制出来。
3、高斯分布拟合
高斯分布拟合是一种通过高斯分布函数来逼近数据的方法。同样地,我们可以使用scipy.optimize
库中的curve_fit
函数来进行高斯分布拟合。
以下是一个示例代码,用于对一个自定义的高斯分布函数进行拟合:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
# 自定义函数 e指数形式
def func(x, a, u, sig):
return a * (np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (math.sqrt(2 * math.pi) * sig)) * (431 + (4750 / x))
# 定义x、y散点坐标
x = np.array([40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135])
y = np.array([536, 529, 522, 516, 511, 506, 502, 498, 494, 490, 487, 484, 481, 478, 475, 472, 470, 467, 465, 463])
# 高斯分布拟合
popt, pcov = curve_fit(func, x, y, p0=[3.1, 4.2, 3.3])
# 输出拟合系数
a, u, sig = popt
print(u'系数a:', a)
print(u'系数u:', u)
print(u'系数sig:', sig)
# 计算拟合函数在x处的值
yvals = func(x, a, u, sig)
# 绘图
plot1 = plt.plot(x, y, 's', label='original values')
plot2 = plt.plot(x, yvals, 'r', label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) # 指定legend的位置
plt.title('curve_fit')
plt.show()
在这个例子中,我们定义了一个自定义的高斯分布函数,并对其进行拟合。注意,这里的高斯分布函数还包含了一个额外的因子(431 + (4750 / x))
,以适应数据的特定形状。我们使用curve_fit
函数进行拟合,并输出拟合系数。然后,我们使用这些系数来计算拟合函数在给定点的值,并使用matplotlib
库将原始数据和拟合曲线绘制出来。
4、总结
本文介绍了三种常见的数据拟合方法:多项式拟合、最小二乘法拟合和高斯分布拟合,并提供了相应的Python代码示例。通过这些方法,我们可以对任意数据进行拟合,从而找到数据的内在规律。在实际应用中,我们可以根据数据的特性和需求选择合适的拟合方法。