Domanda

Scenario


Sto cercando di implementare apprendimento supervisionato più di un set di dati all'interno di un Java GUI.L'utente verrà dato un elenco di elementi o di 'report' di ispezionare e l'etichetta di loro sulla base di un set di etichette disponibili.Una volta che l'apprendimento supervisionato è completa, la conformità delle istanze sarà quindi dato da un algoritmo di apprendimento.Questo tentativo di ordinare il resto degli elementi su come probabile è l'utente desidera visualizzare loro.

Per ottenere il massimo dal tempo voglio pre-selezionare il report che forniscono il maggior numero di informazioni circa l'intera raccolta di relazioni, e l'utente li etichetta.Da quanto ho capito, per calcolare questo, sarebbe necessario trovare la somma di tutte le informazione reciproca di valori per ciascuna relazione, e li ordina in base a quel valore.La etichettati rapporti da apprendimento supervisionato sarà poi utilizzato per formare una rete Bayesiana per trovare la probabilità di un valore binario per ogni report rimanente.

Esempio


Qui, un artificiale esempio può aiutare a spiegare, e può chiarire la confusione quando ho senza dubbio una terminologia sbagliata :-) si Consideri un esempio in cui l'applicazione consente di visualizzare le notizie storie per l'utente.Si sceglie le notizie da visualizzare per primi, sulla base delle preferenze dell'utente indicato.Caratteristiche di una storia di cronaca che hanno una correlazione sono country of origin, category o date.Quindi, se un utente etichette di una singola notizia interessante quando è venuto dalla Scozia, racconta la macchina allievo che c'è una maggiore possibilità che altre notizie dalla Scozia sarà interessante per l'utente.Simile per una categoria, come ad esempio Sport o di una data come il 12 dicembre 2004.

Questa preferenza può essere calcolato mediante la scelta di qualsiasi ordine per tutte le notizie (ad es.per categoria, per data) o in modo casuale l'ordine è, quindi calcolando la preferenza che l'utente va lungo.Quello che vorrei fare è quello di ottenere una sorta di "head start" che si ordina con l'utente di guardare a un piccolo numero di specifiche notizie e dire se sono interessati a loro (supervised learning).Per scegliere quali storie per mostrare all'utente, devo considerare l'intera collezione di storie.Questo è dove la Reciproca Informazione passa.Per ogni storia, voglio sapere quanto mi può dire su tutte le altre storie, quando si è classificato dall'utente.Per esempio, se c'è un grande numero di storie provenienti da Scozia, voglio cogliere l'utente per classificare (almeno) uno di loro.Simile per gli altri la correlazione di tali caratteristiche, di categoria o di una data.L'obiettivo è quello di trovare esempi di rapporti che, se classificate, fornire più informazioni su altri rapporti.

Problema


Perché la mia matematica è un po ' arrugginito, e io sono di nuovo alla macchina di apprendimento sto avendo alcuni problemi nella conversione la definizione di Informazione Reciproca per un'implementazione in Java.Wikipedia descrive l'equazione per lo scambio Reciproco di Informazioni come:

mutual information equation

Tuttavia, non sono sicuro se questo può effettivamente essere utilizzato quando nulla è stato classificato, e l'algoritmo di apprendimento non ha calcolato ancora nulla.

Come nel mio esempio, dire che ho avuto un gran numero di nuovi, etichettati istanze di questa classe:

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

Nel mio scenario, la correlazione tra i campi/caratteristiche si basa su un corrispondenza esatta così, per esempio, un giorno, e 10 anni di differenza in data equivalenti nella loro disuguaglianza.

I fattori di correlazione (ad es.è data più la correlazione di categoria?) non sono necessariamente uguali, ma che può essere predefinito e costante.Questo significa che il risultato della funzione p(x,y) è il valore predefinito, o sto mescolando termini?

La Domanda (finalmente)


Come posso fare per realizzare lo scambio reciproco di informazioni di calcolo dato questo (falso) esempio di notizie?Librerie, javadoc, esempi di codice, etc.sono tutti benvenuti informazioni.Anche se questo approccio è fondamentalmente errata, spiegare perché questo è il caso sarebbe preziosa una risposta.


PS.Io sono a conoscenza di librerie come Weka e Apache Mahout, quindi, solo di parlare anche di loro non è molto utile per me.Sto ancora cercando attraverso la documentazione e gli esempi per entrambe le librerie in cerca di roba sulla Reciproca Informazione in particolare.Quello che sarebbe davvero aiutare me, è rivolta a risorse (esempi di codice, javadoc) dove queste librerie aiutare con lo scambio reciproco di informazioni.

È stato utile?

Soluzione

Sto indovinando che il problema sia qualcosa di simile...

"Dato un elenco di adenoide esempi, ordinare l'elenco in base a quanto l'accuratezza predittiva del modello di migliorare se l'utente etichettato l'esempio e' stato aggiunto alla formazione."

Se questo è il caso, non penso che lo scambio reciproco di informazioni è la cosa giusta da usare, perché non è possibile calcolare MI tra le due istanze.La definizione della MI in termini di variabili casuali e una singola istanza non è una variabile casuale, è solo un valore.

Le caratteristiche e la classe di etichetta può essere anche se, come variabili casuali.Che è, hanno una distribuzione di valori per l'intero set di dati.È possibile calcolare lo scambio reciproco di informazioni tra due funzioni, per vedere come 'ridondante' una caratteristica è data l'altra, o tra una funzione e l'etichetta di classe, per avere un'idea di quanto caratteristica che potrebbe aiutare la stima.Questo è come la gente di solito uso reciproco di informazioni in un apprendimento supervisionato problema.

Penso ferdystschenko suggerimento che si guarda i metodi attivi di apprendimento è una buona.


In risposta a Grundlefleck commento, cercherò di andare un po ' più in profondità la terminologia utilizzando la sua idea di un oggetto Java analogia...

Collettivamente, abbiamo usato il termine 'istanza', 'cosa', 'report' e 'esempio' per fare riferimento all'oggetto clasified.Proviamo a pensare a queste cose come le istanze di una classe Java (ho lasciato fuori il boilerplate costruttore):


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

La solita terminologia di apprendimento automatico è che e1 è un' esempio, che tutti gli esempi sono due caratteristiche f1 e f2 e che per e1, f1 assume il valore "pippo" e f2 assume il valore 'bar'.Una raccolta di esempi è chiamato set di dati.

Prendere tutti i valori di f1 per tutti gli esempi del set di dati, questa è una lista di stringhe, può anche essere pensato come una distribuzione.Possiamo pensare la funzione come variabile casuale e che ogni valore della lista è un campione prelevato da che una variabile casuale.Così possiamo, per esempio, calcolare il MI tra f1 e f2.Lo pseudocodice sarebbe qualcosa di simile:

mi = 0
for each value x taken by f1:
{  sum = 0
   for each value y taken by f2:
   {  p_xy = number of examples where f1=x and f2=y
      p_x = number of examples where f1=x
      p_y = number of examples where f2=y
      sum += p_xy * log(p_xy/(p_x*p_y))
   }
   mi += sum
}

Tuttavia non è possibile calcolare MI tra e1 e e2, non è definito in questo modo.

Altri suggerimenti

So che l'information gain solo in connessione con alberi di decisione (DTs), dove nella costruzione di un DT, la suddivisione fare su ogni nodo è quello che massimizza l'information gain.DTs sono implementati in Weka, quindi, probabilmente si potrebbe usare direttamente, anche se non so se Weka permette di calcolare le informazioni di guadagno per ogni particolare split al di sotto di un DT nodo.

A parte questo, se ho capito bene, io credo che quello che stiamo cercando di fare è generalmente indicato come l'apprendimento attivo.C'è prima bisogno di qualche iniziale etichettato dati di training, che è alimentato con la tua macchina algoritmo di apprendimento.Poi hai il tuo classificazione etichetta una serie di adenoide istanze e restituire la fiducia di valori per ciascuna di esse.Le istanze con i più bassi valori di affidabilità sono di solito quelli che sono più esauriente, in modo che si mostra questi umani commentatore e avere lui/lei etichetta manualmente, aggiungere alla vostra formazione, aggiornamento professionale di classificazione, e fare il tutto più e più volte fino a che la tua classificazione è abbastanza elevata precisione o fino a che un altro arresto criterio è soddisfatto.Quindi, se questo funziona per voi, si potrebbe in linea di principio, utilizzare qualsiasi ML-algoritmo implementato in Weka o qualsiasi altra ML-framework, purché l'algoritmo che si sceglie è in grado di restituire la fiducia dei valori (in caso di approccio Bayesiano questo sarebbe solo probabilità).


Con la vostra modifica domanda penso che sto arrivando a capire che cosa il vostro ottenere.Se quello che vuoi è il calcolo MI, quindi StompChicken la risposta di pseudo codice, non poteva essere più chiaro, a mio avviso.Anche io penso che il MI non è ciò che si desidera e che si sta cercando di re-inventare la ruota.

Proviamo a ricapitolare:ti piacerebbe formare una classificazione che può essere aggiornato dall'utente.Questo è un classico caso per l'apprendimento attivo.Ma per questo, avete bisogno di una prima classificazione (si potrebbe semplicemente dare la possibilità all'utente di dati casuali di etichetta ma che questo non è un'opzione) e per la formazione iniziale di classificazione, è necessario che almeno qualche piccola quantità di etichetta dati di training per l'apprendimento supervisionato.Tuttavia, i dati senza etichetta.Cosa si può fare con questi?

Beh, si potrebbe cluster in gruppi di istanze, utilizzando uno standard di algoritmi di clustering forniti da Weka o qualche strumento di clustering come Cluto.Se si prende ora la x più centrale istanze di ciascun cluster (x, a seconda del numero di cluster e la pazienza dell'utente), e l'utente lo etichetta come interessante o non interessante, è possibile adottare questa etichetta per le altre istanze del cluster (o almeno per quelli centrali).Voilà, ora si ha la formazione di dati che è possibile utilizzare per addestrare il vostro iniziale di classificazione e dare il via al processo di apprendimento attivo attraverso l'aggiornamento del classificatore ogni volta che l'utente apre una nuova istanza di interessante o meno.Penso che ciò che si sta cercando di realizzare con il calcolo MI è essenzialmente simile, ma può essere solo sbagliato il trasporto per il vostro pagamento.

Non conoscendo i dettagli dello scenario, io penso che non si può nemmeno bisogno di qualsiasi etichetta a tutti i dati, tranne se siete interessati a etichette stesse.Solo cluster di dati una volta, consentire all'utente di scegliere un elemento interessante per lui/lei dal centro di membri di tutti i cluster e suggerire altri elementi da cluster selezionato come forse essere interessante.Suggeriscono anche qualche caso di istanze da altri cluster di qua e di là, in modo che se l'utente seleziona uno di questi, si può presumere che i cluster corrispondente può generalmente essere interessante, troppo.Se c'è una contraddizione e un utente piace alcuni membri di un gruppo, ma non alcuni altri della stessa, quindi si tenta di ri-cluster di dati in più capillari gruppi di distinguere i buoni dai cattivi.La riqualificazione passo potrebbe anche essere evitato utilizzando clustering gerarchico dall'inizio e in viaggio lungo il cluster di gerarchia in ogni contraddizione input dell'utente provoca.

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