如何在numpy中修复“polyfit可能条件差”?

时间:2018-04-18 14:39:57

标签: python numpy

我正在尝试使用numpy包对一组数据进行polyfit。

以下是代码,它可以成功运行。当订单达到20左右(非常高)时,拟合线似乎符合数据。然而,最后,它说“Polyfit可能条件差”。

如果我没有错,那么当程度越高时,拟合对数据敏感,即容易受数据影响吗?我怎样才能解决这个问题?谢谢!

非常感谢您的回答。

def gen_data_9(length=5000):
x = 2.0 * (np.random.rand(length) - 0.5) * np.pi * 2.0
f = lambda x: np.exp(-x**2) * (-x) * 5 + x / 3
y = f(x) + np.random.randn(len(x)) * 0.5
return x, y, f

fig,ax = plt.subplots(3,3,figsize = (16,16))

for n in range(3):
    for k in range(3):

        order = 20*n+10*k+1
        z = np.polyfit(x,y,order)
        p = np.poly1d(z)

        ax[n,k].scatter(x,y,label = "Real data",s=1)
        ax[n,k].scatter(x,p(x),label = "Polynomial with order={}".format(order),
                    color='C1',s=1)
    ax[n,k].legend()

fig.show()

2 个答案:

答案 0 :(得分:2)

TL; DR:在这种情况下,警告意味着:使用较低的订单!

引用documentation

  

注意,当多项式的次数较大或样本点的间隔严重居中时,拟合多项式系数本质上是严格条件的。在这些情况下,应始终检查配合的质量。当多项式拟合不令人满意时,样条可能是一个很好的选择。

换句话说,警告会告诉您仔细检查结果。如果它们好像不用担心。但他们没事吗?要回答这个问题,你不仅应该评估用于拟合的数据点(这些数据点通常匹配得相当好,特别是在过度拟合时)。考虑一下:

xp = np.linspace(-1, 1, 10000) * 2 * np.pi

for n in range(3):
    for k in range(3):

        order = 20*n+10*k+1
        print(order)
        z = np.polyfit(x,y,order)
        p = np.poly1d(z)

        ax[n,k].scatter(x,y,label = "Real data",s=1)
        ax[n,k].plot(xp,p(xp),label = "Polynomial with order={}".format(order), color='C1')
        ax[n,k].legend()

在这里,我们评估比样本数据更精细的点上的polyfit。这是结果:

enter image description here

你可以看到,对于订单40和obove,结果真的开始了。这与我得到的警告一致。

答案 1 :(得分:0)

如果使用多项式类,您将获得更好的拟合,但如果您以高阶拟合超越数据的末尾,您将看到上面显示的快速分歧,因为您正在推断。要使用多项式类

from numpy.polynomial import Polynomial as P
p = P.fit(x, y, order)

您还可以尝试使用更稳定的多项式基础,这些基数在高阶(例如100+)下会更好地调节,尽管对于您正在使用的噪声数据而言,这几乎是不合理的。

from numpy.polynomial import Chebyshev as T
p = T.fit(x, y, order)

你可以从这样的拟合中绘制点x,y的界限:

plot(*p.linspace(500))