【数模笔记04】拟合算法

--------------------------------------------------------------------------------------------------------------数模网课笔记

一、拟合的原理

拟合与插值的区别:由前一篇笔记可知,插值算法是通过构建多项式经过每一个样本点,而后得到曲线,若不分段次数较高会产生龙格现象;拟合则是尽可能接近每一个样本点,只有保证误差足够小,并不要求曲线经过每一个样本点,得到的曲线是确定的。

二、拟合的操作步骤

(1)画出散点图

(2)确定拟合曲线

选定拟合曲线的欸行,并且确定参数使得拟合结果最为接近

最小二乘法

公式:\hat{y}_{i}= kx_{i}+b

\hat{k}_{i}\hat{b}=arg_{k_{i}b}min(\sum_{i=1}^{n}(y_{i}-\hat{y}_{i})^2)

(在定义样本点与拟合曲线最为接近时,一般用二次的距离,比运用绝对值利于求导;而如果是用3次正负相抵)

求解最小二乘法过程

(3)评估拟合的结果

三、拟合算法的python实现

在Python中,对于散点图进行曲线拟合通常可以通过使用numpy库进行数学计算,以及matplotlib库进行绘图,同时使用scipy.optimizenumpy.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、拟合优度(可决系数)R^2

我们要考虑的应该是让误差越小越好,也即误差平方和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

可以看到,这与预期的R^2值的变化是一样的。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值