寻求numpy polyfit(n=1、x固定)的高速替代计算方案
针对固定x的线性回归斜率快速计算方案
核心思路:复用固定x的预计算常量
既然你是固定x做一阶线性回归,完全可以跳过通用多项式拟合函数的冗余计算,直接基于线性回归的解析公式,预计算x相关的所有常量,每次仅处理y的部分,速度能比polyfit提升一个数量级以上。
方法1:直接用解析公式计算斜率
一阶线性回归的斜率可通过推导后的简化公式计算,x相关值只需预计算一次:
import numpy as np # 预计算x的固定常量(仅执行一次) x = ... # 你的固定x数组 n = len(x) sum_x = np.sum(x) sum_x2 = np.sum(x ** 2) denominator = n * sum_x2 - sum_x ** 2 # 固定分母 # 单y数据集计算斜率 def get_slope(y): sum_y = np.sum(y) sum_xy = np.sum(x * y) return (n * sum_xy - sum_x * sum_y) / denominator
如果是批量处理多个y数据集(比如y是二维数组,每行对应一个数据集),可以用向量化操作一次性计算所有斜率:
# y为shape=(m, n)的数组,m是数据集数量,n是单数据集长度 sum_y = np.sum(y, axis=1) sum_xy = np.dot(y, x) # 等价于逐行计算x*y的和 slopes = (n * sum_xy - sum_x * sum_y) / denominator
方法2:预计算X矩阵的伪逆
如果偏好线性代数实现(对应np.linalg.lstsq逻辑),可以预先构造X矩阵并计算其伪逆,后续仅需矩阵乘法即可得到结果:
# 预计算(仅执行一次) X = np.vstack([x, np.ones_like(x)]).T X_pinv = np.linalg.pinv(X) # 单y数据集计算斜率(结果第一个元素为斜率,第二个为截距) def get_slope(y): return (X_pinv @ y)[0]
批量处理时,直接对y的转置做矩阵乘法即可:slopes = (X_pinv @ y.T)[0]
性能提升原因
np.polyfit是通用多项式拟合实现,包含阶数适配、参数校验、通用矩阵分解等冗余步骤;而上述方案完全针对固定x的一阶回归做了极简优化,仅保留必要计算逻辑,无额外开销,因此速度优势显著。
内容的提问来源于stack exchange,提问作者Miss_Orchid
相关产品推荐
相关产品推荐

