Ricetta effettiva per risolvere il problema presentato (una possibile soluzione)
È semplice risolvere questo problema usando il mio strumento di apprendimento automatico preferito, vowpal wabbit che supporta le funzioni quadratiche (incrociate) tramite la sua opzione -q .
vowpal sfondo wabbit
Prima di saltare ai dettagli di utilizzo. vowpal wabbit è un software di apprendimento automatico online rapido e scalabile sia per la classificazione che per la regressione. Ottengo velocità di apprendimento (formazione) di circa 5 milioni di funzioni al secondo sul mio desktop senza limiti di dimensioni dei dati (numero di esempi) poiché come strumento di apprendimento online non richiede il caricamento di tutti i dati in memoria. Ha molte altre caratteristiche interessanti: supporto per diversi algoritmi di apprendimento, funzioni di perdita multipla, caratteristiche sparse, tipi di caratteristiche miste e altro, che esulano dallo scopo di questa domanda.
Ecco i 3 passaggi per risolvere il problema con i commenti:
Passaggio 0: scarica e crea vowpal wabbit da github (vedi nota in basso sugli ambienti supportati)
Passaggio 1: preparare un set di allenamento in cui ciascuna riga è simile alla seguente:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
spiegazione del formato del set di addestramento:
Il numero più a sinistra, 1.0 , è l'etichetta (forza di interazione, che può essere qualsiasi valore numerico), la seconda stringa ' protein1 / protein2 ' è un tag per dare alla linea un'identità, IOW: "questa linea rappresenta l'interazione tra protein1 e protein2" ; È facoltativo e potresti considerarlo come un commento. Questa stringa di tag viene inoltre ripetuta nelle previsioni dei modelli per identificare quale previsione appartiene a quale esempio, ma non prevediamo qui, stiamo solo modellando e studiando il nostro modello. Successivamente arriva lo spazio dei nomi delle funzioni di input per protein1 |A
(dobbiamo definire uno spazio dei nomi in modo da poter incrociare tra diversi spazi dei nomi, non deve essereA
, in realtà può essere qualsiasi parola, ma la prima lettera deve differire tra gli spazi dei nomi in modo che possiamo incrociarli nella chiamata di comando) seguito dall'elenco delle funzioni di input per protein1 p1_...
. Ultimo viene lo spazio dei nomi per protein2: |B
seguito dai nomi delle funzioni di protein2 p2_...
.
Una delle bellezze di Wowbit di Vowpal è che puoi usare stringhe arbitrarie per i nomi delle caratteristiche (le cancellerà internamente, ma non ti interessa). Gli unici caratteri speciali nel set di allenamento sono:
- spazi (ovviamente)
|
, per aggiungere il prefisso alle funzioni di input e agli spazi dei nomi e
:
per separare i nomi delle caratteristiche dai loro valori
Qui :
non viene utilizzato, poiché assumiamo che ogni nome di caratteristica proteica rappresenti un valore booleano (esistenza), pertanto i loro valori sono predefiniti 1
e non necessitano di valori espliciti.
Ora puoi eseguire vowpal_wabbit (il nome dell'eseguibile è vw
) -q AB
per creare automaticamente funzioni incrociate (ovvero termini di interazione) tra tutte le possibili coppie di funzioni in cui una funzione è selezionata da protein1 (spazio dei nomi che inizia con A
) e l'altra da protein2 ( spazio dei nomi che inizia con B
). vowpal_wabbit leggerà i dati, imparerà e creerà un modello con pesi per ogni combinazione di caratteristiche che si traduce in una certa interazione tra la coppia di proteine. Qui, invece di eseguirlo vw
direttamente, lo eseguiremo tramite l' vw-varinfo
utility wrapper, che viene fornita con vowpal wabbit, come ultimo passo. vw-varinfo
viene eseguito vw
per creare il modello e scarica il modello in una forma leggibile dall'uomo.
Passaggio 3: chiama vw-varinfo in questo modo:
vw-varinfo -q AB -c --passes 20 your_data_set_file
vw-varinfo passerà tutte le opzioni ( -q ... -c --passes ...
) così come sono vw
. È -q AB
essenziale solo per attraversare i due spazi dei nomi delle caratteristiche. Ho aggiunto un'altra opzione sopra (esegui più passaggi), che credo darebbe risultati migliori.
Questo comando chiamerà vowpal wabbit ( vw
) per allenarsi sul set di dati e stamperà l'output che credo tu stia cercando: tutte le interazioni delle caratteristiche in ordine di forza e i relativi pesi.
Esempio di input e output
Supponiamo che il tuo input prot.dat
includa un'interazione a 3 vie tra 3 proteine:
1.0 protein1/protein2|A a b |B k m
0.6 protein2/protein3|A k m |B b c d
2.2 protein1/protein3|A a b |B b c d
Questo è deliberatamente un esempio molto minimalista. vw
non dovrei avere problemi con set di dati molto più grandi (ad esempio milioni di righe, centinaia di funzionalità), inoltre, ho variato le etichette di interazione negli esempi. Se nel tuo caso l'interazione è un "sì" o "no" booleano, usa semplicemente 0
(nessuna interazione) o 1
(l'interazione esiste) come primo campo in ogni riga.
In esecuzione:
vw-varinfo -q AB -c --passes 20 prot.dat
Produrrebbe tutte le possibili interazioni (ignora gli spazi dei nomi A
e B
nell'output) e i loro pesi:
FeatureName HashVal MinVal MaxVal Weight RelScore
A^k 220268 0.00 1.00 +0.3804 100.00%
A^k^B^k 254241 0.00 0.00 +0.3804 100.00%
A^k^B^m 93047 0.00 0.00 +0.3804 100.00%
B^k 178789 0.00 1.00 +0.1011 26.58%
B^m 17595 0.00 1.00 +0.1011 26.58%
[... trimmed for brevity ...]
A^m^B^m 141879 0.00 0.00 +0.0000 0.00%
Constant 116060 0.00 0.00 +0.1515 0.00%
A^b 139167 0.00 1.00 -0.0641 -16.86%
A^b^B^k 204424 0.00 0.00 -0.1233 -32.43%
A^b^B^m 43230 0.00 0.00 -0.1233 -32.43%
Mostrando che in questi dati i più forti contributori a qualsiasi interazione in generale sono 1) la semplice presenza della k
funzione, 2) la k
caratteristica che interagisce con se stessa (supponendo che entrambe le proteine ce l'hanno) e 3) che k
interagisce con m
. mentre il più debole (contributo negativo all'interazione delle proteine) è la b
funzione accoppiata con la m
funzione.
Ecco una pagina HOWTO su vw-varinfo
vowpal wabbit si basa sul sorgente (vedi link sopra) e funziona su Linux (e possibilmente su altri unix), Mac OS-X e Windows.
HTH