【问题标题】:numpy.polyfit with adapted parametersnumpy.polyfit 调整参数
【发布时间】:2014-04-03 06:56:16
【问题描述】:

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

【问题讨论】:

  • np.polyfit 用于将多项式拟合到某些点,您怎么知道您的 y = a*x² 是否适合您的点?
  • 我可以保证我的点适合 y=a*x²...当我使用 polyfit 时,我得到一些 b 和 c 的值 20)

标签: python numpy polynomial-math


【解决方案1】:

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

结果:

【讨论】:

    【解决方案2】:

    系数是用来最小化平方误差的,你不分配它们。但是,如果某些系数太不显着,您可以将它们设置为零。例如,我在曲线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.])
    

    【讨论】:

    • 这仅适用于无噪声数据。如果您的数据包含噪声,其他系数也将不为零,并且您对二次项的估计将不包含最佳值。
    猜你喜欢
    • 2020-03-19
    • 2016-11-20
    • 2016-01-15
    • 2014-12-13
    • 2019-07-20
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多