2017-10-11 3 views
0

Je viens de récupérer python pour implémenter des tâches d'apprentissage automatique afin de mettre en pratique les connaissances que j'ai recueillies en classe.scipy.interpolate.lagrange échoue sur certaines données

Je suis nouveau sur python, donc je viens de découvrir la bibliothèque spicy qui offre un tas d'outils mathématiques très utiles parmi lesquels l'interpolation de Lagrange pour les polynômes 1D en utilisant interpolate.lagrange. J'essaie d'utiliser cette fonction pour avoir une équation que je vais utiliser après. Bien que je reçois l'erreur suivante:

/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) 

ensemble de données de formation: https://s3.amazonaws.com/hr-testcases/399/assets/trainingdata.txt


Ce que j'ai essayé jusqu'à présent: je compris que certaines lignes dans le résultat des données i nà la division zéro. Utiliser diviser et conquérir sur l'ensemble de données; l'effacement de certaines lignes le ferait fonctionner mais je perdrais de la précision d'une manière qui poly(x) imprime un y non précis (f (x)).

Remarque: Je n'ai toujours pas suivi la ligne qui déclenche la division du zéro.

Toute explication serait très appréciée.

+1

Les données que vous présentez n'est pas ordonnée et le résultat ressemble à une fonction linéaire par morceaux, qui est pas idéalement interpolées à l'aide polynômes. En outre, la routine d'interpolation de Lagrange mentionne "Attention: cette implémentation est numériquement instable, ne comptez pas pouvoir utiliser plus de 20 points environ, même s'ils sont choisis de manière optimale.". Pourriez-vous mentionner pourquoi vous avez choisi cela? –

Répondre

2

La raison de l'erreur de division par zéro est que vous avez des points de données en double. Par exemple, x[40] et x[64] sont les mêmes. En raison du fonctionnement de l'algorithme, vous finirez par faire something/(x[40] - x[64]). Cependant, même si vous supprimez des doublons, vous avez d'autres problèmes. Votre jeu de données représente la fonction f(x) = 2 * x if x < 4 else 8. Ce n'est pas un polynôme trivial et l'interpolation échouera sauvagement dans sa tentative. En outre, vos points de données sont mélangés, ce qui signifie que vous devez attendre des résultats différents en fonction de la tranche de votre ensemble de données, par exemple x > 4, ou seulement x < 4 ou, plus probablement, quelque chose entre les deux. Dernier point, mais non des moindres, même si vous trier vos points de données dans un ordre croissant, le documentation pour les états de la fonction est numériquement instable.

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

En utilisant l'œil nu, je pourrais aussi bien conclure que pour tout x> 4 y = 8. Croyez-vous que prendre tout x <4 et interpoler le polynôme donnerait quelque chose avec lequel je pourrais travailler? –

+0

Avant que vous me répondiez j'ai visualisé les données sur R. En utilisant du papier et un stylo, j'ai pu comprendre que mon f (x) peut prendre 2x lorsque x <4 et 8 quand x> 4 comme mentionné. Bien, Lagrange a échoué en raison de ce que vous venez de dire. Merci pour votre explication détaillée. –

+0

Je serai impatient monsieur. –