9
votes

Obtenez la formule d'une fonction d'interpolation créée par Scipy

J'ai fait du travail dans Python, mais je suis nouveau à Scipey . J'essaie d'utiliser les méthodes à partir de la bibliothèque interpolate pour proposer une fonction qui se rapprochera d'un ensemble de données.

J'ai regardé quelques exemples pour commencer et pourriez obtenir Le code exemple ci-dessous fonctionne dans python (x, y) : xxx

L'intrigue est affichée comme suit:

interpolation-parcelle

Maintenant, y a-t-il un moyen d'obtenir une expression polynomiale représentant la fonction interpolée créée par rbf (c'est-à-dire la méthode créée comme rbf_interp )? < p> ou, si cela n'est pas possible avec rbf , toute suggestion utilisant une méthode d'interpolation différente, une autre bibliothèque ou même un outil différent sont également les bienvenues.


2 commentaires

En regardant les docs pour scipy.interpoler.rbf et pour le module scipey.interpoler Je ne vois rien de ce que vous voulez. La seule façon de penser est de lire le code source et de comprendre comment la fonction est créée en fonction des paramètres, puis écrivez votre propre fonction capable de renvoyer une représentation lisible. Mais cela dépendrait des détails de la mise en œuvre. Même si je ne vois pas comment tu pourrais loin ça.


Considérons deux étapes: données -> une courbe (par RBF ou autre), puis courbe -> Polynôme par morceaux: une spline. Il est facile d'enregistrer des paramètres SPLINE (nigner + 1) * 4 - Demandez-vous à plus que c'est ce que vous voulez faire.


5 Réponses :


1
votes

RBF signifie probablement fonction de base radiale . Je ne serais pas surpris si sciped.interpolate .Rbf était la fonction que vous recherchez.

Cependant, je doute que vous puissiez trouver une expression polynomiale pour représenter votre résultat.

Si vous souhaitez essayer différentes méthodes d'interpolation, cochez la case correspondante documentation sciped , qui donne un lien vers RBF, Splines ...


1 commentaires

Bonjour @pierre, peut-être que je n'étais pas clair dans ma question. J'utilise scipy.interpoler.rbf déjà. Ce que j'aimerais savoir, c'est si je peux extraire une formule qui représente la fonction d'interpolation créée (par exemple exp (x) + x ^ 3-x ^ 2 , etc.)



4
votes

La réponse est non, il n'y a pas de «bon» moyen d'écrire la formule, ou du moins pas de courte durée. Certains types d'interpolations, tels que RBF et LOESS, ne recherchent pas directement une fonction mathématique paramétrique à adapter aux données et calculent plutôt la valeur de chaque nouveau point de données séparément en fonction des autres points.

Ces interpolations sont garanties de manière à toujours donner un bon ajustement pour vos données (telles que dans votre cas), et la raison en est que de les décrire, vous devez avoir un très grand nombre de paramètres (fondamentalement tous vos points de données). Pensez-y de cette façon: vous pouvez interpoler linéairement en connectant des points de données consécutifs avec des lignes droites. Vous pouvez adapter toutes les données de cette façon, puis décrivez la fonction sous une forme mathématique, mais cela prendrait un grand nombre de paramètres (au moins autant que le nombre de points). En fait, ce que vous faites en ce moment est à peu près une version lissée de celle-là.

Si vous souhaitez que la formule soit courte, cela signifie que vous souhaitez décrire les données avec une fonction mathématique qui ne dispose pas de nombreux paramètres (spécifiquement, le nombre de paramètres devrait être beaucoup plus bas que le nombre de points de données). De tels exemples sont des fonctions logistiques, des fonctions polynomiales et même la fonction sinueuse (que vous avez utilisée pour générer les données). Évidemment, si vous savez quelle fonction a généré les données qui seront la fonction que vous souhaitez adapter.


3 commentaires

Bonjour @Bitwise, bien sûr dans le code ci-dessus, je connais la fonction ( f (x) = sin (2 * pi * x) + bruit ); En réel, j'ai un ensemble de données dans un CSV et aucune idée de la fonction (je ne peux que faire des suppositions basées sur sa forme, c'est tout)


@Deduardo oui, c'est ce que j'ai supposé. Le point est que si vous avez une idée de quel type de modèle peut correspondre aux données, soit par des connaissances antérieures, soit simplement en regardant les données, cela pourrait vous indiquer sur quel type de fonction que vous devez utiliser. Sinon, cela pourrait être n'importe quoi et la seule chose que vous puissiez faire est d'essayer différentes familles de fonctions paramétriques.


J'ai légèrement édité ma réponse et ajouté un court exemple d'interpolation linéaire.



4
votes

Le RBF utilise toutes les fonctions que vous posez, c'est bien sûr un modèle global, alors oui, il existe un résultat de la fonction, mais bien sûr, c'est vrai que vous ne l'aimerez probablement pas car c'est une somme sur de nombreux gaussiens. Vous avez: xxx

donc avec ces éléments, vous pouvez calculer les distances (avec rbf.xi puis plongez les distances avec les facteurs dans rbf.nodes < / code> et rbf.epsilon dans le gaussien (ou quelle que soit la fonction que vous avez posée à utiliser). (Vous pouvez vérifier le code Python de __ appel __ et _call_norm < / code>)

Vous obtenez donc quelque chose comme Somme (rbf.nodes [i] * gaussien (rbf.epsilon, sqrt ((rbf.xi-center) ** 2)) car i , Centre en énumérant (RBF.Nodes)) Pour donner une demi-code / formule drôle, la fonction RBFS est écrite dans la documentation, mais vous pouvez également vérifier le code Python.


0 commentaires

0
votes

Je ne pense pas que Scipy's RBF vous donnera la fonction réelle. Mais une chose que vous pourriez faire est d'échantillonner la fonction que l'Egny's RBF vous a donné (100 points). Ensuite, utilisez l'interprétation de Lagrange avec ces points. Cela générera une fonction polynomiale pour vous. Voici un exemple sur la façon dont cela ressemblerait. Si vous ne souhaitez pas utiliser l'interpolation de Lagrange, vous pouvez également utiliser «la méthode de différence de dividendes de Newton» pour générer une fonction polynomiale. Entrez la description de l'image ici


0 commentaires

0
votes

Ma réponse est basée sur NUMPY SEULEMENT:

import matplotlib.pyplot as plt
import numpy as np
x_data = [324, 531, 806, 1152, 1576, 2081, 2672, 3285, 3979, 4736]
y_data = [20, 25, 30, 35, 40, 45, 50, 55, 60, 65]
x =  np.array(x_data)
y = np.array(y_data)
model = np.poly1d(np.polyfit(x, y, 2))
ynew = model(x)
plt.plot(x, y, 'o', x, ynew, '-' , )
plt.ylabel( str(model).strip())
plt.show()


0 commentaires