1 实验目的
理解数据拟合应用场景,能够根据数据特点,正确选择算法,并且能够编程实验相关算法。
2 实验任务
某乡镇企业 2010-2016 年的大致生产利润如下表,试采用正确的方法预测2017 和 2018 年的利润。
年份 2010 2011 2012 2013 2014 2015 2016
利润(万元) 70 122 144 152 174 196 202
3 实验相关知识
最小二乘法:最小二乘法是一种常用的数据拟合方法,它通过最小误差的平方和来找到一组数据的最佳函数匹配。
求解最小二乘法的步骤:
(1)根据题干给定的数据,画出草图,初步判断数据变化趋势,给出基函数
(2)通过基函数进行最小二乘拟合,求解基函数中的未知数
(3)将基函数完整写出,即可得到拟合后的最小二乘函数
4 实验流程图
5 实验代码
import numpy as np
import matplotlib.pyplot as plt
def fitting_process(_x1, _x2):
a, b = 0, 0
a1 = [[0, 0, 0], [0, 0, 0]]
r, r1 = 0, 0
a1[0][0] = 7
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016] # 假设x和y是已知的数据
y = [70, 122, 144, 152, 174, 196, 202]
for i in range(7):
a1[0][2] += y[i]
a1[1][2] += x[i] * y[i]
for i in range(7):
r += x[i]
r1 += (x[i] * x[i])
a1[0][1] = r
a1[1][0] = a1[0][1]
a1[1][1] = r1
k = a1[1][0] / a1[0][0]
for j in range(3):
a1[1][j] -= a1[0][j] * k
b = a1[1][2] / a1[1][1]
a = (a1[0][2] - a1[0][1] * b) / a1[0][0]
print("线性拟合", _x1, "年的预测是:", a + b * _x1)
print("线性拟合", _x2, "年的预测是:", a + b * _x2)
# 绘制原始数据点和预测曲线
plt.scatter(x, y)
plt.plot(x, a + b * np.array(x), color='red')
plt.scatter([_x1, _x2], [a + b * _x1, a + b * _x2], color='green') # 添加预测点
plt.text(_x1, a + b * _x1, f'({_x1}, {a + b * _x1})', verticalalignment='bottom') # 显示预测点的坐标
plt.text(_x2, a + b * _x2, f'({_x2}, {a + b * _x2})', verticalalignment='bottom') # 显示预测点的坐标
plt.show()
# 调用函数
fitting_process(2017, 2018)
6 实验结果
7 总结
这次实验采用的是最小二乘拟合的方法。与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是追求一个函数(曲线),使得该曲线在某种准测下与所有的数据点最为接近,即曲线拟合最好(最小化损失函数)。
采用拟合的结果是要得到一条确定的曲线。插值算法中,得到的多项式 f(x)要经过所有的样本点。但是如果样本点太多,那么这个多项式的次数过高,会造成龙格现象。尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更要倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可。