C'è un modo per predire il valore funzione sconosciuta sulla base dei suoi valori precedenti

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

  •  18-09-2019
  •  | 
  •  

Domanda

Non ho valori restituiti dalla funzione sconosciuta, come ad esempio

# 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]

c'è un modo per predire il valore successivo?

È stato utile?

Soluzione

Si veda anche questa domanda .

Altri suggerimenti

Non necessariamente. Il tuo "funzione parabolica" potrebbe essere implementato in questo modo:

def mindscrew
  @nums ||= [0, 1, 4, 9, "cat", "dog", "cheese"]
  @nums.pop
end

Si può prendere una supposizione, ma prevedere con certezza è impossibile.

Si può provare a utilizzare reti neurali approccio. Ci sono abbastanza molti articoli si possono trovare da query di Google "approssimazione di funzioni di rete neurale". Molti libri sono disponibili anche, ad esempio, questo .

Se si desidera solo i punti dati

L'estrapolazione dei dati fuori di punti noti possono essere stimato , ma è necessario accettare le differenze di potenziale sono molto più grandi con l'interpolazione dei dati tra punti noti. In senso stretto, entrambi possono essere arbitrariamente imprecise, in quanto la funzione potrebbe fare pazzie tra i punti noti, anche se si tratta di una funzione continua ben educati. E se non è ben educati, tutte le scommesse sono già fuori ;-p

Ci sono una serie di approcci matematici a questo (che hanno diretta applicazione alla scienza informatica) - qualsiasi cosa, da semplice algebra lineare a cose come spline cubiche; e tutto il resto.

Se si desidera che la funzione

Come esoterica; un altro modello interessante è la programmazione genetica; evolvendo un'espressione negli noti punti di dati, è possibile trovare una opportunamente approssimazione. A volte funziona; a volte non è così. Non la lingua che cercate, ma Jason Bock mostra po 'di codice C # che fa questo in .NET 3.5, qui: L'evoluzione LINQ Espressioni .

mi capita di avere il suo codice "a portata di mano" (ho usato in alcune presentazioni); con qualcosa come a => a * a si trovano quasi istantaneamente, ma dovrebbe (in teoria) essere in grado di trovare praticamente qualsiasi metodo - ma senza la massima tiratura definito ;-p E 'anche possibile entrare in un vicolo cieco (evolutiva parlando) dove è semplicemente mai recuperare ...

Utilizza il Wolfram Alpha API :)

Sì. Forse.

Se si dispone di alcuni valori di ingresso e di uscita, vale a dire nel tuo caso [0,1,2,3] e [0,1,4,9], è possibile utilizzare superfici di risposta (raccordo funzione fondamentalmente credo) a ' immagino la funzione reale (nel tuo caso f (x) = x ^ 2). Se si lascia che la vostra funzione indovinando essere f (x) = c1 * x + c2 * x ^ 2 + C3 ci sono algoritmi che determineranno che c1 = 0, c2 = 1 e c3 = 0 dato il vostro ingresso e di uscita e dato il conseguente funzione è possibile predire il valore successivo.

Si noti che la maggior parte delle altre risposte a questa domanda sono validi pure. Sto solo dal presupposto che si vuole adattare qualche funzione ai dati. In altre parole, trovo la tua domanda piuttosto vaghi, per favore cerca di porre le vostre domande il più completo possibile!

In generale, no ... a meno che non si sa che è una funzione di una particolare forma (ad esempio polinomio di un certo grado N) e non v'è abbastanza informazioni per vincolare la funzione.

es. per un controesempio più "ordinario" (vedi risposta di Chuck) per il motivo per cui non si può necessariamente assumere n ^ 2 w / o sapendo che è un'equazione di secondo grado, si potrebbe avere f (n) = n 4 - 6n 3 + 12n 2 - 6n, che ha per n = 0,1,2,3,4,5 f (n) = 0,1,4,9 , 40.145.

Se non sai che è una forma particolare, ci sono alcune opzioni ... se il modulo è un'aggiunta lineare di funzioni di base (ad esempio, f (x) = a + b cos (x) + c sqrt (x)) poi con minimi quadrati si possono ottenere i coefficienti ignoti per la misura migliore utilizzo di tali funzioni di base.

È possibile applicare metodi statistici per cercare di indovinare la risposta successiva, ma questo potrebbe non funzionare molto bene se la funzione è come questo (c):

int evil(void){
  static int e = 0;
  if(50 == e++){
    e = e * 100;
  }
  return e;
}

Questa funzione restituisce bello semplice numero crescente poi ... BAM.

Questo è un problema difficile.

Si dovrebbe verificare la recidiva relazione equazione per casi particolari in cui potrebbe essere possibile tale un compito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top