为何Numpy polyfit线性拟合斜率与Excel线性趋势线结果一致?
Numpy polyfit线性拟合与Excel线性趋势线一致的原因及疑问解答
为什么线性拟合结果一致?
- 核心逻辑完全匹配:
np.polyfit(order=1)和Excel的线性趋势线,都采用最小二乘法拟合一元线性模型y = ax + b,目标都是让所有数据点到拟合直线的垂直距离平方和最小,算法底层逻辑完全相同。 - 输入变量对齐:你的代码用
data.index.values作为x轴数据,也就是从0开始的连续整数序列[0,1,2,...,11],这和Excel默认将数据的行号作为x轴(未指定自定义x值时)的处理逻辑完全一致。输入变量相同、算法相同,拟合结果自然一致。
为什么和Excel多项式趋势线斜率不同?
这是因为两者拟合的模型完全不同:
- 你用
order=1做的是线性拟合,得到的是直线的斜率,对应模型y = ax + b里的a。 - Excel的多项式趋势线(比如2阶)是拟合高阶曲线模型,比如
y = ax² + bx + c,这里的"斜率"其实是一阶项系数b,但整个模型是曲线,和线性模型的直线斜率不是同一个概念。模型维度不同,结果必然有差异。
是否存在操作错误?
从代码逻辑看没有错误:
- 你正确用
np.polyfit对索引(连续整数x)和Score值(y)做了线性拟合,当order=1时,coeffs的结果是[斜率, 截距],你提取的coeffs[-2]就是斜率(也可以直接取coeffs[0],结果一致)。 - 如果要和Excel多项式趋势线对比,只需要把
order参数改成对应阶数即可。比如要匹配Excel的2阶多项式趋势线,调用trendline(df['Score'], order=2),此时coeffs[-2]就是一阶项系数,和Excel多项式趋势线的一阶系数会一致。
示例代码(拟合2阶多项式):
# 拟合2阶多项式,对应Excel的2阶多项式趋势线 slope_2nd = trendline(df['Score'], order=2) print(slope_2nd)
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

