适应参数的numpy.polyfit

4
关于这个问题:多项式方程参数,我得到了一个二次函数的三个参数y = a*x² + b*x + c,现在我只想得到描述我的函数y = a*x²第一个参数。换句话说:我想将b=c=0并得到适应的a参数。如果我理解正确,polyfit无法做到这一点。

np.polyfit 用于将多项式拟合到一些点上,你如何知道你的 y = a*x² 会适合你的点? - zhangxaochen
我可以保证我的点符合y=a*x²...当我使用polyfit时,b和c的一些值小于10^(-2)。(而a>20) - Munchkin
2个回答

7
这可以通过使用numpy.linalg.lstsq实现。为了解释如何使用它,最简单的方式可能是展示如何手动进行标准二次多项式拟合。假设您有测量向量xy,首先构造所谓的设计矩阵 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()

结果: 在此输入图片描述

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

这仅适用于无噪声数据。如果您的数据包含噪声,则其他系数也将非零,并且您对二次项的估计将不包含最优值。 - Bas Swinckels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接