Python 最小二乘法多项式拟合曲线numpy.polyfit(),numpy.poly1d(),pylab

原文地址:http://wiki.klniu.com/zh-hans/Python/Modules/Scipy

import numpy as np
from scipy.optimize import leastsq
import pylab as pl
 
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
 
#第一个拟合,自由度为3
z1 = np.polyfit(x, y, 3)
# 生成多项式对象
p1 = np.poly1d(z1)
print(z1)
print(p1)
 
# 第二个拟合,自由度为6
z2 = np.polyfit(x, y, 6)
# 生成多项式对象
p2 = np. poly1d (z2 ) print (z2 ) print (p2 )  # 绘制曲线  # 原曲线pl. plot (x , y , 'b^-' , label = 'Origin Line' )pl. plot (x , p1 (x ) , 'gv--' , label = 'Poly Fitting Line(deg=3)' )pl. plot (x , p2 (x ) , 'r*' , label = 'Poly Fitting Line(deg=6)' )pl. axis ( [ 0 , 18 , 0 , 18 ] )pl. legend ( ) # Save figurepl. savefig ( 'scipy02.png' , dpi = 96 )

输出结果:

[ 0.00624491 -0.20371114  2.18193147  2.57208791]
          3          2
0.006245 x - 0.2037 x + 2.182 x + 2.572
[ -1.89843481e-06   1.90557772e-04  -6.80682074e-03   1.16832830e-01
  -1.04793542e+00   4.90253564e+00   1.76057692e-02]
            6             5            4          3         2
-1.898e-06 x + 0.0001906 x - 0.006807 x + 0.1168 x - 1.048 x + 4.903 x + 0.01761

图像:

Scipy02.png

### Python 实现最小二乘法多项式拟合(不使用 `polyfit`) 在 Python 中,可以借助 `scipy.optimize.curve_fit` 或者手动构建设计矩阵并通过正规方程求解的方式来实现最小二乘法多项式拟合。以下是两种不同的方法: --- #### 方法一:使用 `curve_fit` 进行多项式拟合 通过定义一个多项式函数并调用 `curve_fit` 来完成拟合过程。 ```python import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 定义多项式函数 def polynomial(x, a0, a1, a2, a3): return a0 + a1 * x + a2 * x**2 + a3 * x**3 # 数据准备 x_data = np.array([1, 2, 3, 4, 5]) y_data = np.array([1.1, 1.9, 3.0, 4.1, 4.8]) # 初始猜测值 p0 = [1, 1, 1, 1] # 执行拟合 params, covariance = curve_fit(polynomial, x_data, y_data, p0) # 输出拟合参数 print("Fitted parameters:", params) # 可视化结果 x_plot = np.linspace(min(x_data), max(x_data), 100) y_fitted = polynomial(x_plot, *params) plt.scatter(x_data, y_data, color="blue", label="Original data") plt.plot(x_plot, y_fitted, color="red", label="Fitted Polynomial") plt.legend() plt.show() ``` 该方法允许用户自定义任意形式的多项式或其他非线性模型,并返回最优参数及其协方差矩阵[^3]。 --- #### 方法二:手工实现最小二乘法多项式拟合 如果不希望依赖于任何高级库,则可以直接构造设计矩阵 $X$ 和响应向量 $Y$,随后应用正规方程 $(X^T X)^{-1} X^T Y$ 解决问题。 ```python import numpy as np import matplotlib.pyplot as plt # 数据准备 x_data = np.array([1, 2, 3, 4, 5]).reshape(-1, 1) # 转为列向量 y_data = np.array([1.1, 1.9, 3.0, 4.1, 4.8]) # 设定多项式的阶数 degree = 3 # 构造设计矩阵 X n_samples = len(x_data) X = np.ones((n_samples, degree + 1)) for i in range(degree): X[:, -(i + 1)] = x_data.flatten()**(i + 1) # 应用正规方程求解参数 coefficients = np.linalg.inv(X.T @ X) @ X.T @ y_data # 输出拟合参数 print("Coefficients of the polynomial:", coefficients[::-1]) # 高次到低次排列 # 可视化结果 x_plot = np.linspace(min(x_data), max(x_data), 100).reshape(-1, 1) X_plot = np.hstack([x_plot**i for i in range(degree + 1)][::-1]) y_fitted = X_plot @ coefficients plt.scatter(x_data, y_data, color="blue", label="Original data") plt.plot(x_plot, y_fitted, color="red", label="Fitted Polynomial") plt.legend() plt.show() ``` 这种方法完全避免了对预置函数的依赖,同时展示了底层原理的操作细节[^1]。 --- ### 总结 无论是选择灵活性较高的 `curve_fit` 方案还是深入理解算法本质的手工实现路径,都可以成功达成无需调用 `polyfit` 的前提下的多项式拟合目标。两者各有千秋,在实际项目开发过程中可根据需求选取最适配的技术路线。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值