2017-10-11 111 views
0

我刚拿起python来实现机器学习任务,以便练习我在课堂上收集的知识。scipy.interpolate.lagrange在某些数据上失败

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

我试图使用该函数有一个方程式,我将在以后使用。虽然我得到了以下错误:

/usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py:1186: RuntimeWarning: divide by zero encountered in true_divide return poly1d(self.coeffs/other) /usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py:681: RuntimeWarning: invalid value encountered in 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


我迄今为止尝试:我理解数据中的某些行会导致i到零分区。在数据集上使用分治法;擦除一些行将使其工作,但我会以一种不正确的y(f(x))打印方式失去准确性。

注:我还没有跟踪触发零分的线。

任何解释将非常赞赏。

+1

,你目前的数据不排序,结果看起来像一个分段线性函数,那不是最理想的是采用多项式插值。 此外,拉格朗日插值例程提到“警告:这种实现在数值上不稳定,即使选择最佳,也不要期望能够使用超过20个点”。你能提到你为什么选择这个吗? –

回答

2

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

但是,即使您删除重复项,也有其他问题。您的数据集代表功能f(x) = 2 * x if x < 4 else 8。这不是一个微不足道的多项式,插值将在尝试中失败。此外,您的数据点将进行混洗,这意味着您应根据所采集的数据集的片段得到不同的结果,例如,仅针对x > 4或仅针对x < 4,或者最有可能的是其中的某个点。

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

Warning: This implementation is numerically unstable. Do not expect to be able to use more than about 20 points even if they are chosen optimally.

>>> 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 
+0

使用裸眼我也可以得出结论,每x> 4 y = 8。你认为把所有的x <4并插入多项式会给我可以使用的东西吗? –

+0

在你回答我之前,我想象了R上的数据。使用纸和笔我可以发现,当x <4时,我的f(x)可以取2倍,当x> 4时8取8。虽然,拉格朗日因为你刚才所说的话而不断失败。感谢您的详细解释。 –

+0

我会期待先生。 –

相关问题