Est-il possible de prédire la valeur de fonction inconnue en fonction de ses valeurs précédentes
Question
Je les valeurs renvoyées par la fonction inconnue comme par exemple
# this is an easy case - parabolic function
# but in my case function is realy unknown as it is connected to process execution time
[0, 1, 4, 9]
est-il un moyen de prédire la valeur suivante?
La solution
Voir aussi cette question.
Autres conseils
Pas nécessairement. Votre « fonction parabolique » peut être mis en œuvre comme ceci:
def mindscrew
@nums ||= [0, 1, 4, 9, "cat", "dog", "cheese"]
@nums.pop
end
Vous pouvez faire une supposition, mais de prédire avec certitude est impossible.
Si vous voulez juste des points de données
Extrapolation de extérieur des points connus peut être estimée , mais vous devez accepter les différences potentielles sont beaucoup plus grandes que par interpolation des données entre points connus. Strictement, les deux peuvent être arbitrairement inexactes, que la fonction pourrait faire quelque chose de fou entre les points connus, même si elle est une fonction continue bien comportés. Et si elle est pas bien comportés, tous les paris sont déjà hors ;-P
Il y a un certain nombre d'approches mathématiques à ce (qui ont une application directe à la science informatique) - quelque chose de simple, algèbre linéaire à des choses comme splines cubiques; et tout le reste.
Si vous voulez que la fonction
Obtenir ésotérique; un autre modèle intéressant est la programmation génétique ici; en évoluant une expression sur les points de données connus, il est possible de trouver une approximation convenablement proche. Parfois, cela fonctionne; parfois, il ne fonctionne pas. Pas la langue que vous recherchez, mais Jason Bock montre quelques code C # qui fait cela dans .NET 3.5, ici: expressions LINQ Évoluer.
J'arrive d'avoir son code « à la main » (je l'ai utilisé dans certaines présentations); avec quelque chose comme a => a * a
il trouvera presque instantanément, mais il devrait (en théorie) être en mesure de trouver pratiquement toute méthode - mais sans aucune longueur de course maximale définie ;-P Il est également possible d'entrer dans une impasse (au sens de l'évolution) où vous récupérez tout simplement jamais ...
Utilisez le Wolfram Alpha API :)
Oui. Peut-être.
Si vous avez des valeurs d'entrée et de sortie, soit dans votre cas [0,1,2,3] et [0,1,4,9], vous pouvez utiliser des surfaces de réponse (ajustement de la fonction basiquement je crois) à ' deviner la fonction réelle (dans le cas f (x) = x ^ 2). Si vous laissez votre fonction deviner être f (x) = c1 * x + c2 * x ^ 2 + c3 il y a des algorithmes qui détermineront que c1 = 0, c2 = 1 et c3 = 0 donné votre entrée et de sortie et compte tenu du résultat la fonction que vous pouvez prédire la valeur suivante.
Notez que la plupart des autres réponses à cette question sont valables aussi bien. Je suis juste suppose que vous voulez adapter une fonction aux données. En d'autres termes, je trouve votre question assez vague, s'il vous plaît essayer de poser vos questions aussi complète que possible!
En général, non ... à moins que vous savez que c'est une fonction d'une forme particulière (par exemple un polynôme de degré N certaine) et il y a suffisamment d'informations pour limiter la fonction.
par exemple. pour une plus "ordinaire" contre-(voir la réponse de Chuck) pourquoi vous ne pouvez pas nécessairement supposer n ^ 2 w / o sachant que c'est une équation du second degré, vous pourriez avoir f (n) = n 4 - 6n 3 + 12n 2 - 6n, ce qui a pour n = 0,1,2,3,4,5 f (n) = 0,1,4,9 , 40145.
Si vous ne savez que c'est une forme particulière, il y a quelques options ... si la forme est une addition linéaire de fonctions de base (par exemple, f (x) = a + b cos (x) + c sqrt (x)) puis en utilisant des moindres carrés, vous pouvez obtenir les coefficients inconnus pour le meilleur ajustement utilisant ces fonctions de base.
Vous pouvez appliquer des méthodes statistiques pour essayer de deviner la réponse suivante, mais cela pourrait ne pas fonctionner très bien si la fonction est comme celui-ci (c):
int evil(void){
static int e = 0;
if(50 == e++){
e = e * 100;
}
return e;
}
Cette fonction retourne de plus en plus simple et agréable alors ... BAM.