numpy - 使用 numpy 将数据拟合为 y = y = a*x**2 + b*x + c(其中 c=0)

标签 numpy data-fitting

菜鸟问题在这里,请耐心等待:
我正在尝试使用 numpy.polynomial.polynomial.Polynomial.fit(x,y,deg).convert().coef获得零相交多项式的系数 y = ax**2 + bx + c(其中 c=0)适合一组测量数据。当我使用 deg=2 或 deg=[0,1,2] 时,我可以很好地拟合 a、b 和 c 的系数。但是,当我使用 deg = [1,2] 来强制 c=0 时,我仍然得到三个系数,但它们根本不适合。我究竟做错了什么?
这是一个带有真实数据的代码示例:

import numpy as np
from numpy.polynomial.polynomial import Polynomial as p

x = np.array([0, .1, .5, 1, 2])
y_series = np.array([[2, 319, 1693, 3713, 8695],
                     [3, 327, 1828, 4131, 10111],
                     [3, 304, 1653, 3617, 8678],
                     [4,300,1675,3745,8922],
                     [3, 298,1661,3653,8694],
                     [5, 304,1642,3686,8670],
                     [3, 313,1688,3724,8657],
                     [5, 315,1736,3821,8963],
                     [3, 247,1300,2767,6376]
                     ])

for y in y_series:
    print('x: ', x,'y: ', y)
    print('deg=2:      ', p.fit(x, y, deg=2).convert().coef)
    print('deg=[0,1,2]:', p.fit(x, y, deg=[0,1,2]).convert().coef)
    print('deg=[1,2]:  ', p.fit(x, y, deg=[1,2]).convert().coef)
    print('')

最佳答案

类似于以前的 post您在使用 window 时遇到问题Polynomial的论据类(class)。在您定义的窗口中,系数实际上为零,这是默认值,即 [ -1, 1 ] .如果在调用 convert() 之前打印系数它实际上是零。提供窗口可以解决问题。
看看这个:

import numpy as np
from numpy.polynomial.polynomial import Polynomial


def parabola( x, a, b, c , s=0 ):
    if isinstance( x, ( int, float, complex ) ):
        r = np.random.normal( scale=s )
    else:
        r = np.random.normal( scale=s, size=len( x ) )
    return a + b * x + c * x**2 + r



xl = np.linspace( -2, 3, 15 )
yl = parabola( xl, 0.01, 0.8, 0.21, s=0.1 )

print("\n p1: ")
p1 = Polynomial.fit( xl, yl, deg=[0,1,2] )
print( p1.coef )
print( p1.convert().coef )

print("\n p2: ")
p2 = Polynomial.fit( xl, yl, deg=[1,2] )
print( p2.coef )
print( p2.convert().coef )
print( p2.domain )
print( p2.window )

print("\n p3: ")
p3 = Polynomial.fit( xl, yl, deg=[1,2], window=[ min( xl ), max( xl ) ] )
print( p3.coef )

关于numpy - 使用 numpy 将数据拟合为 y = y = a*x**2 + b*x + c(其中 c=0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69573962/

相关文章:

Python:Numpy 将数组组合成 2x1 列表

python - Cython 是否提供任何合理简单有效的方法来迭代 Numpy 数组,就好像它们是扁平的一样?

python - 循环中的累积加法

python - 在具有共享 x 轴的子图中拟合对数正态分布的直方图

python - 有没有办法从 scipy.stats.norm.fit 获取拟合参数的错误?

python - 集合中的数组元素是什么?

python - 检查系列是否包含列表中的任何元素

r - 如何在 R 中将数据与特定范围内的平线拟合?

design-patterns - 数学 : Processing Fit Parameters

matlab - 转换数据以适应正态分布