关于此:polynomial equation parameters
我得到3个参数用于平方函数y = a*x² + b*x + c
现在我只想获得描述我的函数y = a*x²
的平方函数的第一个参数。换句话说:我想设置b=c=0
并获取a
的适应参数。如果我理解正确,polyfit就无法做到这一点。
答案 0 :(得分:7)
这可以通过numpy.linalg.lstsq来完成。为了解释如何使用它,最简单的方法是展示如何“手动”进行标准的二阶polyfit。假设您有测量向量x
和y
,那么首先构建一个所谓的design matrix M
,如下所示:
M = np.column_stack((x**2, x, np.ones_like(x)))
之后你可以使用M * k = y
获得通常的系数作为等式lstsq
的最小二乘解,如下所示:
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()
结果:
答案 1 :(得分:-1)
系数可以最小化平方误差,您不需要分配它们。但是,如果它们太无关紧要,您可以将某些系数设置为零。例如,我在曲线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.])