这可以通过numpy.linalg.lstsq 完成。为了解释如何使用它,最简单的方法可能是展示如何“手动”进行标准的二阶 polyfit。假设你有你的测量向量x 和y,你首先构造一个所谓的design matrix M 像这样:
M = np.column_stack((x**2, x, np.ones_like(x)))
之后,您可以使用lstsq 获得通常的系数作为方程M * k = y 的最小二乘解,如下所示:
k, _, _, _ = np.linalg.lstsq(M, y)
其中k 是具有通常系数的列向量[a, b, c]。请注意,lstsq 返回一些其他参数,您可以忽略这些参数。这是一个非常强大的技巧,它允许您将y 拟合到您放入设计矩阵的列的任何线性组合中。它可以用于例如对于 z = a * x + b * y 类型的 2D 拟合(参见例如 this example,我在 Matlab 中使用了相同的技巧),或者像你的问题中缺少系数的 polyfits。
在您的情况下,设计矩阵只是包含x**2 的单列。快速示例:
import numpy as np
import matplotlib.pylab as plt
# generate some noisy data
x = np.arange(1000)
y = 0.0001234 * x**2 + 3*np.random.randn(len(x))
# do fit
M = np.column_stack((x**2,)) # construct design matrix
k, _, _, _ = np.linalg.lstsq(M, y) # least-square fit of M * k = y
# quick plot
plt.plot(x, y, '.', x, k*x**2, 'r', linewidth=3)
plt.legend(('measurement', 'fit'), loc=2)
plt.title('best fit: y = {:.8f} * x**2'.format(k[0]))
plt.show()
结果: