Dati gli input e gli output noti, possiamo generare funzioni candidate che mapperanno gli input in output? [chiuso]

0

Ho incontrato un problema in cui ho un insieme di input e un paio di coppie input-output conosciute. Sono interessato all'output, ma per ottenerlo devo capire come viene utilizzato l'input per generare l'output.

Quindi, ad esempio, potrei avere le seguenti stringhe di input insieme ad alcune stringhe di output conosciute

char001 --> dasjudash2 // known input/output
char002 --> ef2y789e2y // known
char003 --> jnjxf9823d // known
char004 --> ?          // unknown output
char005 --> ?          // unknown output

Credo che possa esistere qualche algoritmo che prende un input e produce l'output dato, ma questo algoritmo è sconosciuto. È molto probabile che anche le coppie vengano generate casualmente (ad esempio: guarda il cielo, scegli a caso una stringa di caratteri). Potrei fissarlo a lungo e duramente e provare a pensare a come sono correlati, ma i computer possono probabilmente aiutarmi.

Fondamentalmente, dati gli input e gli output conosciuti, è possibile trovare potenziali funzioni che prenderanno input noti e genereranno output noti, e quindi usarli per prendere il resto degli input e generare le uscite corrispondenti?

Dato che la soluzione potrebbe essere una delle infinite possibilità (compresa la possibilità che non esista alcuna soluzione, nel caso in cui qualcuno guardasse il cielo e scelga caratteri casuali da un cappello), lo abbandonerei rapidamente come un compito computazionalmente non realizzabile, ma forse la mia intuizione è sbagliata e ci sono prove di ricerca per dimostrare che questo problema è risolvibile?

    
posta That Umbrella Guy 10.07.2014 - 06:38
fonte

3 risposte

6

Questo è un classico problema di apprendimento automatico. È un esempio di regressione. Vorresti dividere il tuo set di "conosciuti" in due gruppi, uno con cui allenarti e uno contro cui confrontarti. Imposta l'algoritmo di apprendimento automatico appropriato * e allenati con una parte dei tuoi conosciuti. Quindi inserire l'altro set di ingressi per verificare l'affidabilità della risposta rispetto alle uscite conosciute. Ripeti.

Questa è la versione breve: c'è molto lavoro e apprendimento che vanno nel mezzo.

Una nota, tuttavia, è che le probabilità sono che, quando trovi qualche mappatura dagli input agli output, non sarai in grado di decifrare cosa significhi. Potrebbe essere sotto forma di una serie di array rettangolari di numeri in virgola mobile. La soluzione effettiva che fa il mapping probabilmente finirà per essere un insieme di parametri per un calcolo sottostante che funziona, senza essere chiaro perché.

* inserisci tonnellate di duro lavoro qui

    
risposta data 10.07.2014 - 08:35
fonte
4

Dovresti sicuramente avere più esperienza in informatica teorica. Questa funzione è banale da definire. Supponiamo di avere coppie p_i = (I_i, O_i) di coppie di input / output, quindi è possibile definire f(I) con if-else semplice, in cui si verifica se I == I_i e quindi si restituisce O_i per ogni i . Dato che il tuo I_i è unico (cioè le tue coppie mostrano il determinismo del calcolo dell'output), questa funzione riproduce chiaramente tutte le tue coppie di input / output correttamente.

Pertanto, potrebbe non esserci mai una soluzione no . Tuttavia, non sarà mai una soluzione interessante, in quanto non fa molto di niente, per non parlare di gestire correttamente altri input. Inoltre, puoi mai indovinare una funzione che restituisce il risultato corretto per il nuovo input char004 , semplicemente, perché la definizione di correct è carente.

In termini matematici, sei sempre libero di definire parzialmente le funzioni, ovvero f(x) = x per tutto x eccetto i tuoi I_i ingressi e f(I_1) = O_1, f(I_2) = O_2, ... . A causa di ciò, se si fornisce solo un certo numero di punti, non si può mai essere in grado di dire qualcosa su una funzione generale che lo produce. Pertanto, in matematica, limitiamo spesso la funzione che stiamo cercando in certi modi. Ad esempio, se si desidera trovare una funzione polinomiale non parzialmente definita, una coppia di input / output può avvicinarsi molto. Ma per farlo funzionare, dobbiamo fare affidamento su cose come la continuità.

Se non aggiungi qualche restrizione simile per le funzioni desiderate, ci saranno sempre infinite soluzioni non interessanti.

    
risposta data 10.07.2014 - 06:58
fonte
1

È banale generare funzioni che associano gli input noti alle uscite note e gli altri input ad alcune uscite. È, tuttavia, impossibile generare funzioni che associno gli altri input agli output "giusti", semplicemente perché non si conoscono le uscite "giuste".

O, per dirla in un altro modo: dato che non sai cosa dovrebbero essere le uscite, posso darti solo circa qualsiasi funzione e non hai motivo di credere che non sia quella corretta .

def algorithm_guesser(name, known_inputs)
  define_method(name) do |input| known_inputs[input] or raise ArgumentError end
end

algorithm_guesser(:mystery_function, 
  'char001' => 'dasjudash2', 
  'char002' => 'ef2y789e2y', 
  'char003' => 'jnjxf9823d')

mystery_function('char001')
# => 'dasjudash2'

mystery_function('char004')
# ArgumentError

Ovviamente, questo non è terribilmente utile, ma è corretto come qualsiasi altra funzione che riesci a trovare.

    
risposta data 10.07.2014 - 12:36
fonte

Leggi altre domande sui tag