Est-il possible de prédire la valeur de fonction inconnue en fonction de ses valeurs précédentes

StackOverflow https://stackoverflow.com/questions/1150862

  •  18-09-2019
  •  | 
  •  

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?

Était-ce utile?

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.

Vous pouvez essayer d'utiliser approche réseaux de neurones. Il y a assez de nombreux articles que vous pouvez trouver par Google requête « approximation de la fonction de réseau de neurones ». De nombreux livres sont également disponibles, par exemple celui-ci .

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.

C'est un problème difficile.

Vous devriez vérifier la relation équation pour les cas particuliers où il pourrait être possible par exemple une tâche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top