Python----最小二乘

本文通过Python的numpy和matplotlib库,演示了如何使用最小二乘法对一组数据进行二次函数拟合。首先,构造了一个包含实验数据的二维数组,然后利用numpy的数学运算功能,将数据转换为适合拟合的形式。最后,通过绘制散点图和拟合曲线,验证了拟合效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小二乘

# 建立一个包含数据集的数据矩阵:数据矩阵化
import numpy as np
#引入 numpy 将其重命名为 np 使用
import numpy.matlib
import matplotlib.pyplot as plt
#引入matplotlib 将其重命名为 plt 使用
data=np.array(([19,25,31,38,44],[19.0,32.3,49.0,73.3,97.8]))
#=np.array(([1,2,3,4,5],[1,4,9,16,25]))
# 构造二维数组
x1=data[0]
# 提出数组的行
y1=data[1]
# 提出数组的列
print("x1的值:",end=" ")
print(x1)
print("y1的值:",end=" ")
print(y1)
plt.plot(x1,y1,'o')
#画图,判断应是二次函数还是一次函数
min1=np.min(x1)
# 求x1中最小值
max1=np.max(x1)
# 求x1中最大值
min2=np.min(y1)
# 求y1中最小值
max2=np.max(y1)
# 求y1中最大值
plt.xlim(min1-1,max1+1)
#横坐标的范围
plt.ylim(min2-1,max2+1)
#纵坐标的范围
plt.show()
#由散点图可知应拟合二次函数
col=data.shape[1]
#求数组的列
row=data.shape[0]
#求数组的行
print("data的行数:",end=" ")
print(data.shape[0])
print("data的列数:",end=" ")
print(data.shape[1])
X1=x1**2
#x1中的数值变为原来的2倍
X1=X1.reshape(5,1)
# 将X1变为5行1列
X2=x1.reshape(5,1)
# 将x1变为5行1列
X3=np.ones((col,1))
X=np.hstack((X1,X2))
X=np.hstack((X,X3))
#将X1,X2,X3合成一个数组
print("X的值:")
print(X)
x=X.T
print("X的转置的值:")
print(x)
X=np.mat(X)
#将数组X转化为矩阵
a1=X.I
#求数组的逆矩阵
print("X的逆矩阵的值:")
print(a1,)
solve=np.dot(a1,y1)
#a1,y1的乘积
solve=solve.reshape(3,1)
print("a,b,c的值:")
print(solve)
y2=np.dot(X,solve)
print("在x对应的方程中的值y2:")
print(y2)
print("y2与y1之间的差值:")
print(y2-y1.reshape(5,1))
plt.plot(x1,y1,'o')
plt.plot(x1,y2)
plt.xlim(min1-1,max1+1)
#横坐标的范围
plt.ylim(min2-1,max2+1)
#纵坐标的范围
plt.show()

### 非线性最小二乘 Levenberg-Marquardt 方法介绍 非线性最小二乘问题是通过调整模型参数使得预测值与实际观测之间的残差平方和达到最小化的过程。Levenberg-Marquardt算法是一种用于解决此类问题的有效迭代技术,它结合了梯度下降法和高斯-牛顿法的优点,在接近最优解时表现出良好的收敛特性。 该方法的核心在于构建目标函数的一阶泰勒展开近似,并引入阻尼因子λ来平衡搜索方向的选择: \[ J(\beta)^TJ(\beta)\Delta\beta=-J(\beta)^Tr \] 其中 \( J(\beta) \) 是雅可比矩阵,\( r \) 表示残差向量,而 \( \Delta\beta \) 则代表待求解的参数增量。当 λ 较大时,此表达式更倾向于执行稳定但缓慢的梯度下降;反之则趋向于快速却可能不稳定的高斯-牛顿步长[^1]。 为了更好地理解这一过程,下面给出一段 Python 实现代码作为示例: ```python import numpy as np from scipy.optimize import least_squares def model(params, t): """定义要拟合的数据模型""" A, B = params return A * np.exp(B*t) def residuals(params, y_true, t): """计算当前估计下的误差""" y_pred = model(params, t) err = y_true - y_pred return err.flatten() # 假设已知的时间序列及其对应的测量值 time_points = np.array([0.1, 0.6, 1.1, 1.6, 2.1]) measurements = np.array([0.8, 0.3, 0.15, 0.07, 0.03]) initial_guess = [1., -.5] # 参数初值猜测 result = least_squares(residuals, initial_guess, args=(measurements, time_points), method='lm') # 使用LM算法 print("Optimized parameters:", result.x) ``` 这段程序展示了如何利用 `scipy` 库中的 `least_squares()` 函数实现基于 LM 的非线性最小二乘拟合操作。用户只需提供具体的数学模型以及初始参数估计即可完成整个流程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值