numpy.polyfit与适应参数

时间:2014-03-02 10:07:07

标签: python numpy polynomial-math

关于此:polynomial equation parameters 我得到3个参数用于平方函数y = a*x² + b*x + c现在我只想获得描述我的函数y = a*x²的平方函数的第一个参数。换句话说:我想设置b=c=0并获取a的适应参数。如果我理解正确,polyfit就无法做到这一点。

2 个答案:

答案 0 :(得分:7)

这可以通过numpy.linalg.lstsq来完成。为了解释如何使用它,最简单的方法是展示如何“手动”进行标准的二阶polyfit。假设您有测量向量xy,那么首先构建一个所谓的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()

结果: enter image description here

答案 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.])