如何获取二阶多项式趋势线的正确方程?
问题原因与修正方案
你得到错误方程的核心问题是误用了线性回归的结果来构建二阶多项式方程:stats.linregress()是用来计算一阶线性模型(y=ax+b)的参数,它返回的结果和二阶多项式(y=ax²+bx+c)的系数完全不对应,你却把这些线性回归的参数硬套进了二阶方程里,自然得到错误的结果。
正确的做法是直接用numpy.polyfit()来计算二阶多项式的系数,这才是专门用于多项式拟合的函数。
修正后的代码
import matplotlib.pyplot as plt import numpy as np data = [["2020-03-03",9.727273], ["2020-03-04",9.800000], ["2020-03-05",9.727273], ["2020-03-06",10.818182], ["2020-03-07",9.500000], ["2020-03-08",10.909091], ["2020-03-09",15.000000], ["2020-03-10",14.333333], ["2020-03-11",15.333333], ["2020-03-12",16.000000], ["2020-03-13",21.000000], ["2020-03-14",28.833333]] fig, ax = plt.subplots() dates = [x[0] for x in data] usage = [x[1] for x in data] x_values = range(len(usage)) # 用np.polyfit计算二阶多项式系数,返回顺序是[二次项, 一次项, 常数项] poly_coeffs = np.polyfit(x_values, usage, 2) # 生成多项式对象 poly_func = np.poly1d(poly_coeffs) # 构建正确的方程字符串,保留三位小数,用x²代替x**2 equation = f"y = {poly_coeffs[0]:.3f}x² + {poly_coeffs[1]:.3f}x + {poly_coeffs[2]:.3f}" ax.plot(x_values, usage, label='原始数据') ax.plot(x_values, poly_func(x_values), '--', label=equation) plt.legend() plt.show() print(equation)
关键改动说明
- 替换参数计算逻辑:用
np.polyfit(x_values, usage, 2)直接计算二阶多项式的三个系数,参数2代表拟合的多项式阶数 - 正确构建方程字符串:利用polyfit返回的系数顺序(高次到低次),格式化输出时保留三位小数,并用
x²让方程更易读 - 添加图例,方便区分原始数据和趋势线
运行修正后的代码,会输出你预期的近似方程:y = 0.220x² - 1.452x + 11.867,和你给出的正确方程完全匹配。
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

