2017-10-11 1 views
0

Ich habe gerade Python abgeholt, um maschinelle Lernaufgaben zu implementieren, um das Wissen, das ich im Unterricht gesammelt habe, zu üben.scipy.interpolate.lagrange schlägt bei einigen Daten fehl

Ich bin neu in Python, daher habe ich gerade spicy-Bibliothek entdeckt, die eine Reihe von sehr nützlichen mathematischen Tools darunter Lagrange-Interpolation für 1D-Polynome mit interpolate.lagrange bietet.

Ich versuche, diese Funktion zu verwenden, um eine Gleichung zu haben, die ich danach verwenden werde. Obwohl ich folgende Fehlermeldung bin immer:

/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


Code:

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) 

Trainingsdatenmenge: https://s3.amazonaws.com/hr-testcases/399/assets/trainingdata.txt


Was ich versucht habe, so weit: Ich verstanden, dass einige Zeilen in Daten resultieren i bis zur Null-Teilung. Verwenden von Divide and Conquer auf dem Dataset; das Löschen einiger Zeilen würde es funktionieren lassen, aber ich werde die Genauigkeit in einer Weise verlieren, dass poly(x) ein nicht genaues y (f (x)) druckt.

Hinweis: Ich habe die Linie, die die Zero Division auslöst, immer noch nicht verfolgt.

Jede Erklärung würde sehr geschätzt.

+1

Die Daten, die Sie ist nicht vorhanden bestellt und das Ergebnis sieht aus wie eine abschnittsweise lineare Funktion, das nicht ideal mit Polynome interpoliert. Auch die Lagrange-Interpolationsroutine erwähnt "Warnung: Diese Implementierung ist numerisch instabil. Erwarten Sie nicht, dass Sie mehr als ungefähr 20 Punkte verwenden können, selbst wenn sie optimal gewählt sind.". Können Sie erwähnen, warum Sie das gewählt haben? –

Antwort

2

Der Grund für den Fehler durch Division durch Null ist, dass Sie doppelte Datenpunkte haben. Zum Beispiel sind x[40] und x[64] die gleichen. Wegen der Funktionsweise des Algorithmus werden Sie irgendwann something/(x[40] - x[64]) tun.

Aber auch wenn Sie Duplikate entfernen, haben Sie andere Probleme. Ihr Datensatz repräsentiert die Funktion f(x) = 2 * x if x < 4 else 8. Dies ist kein triviales Polynom und die Interpolation wird in ihrem Versuch wild ausfallen. Darüber hinaus werden Ihre Datenpunkte gemischt, was bedeutet, dass Sie unterschiedliche Ergebnisse erwarten können, je nachdem, welche Schicht Ihres Datasets Sie verwenden, z. B. nur Punkte für x > 4 oder nur x < 4 oder höchstwahrscheinlich etwas dazwischen.

Last but not least wichtig, auch wenn Sie Ihre Datenpunkte in aufsteigender Reihenfolge sortieren, die documentation für die Funktion gibt an, dass es numerisch instabil ist.

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

Mit bloßem Auge könnte ich auch schlussfolgern, dass für jedes x> 4 y = 8. Glaubst du, dass das Nehmen von allem x <4 und das Interpolieren des Polynoms etwas geben würde, mit dem ich arbeiten kann? –

+0

Bevor Sie mir geantwortet haben, habe ich die Daten auf R visualisiert. Mit Papier und Stift konnte ich herausfinden, dass mein f (x) 2x annehmen kann, wenn x <4 und 8 wenn x> 4 wie erwähnt. Lagrange fiel trotzdem aufgrund dessen, was Sie gerade gesagt hatten, immer noch aus. Vielen Dank für Ihre ausführliche Erklärung. –

+0

Ich werde mich freuen, mein Herr. –

Verwandte Themen