拟合与插值的区别: 插值算法中,得到的多项式
f
(
x
)
f(x)
f(x)要经过所有样本点。但是如果样本点太多,那 么这个多项式次数过高,会造成龙格现象。 尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到 一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即 可,这就是拟合的思想。 (拟合的结果是得到一个确定的曲线) 拟合曲线的确定: 设样本点为
(
x
i
,
y
i
)
,
i
=
1
,
2
,
.
.
.
,
n
(x_i,y_i),i=1,2,...,n
(xi,yi),i=1,2,...,n,找到一条曲线
y
=
k
x
+
b
y=kx+b
y=kx+b,确定
k
,
b
k,b
k,b的值,使得拟合曲线与样本点最接近。
代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(suppress=True)# 不适用科学计数法
x = np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78])
y = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
plt.figure()
plt.scatter(x, y)
方法一:利用Scipy.leastsq进行拟合
from scipy.optimize import leastsq
# 定义最小二乘函数deferr(p, x, y):return p[0]* x + p[1]- y
p0 =[1,1]#设置参数初始值,可以随意设置
ret = leastsq(err, p0, args=(x,y))
k,b = ret[0]print('k=',k)print('b=',b)
k= 0.6134953486733113
b= 1.7940925476610339
x1 = np.linspace(0,8,100)
y1 = k * x1 + b
plt.scatter(x, y, color="orange",label='Sample Point')
plt.plot(x1,y1,color='red',label='Fitting Line')
plt.legend()