关于这个问题:多项式方程参数,我得到了一个二次函数的三个参数
y = a*x² + b*x + c
,现在我只想得到描述我的函数y = a*x²
的第一个参数。换句话说:我想将b=c=0
并得到适应的a
参数。如果我理解正确,polyfit无法做到这一点。y = a*x² + b*x + c
,现在我只想得到描述我的函数y = a*x²
的第一个参数。换句话说:我想将b=c=0
并得到适应的a
参数。如果我理解正确,polyfit无法做到这一点。x
和y
,首先构造所谓的设计矩阵 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
拟合到你将其放入设计矩阵中的任何列的线性组合中。例如,它可以用于2D拟合,例如z = a * x + b * y
(请参见例如此示例,在Matlab中使用了相同的技巧),或者带有缺失系数的多项式拟合,就像你的问题一样。
在您的情况下,设计矩阵只是包含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()
系数是为了最小化平方误差而得到的,你不需要指定它们。但是,如果某些系数太不重要,你可以将它们设置为零。例如,我有一个曲线上的点列表 y = 33*x²
:
In [51]: x=np.arange(20)
In [52]: y=33*x**2 #y = 33*x²
In [53]: coeffs=np.polyfit(x, y, 2)
In [54]: coeffs
Out[54]: array([ 3.30000000e+01, 8.99625199e-14, -7.62430619e-13])
In [55]: epsilon=np.finfo(np.float32).eps
In [56]: coeffs[np.abs(coeffs)<epsilon]=0
In [57]: coeffs
Out[57]: array([ 33., 0., 0.])
np.polyfit
用于将多项式拟合到一些点上,你如何知道你的y = a*x²
会适合你的点? - zhangxaochen