多项式拟合的数学原理及实现

最小二乘曲线的拟合就是对于给定的数据(X,Y),(X=xi,Y=yi,i=1,2,3,......,N),选取线性无关的函数族\{ \varphi_1,\varphi_2,...,\varphi_m \},及权函数v(x)(v(xi)表示数据(xi,yj)的权重),要求在函数类\varphi=span\{ \varphi_1,\varphi_2,...,\varphi_m \}中寻找一个函数

f(x)=a_0 \varphi_0+a_1\varphi_1+...+a_m\varphi_m

使得\sum_{1}^{N}{v(x_i)[y_i-\varphi(x_i)]^2}达到最小

I(a_0,a_1,...a_m)=\sum_{1}^{N}{v(x_i)[y_i-\sum _{0}^{m}a_k j_k(x_i)]^2}

根据多元极值条件

\frac{1}{2}\frac{dy}{da_i}=\sum_{1}^{N}v(x_i)\varphi_j(x_i)[y_i-\sum_{k=0}^{m}a_k\varphi_k(x_i)]^2

其中,j=0,1,2,......,m。引入内积

(f,g)=\sum _{i=1}^{N}v(x_i)f(x_i)g(x_i)

方程可以表示为:

a_0(\varphi_j,\varphi_0)+a_1(\varphi_j,\varphi_1)+...+a_m(\varphi_j,\varphi_m)=(\varphi_i,y)

则:

\begin{pmatrix} (\varphi_0,\varphi_0) & (\varphi_0,\varphi_1) & ...&(\varphi_0,\varphi_m) \\ (\varphi_1,\varphi_0) & (\varphi_1,\varphi_1) & ... & (\varphi_1,\varphi_m)\\ ...& ... & & ...\\ (\varphi_m,\varphi_0)& (\varphi_m,\varphi_1) &... & (\varphi_m,\varphi_m) \end{pmatrix}\begin{pmatrix} a_0\\ a_1\\ ...\\ a_m \end{pmatrix}=\begin{pmatrix} (\varphi_0,y)\\ (\varphi_1,y)\\ ...\\ (\varphi_m,y) \end{pmatrix}

\varphi_0=1,\varphi_1=x,\varphi_m=x^m,即取{1,x,......,xm}为基函数的多项式拟合时,对应以上正规方程组就变为:

\begin{pmatrix} \sum_{1}^{N}v_i & \sum_{1}^{N}v_ix_i & ...&\sum_{1}^{N}v_ix_i^m \\ \sum_{1}^{N}v_ix_i & \sum_{1}^{N}v_ix_i^2 & ... & \sum_{1}^{N}v_ix_i^{m+1}\\ ...& ... & & ...\\ \sum_{1}^{N}v_ix_i^{m}& \sum_{1}^{N}v_ix_i^{m+1} &... & \sum_{1}^{N}v_ix_i^{2m} \end{pmatrix}\begin{pmatrix} a_0\\ a_1\\ ...\\ a_m \end{pmatrix}=\begin{pmatrix} \sum_{1}^{N}v_iy_i\\ \sum_{1}^{N}v_ix_iy_i\\ ...\\ \sum_{1}^{N}v_ix_i^my_i \end{pmatrix}

逐个计算出方程组系数矩阵与右端项的各个元素值,即可求的方程组的解,最后得到拟合多项式:

\varphi(x)=a_0+a_1x+a_2x^2+...+a_mx^m

并用\sum_{1}^{N}{v(x_i)[y_i-\varphi(x_i)]^2}来判断拟合效果

下面将使用python代码进行实践

y=e^x这个函数,取x从0到10,区间分为100段,生成对应x和y

生成好之后,就可以用PolynomialFeatures函数生成x的多项式,然后进行拟合

import math
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
import statsmodels.api as sm
import matplotlib.pyplot as plt

# 定义x的取值范围
x_values = [i / 10 for i in range(1, 101)]  # 从0.1到1.0,步长为0.1

# 计算每个x值对应的y值
y_values = [math.exp(x) for x in x_values]

# 打印结果
print(x_values)
print(y_values)
# 多项式拟合
for degree in range(1, 6):
    print(degree)
    x = np.array(x_values).reshape(-1, 1)
    # 多项式特征转换
    poly = PolynomialFeatures(degree=degree)
    x_poly = poly.fit_transform(x)
    y=np.array(y_values).reshape(-1,1)
    # 线性回归模型拟合
    model = sm.OLS(y,x_poly).fit()
    print(model.summary())
    # 使用 scatter 方法绘制散点图
    plt.scatter(x, y)
    # 绘制数据点的拟合线
    y_pred=model.predict(x_poly)
    plt.plot(x, y_pred, color='green', linestyle='--', label='OLS Fit Line')
    # 可以添加标题和标签
    plt.title('Simple Scatter Plot')
    plt.xlabel('X Axis Label')
    plt.ylabel('Y Axis Label')

    # 显示图形
    plt.show()

效果如下:

在多项式最高次为1时:

        拟合优度为0.48,拟合线和散点关系如下图:

随着次数增高,拟合优度越来越好,拟合的曲线越来越接近

        在最高项次数为5次时,拟合优度非常接近1,图像如下图:

        可以看到拟合的比较好,在这一区间也可以明显看到拟合优度逐步上升。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值