scipy.interpolate.lagrange在某些数据上失败

时间:2017-10-11 10:53:05

标签: python machine-learning scipy

我只是选择了python来实现机器学习作业,以便练习我在课堂上收集的知识。

我是python的新手,因此我发现spicy库提供了一堆非常有用的数学工具,其中使用interpolate.lagrange进行一维多项式的拉格朗日插值。

我正在尝试使用该函数来制作一个我将在之后使用的等式。虽然我收到以下错误:

  

/usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py:1186:   RuntimeWarning:在true_divide返回中遇到的除以零   poly1d(self.coeffs /其他)   /usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py:681:   RuntimeWarning:double_scalars中遇到无效值

代码:

import sys
import math
import os
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt

x = []
y = []
file = open(os.getcwd()+"/practice/train.txt", "r")
for line in file.read().split():
     x.append(float(line.split(',')[0])) 
     y.append(float(line.split(',')[1]))


poly = interpolate.lagrange(x, y)
print poly(1.5)

训练数据集:https://s3.amazonaws.com/hr-testcases/399/assets/trainingdata.txt

到目前为止我已经尝试过:我知道数据中的某些行会导致零分割。在数据集上使用分而治之;删除一些行会使它工作但我会以poly(x)打印非准确y(f(x))的方式失去准确性。

注意:我仍然没有跟踪触发零分割的线。

任何解释都会非常感激。

1 个答案:

答案 0 :(得分:2)

除以零错误的原因是您有重复的数据点。例如,x[40]x[64]是相同的。由于算法的工作原理,在某些时候你最终会做something / (x[40] - x[64])

但是,即使删除重复项,您也会遇到其他问题。您的数据集代表函数f(x) = 2 * x if x < 4 else 8。这不是一个简单的多项式,并且插值将在其尝试中疯狂地失败。此外,您的数据点是混洗的,这意味着您应该期望获得不同的结果,具体取决于您采用的数据集的切片,例如,仅x > 4的点数,或仅x < 4,或者最有可能的是之间。

最后,但并非最重要的是,即使您按升序对数据点进行排序,该函数的documentation也表示它在数值上不稳定。

  

警告:此实现在数值上不稳定。即使最佳选择,也不要期望能够使用超过20分。

>>> xx, yy = list(zip(*sorted(set(zip(x, y)))))
>>> for k in range(15, 25):
    print(k, interpolate.lagrange(xx[:k], yy[:k])(1))


15 1.99999915221
16 1.99998531246
17 1.99992345466
18 1.99993904792
19 2.00236333472
20 2.01589034207
21 -1.04477498867
22 -20.8148132927
23 -172.983956978
24 4185.90603781