如何在Python中固定Numpy多项式回归的系数?
固定零阶系数的线性回归实现(仅用标准Python库)
完全可以通过NumPy自带的工具实现,无需额外第三方库。核心思路是将固定截距的问题转化为无截距的线性回归:
你的目标模型是 Velocity = m*Time + 2.24,等价于 Velocity - 2.24 = m*Time。只需对调整后的因变量(Velocity - 2.24)和自变量Time做无截距拟合,即可得到斜率m。
方法1:用numpy.linalg.lstsq直接求解(推荐)
这是最直观且可靠的方式,手动构造线性方程组求解最小二乘解:
import numpy as np import pandas as pd # 读取数据(假设df是你的DataFrame) x = df['Time'].values y = df['Velocity'].values # 固定零阶系数q=2.24,调整因变量 y_adj = y - 2.24 # 构造自变量矩阵(仅包含Time的列,无常数项) X = x.reshape(-1, 1) # 最小二乘求解斜率m m, _, _, _ = np.linalg.lstsq(X, y_adj, rcond=None) m = m[0] # 最终模型参数 print(f"斜率m: {round(m, 4)}, 固定截距q: 2.24")
方法2:基于numpy.polynomial.Polynomial.fit的适配
如果想继续使用你熟悉的Polynomial.fit,可以通过调整目标变量后拟合,再提取原始域的斜率:
import numpy as np import pandas as pd x = df['Time'].values y = df['Velocity'].values # 调整因变量,抵消固定截距 y_adj = y - 2.24 # 拟合调整后的线性模型 lin_reg_adj = np.polynomial.polynomial.Polynomial.fit(x, y_adj, 1) # 转换为原始数据域的系数(避免Polynomial.fit自动缩放带来的系数偏差) original_coefs = lin_reg_adj.convert().coef # 提取斜率m(零阶系数被我们的调整抵消,无需关注) m = original_coefs[1] print(f"斜率m: {round(m, 4)}, 固定截距q: 2.24")
两种方法都仅依赖Python标准库中的NumPy和你已在使用的Pandas,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Gabraltur
相关产品推荐
相关产品推荐

