--------------------------------------------------------------------------------------------------------------数模网课笔记
一、拟合的原理
拟合与插值的区别:由前一篇笔记可知,插值算法是通过构建多项式经过每一个样本点,而后得到曲线,若不分段次数较高会产生龙格现象;拟合则是尽可能接近每一个样本点,只有保证误差足够小,并不要求曲线经过每一个样本点,得到的曲线是确定的。
二、拟合的操作步骤
(1)画出散点图
(2)确定拟合曲线
选定拟合曲线的欸行,并且确定参数使得拟合结果最为接近
最小二乘法
公式:
(在定义样本点与拟合曲线最为接近时,一般用二次的距离,比运用绝对值利于求导;而如果是用3次正负相抵)
求解最小二乘法过程
(3)评估拟合的结果
三、拟合算法的python实现
在Python中,对于散点图进行曲线拟合通常可以通过使用numpy
库进行数学计算,以及matplotlib
库进行绘图,同时使用scipy.optimize
或numpy.polyfit
进行多项式拟合,或者使用scipy.curve_fit
进行更复杂的函数拟合。
应用numpy.polyfit:
import numpy as np
import matplotlib.pyplot as plt
#创建数据
x = [4.2,5.9,2.7,3.8,3.8,5.6,6.9,3.5,3.6,2.9,4.2,6.1,5.5,6.6,2.9,3.3,5.9,6,5.6]
y = [8.4,11.7,4.2,6.1,7.9,10.2,13.2,6.6,6,4.6,8.4,12,10.3,13.3,4.6,6.7,10.8,11.5,9.9]
#多项式拟合数据
coefficients = np.polyfit(x,y,2)
p = np.poly1d(coefficients)
#绘制散点图
plt.plot(x,y,'o')
plt.legend()
# 绘制拟合曲线
xp = np.linspace(0, 11, 100)
plt.plot(xp, p(xp), 'r-') # 'r-'表示红色实线
plt.scatter(x, y)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Polynomial Fit (Degree 2)')
plt.show()
拟合效果
应用scipy.optimize:
#引入库函数
from scipy.optimize import curve_fit
#定义拟合函数,此处选择指数函数
def func(x,a,b,c):
return a * b * x * x + c
#运用拟合函数拟合数据
popt,pcov = curve_fit(func, x, y)
#绘制特殊函数拟合图像
plt.figure(figsize=(8,4))
plt.plot(xp,func(xp,*popt),'g-')
plt.scatter(x,y)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Custom Function Fit')
plt.legend()
plt.show()
效果图
此时的拟合函数可以自定义进行拟合,但需要注意函数定义是否合理。如在尝试使用指数函数进行拟合时候,会报出以下错误信息
四、拟合效果的评估指标
1、拟合优度(可决系数)
我们要考虑的应该是让误差越小越好,也即误差平方和SSE越小越好。而实际计算过程中,直接使用SSE来评估,会存在有一个量纲的问题。引入拟合优度来评估。拟合优度还有一个很好的性质,它是在0到1之间的。
一般而言,多项式次数越高,拟合效果越好,但同时函数的复杂程度变大,模型反而失去原来想要的简洁性。这时候就涉及到一个取舍的问题,“鱼和熊掌,不可兼得”。
#拟合效果评估————拟合优度//适用于线性函数
# 假设 y_true 是实际观测值,y_pred 是模型预测值
y_true = y
y_pred = p(x)
# 计算总平方和(TSS)
y_mean = np.mean(y_true)
TSS = np.sum((y_true - y_mean) ** 2)
# 计算残差平方和(RSS)
RSS = np.sum((y_true - y_pred) ** 2)
# 计算决定系数(R²)
R2 = 1 - (RSS / TSS)
print(f"R²: {R2}")
运用前文提到的多项式拟合,计算得到的拟合优度为:
一次
coefficients: [ 2.09484155 -1.0547841 ]
R²: 0.9634890886231378
二次
coefficients: [-0.06620435 2.71955139 -2.40838963]
R²: 0.9643922518717208
三次
coefficients: [ 0.11241442 -1.67444804 10.07863594 -13.10812972]
R²: 0.9694599546038752
四次
coefficients: [ -0.07001127 1.45755235 -11.03607581 37.94550928 -43.01993062]
R²: 0.9705831696694767
可以看到,这与预期的值的变化是一样的。