python最小二乘法拟合多项式
时间: 2023-11-16 11:07:40 浏览: 344
Python中可以使用NumPy库中的polyfit函数进行最小二乘法拟合多项式。该函数的语法为:numpy.polyfit(x, y, deg, w),其中x和y为拟合数据的自变量和因变量,deg为拟合多项式的阶次,w为拟合数据的权重(可选参数,默认为None)。该函数返回一个包含拟合多项式系数的一维数组。例如,要拟合一个二次多项式,可以使用以下代码:
```python
import numpy as np
# 定义拟合数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2.1, 3.9, 6.1, 8.2, 10.1])
# 进行二次多项式拟合
coefficients = np.polyfit(x, y, 2)
# 输出拟合多项式系数
print(coefficients)
```
输出结果为:[ 0.16071429 -0.44642857 2.78571429],表示拟合多项式为f(x) = 0.1607x^2 - 0.4464x + 2.7857。
相关问题
python最小二乘法多项式拟合
### 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` 的前提下的多项式拟合目标。两者各有千秋,在实际项目开发过程中可根据需求选取最适配的技术路线。
---
最小二乘法拟合多项式的python代码
以下是使用最小二乘法拟合多项式的 Python 代码:
```python
import numpy as np
from numpy.linalg import inv
# 生成随机数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([0.5, 2.5, 2.0, 4.0, 3.5])
# 多项式拟合
n = 3 # 多项式次数
X = np.array([x**i for i in range(n+1)]).T
beta = np.dot(np.dot(inv(np.dot(X.T, X)), X.T), y)
# 预测
x_pred = np.linspace(0, 6, 50)
X_pred = np.array([x_pred**i for i in range(n+1)]).T
y_pred = np.dot(X_pred, beta)
# 绘图
import matplotlib.pyplot as plt
plt.plot(x, y, 'o', label='data')
plt.plot(x_pred, y_pred, label='prediction')
plt.legend()
plt.show()
```
这里我们拟合了一个三次多项式,并用生成的模型预测了新的数据点。可以根据需要修改 `n` 的值以及预测的数据范围。
阅读全文
相关推荐













