2017-10-11 146 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

我會期待先生。 –

相關問題