Die Berechnung der Gegenseitigen Information Für die Auswahl der trainingsmenge in Java
Szenario
Ich bin versucht zu implementieren, das betreute lernen über ein Daten-set in einem Java-GUI-Anwendung. Dem Benutzer wird eine Liste von Elementen oder 'Berichte' zu untersuchen und Kennzeichnen Sie basiert auf einer Reihe von Etiketten zur Verfügung. Sobald das überwachte lernen abgeschlossen ist, wird die gelabelte Instanzen wird dann gegeben sein, um ein Lern-Algorithmus. Dies versucht, um den rest der Elemente auf, wie wahrscheinlich es ist, die Nutzer wollen, um Sie anzuzeigen.
Bekommen die die meisten von die Benutzer Zeit, ich will pre-wählen Sie die Berichte aus, dass die meisten Informationen über die gesamte Sammlung von berichten, und die Nutzer Ihnen zuschreiben. Wie ich es verstehe, um diese zu berechnen, wäre es notwendig zu finden, die die Summe der gegenseitigen Informationen der Werte für jeden Bericht, und um Ihnen von diesem Wert. Die markierten Berichte von überwachten lernen wird dann benutzt werden, um ein Bayes ' sches Netzwerk zu finden, die Wahrscheinlichkeit, dass ein Binärwert für jeden weiteren Bericht.
Beispiel
Hier, ein künstliches Beispiel kann helfen, zu erklären, und kann klären Verwirrung, wenn ich habe zweifellos für die falsche Terminologie 🙂 Betrachten wir ein Beispiel, wo die Anwendung zeigt Nachrichten an den Benutzer. Es wählt die Nachrichten zuerst angezeigt werden, basierend auf den Benutzereinstellungen angezeigt. Verfügt über eine news-story, die eine Korrelation country of origin
, category
oder date
. Also, wenn ein Benutzer Etiketten eine einzelne news-story als interessant, wenn es kam aus Schottland, erzählt es die Maschine Lernenden, dass es eine erhöhte Wahrscheinlichkeit, dass andere Nachrichten Geschichten aus Schottland wird interessant sein für die user. Ähnlich wie bei einer Kategorie wie Sport oder ein Datum wie Dezember 12th 2004.
Diese Präferenz ermittelt werden konnte, indem Sie die Auswahl, um für alle Nachrichten (z.B. nach Kategorie, nach Datum oder nach dem Zufallsprinzip die Bestellung, dann die Berechnung der Präferenz der Benutzer entlang geht. Was ich möchte zu tun ist, um eine Art von "head start" auf, dass die Sortierung durch den Benutzer, Blick auf eine kleine Anzahl bestimmter Nachrichten Geschichten und sagen, wenn Sie daran interessiert sind, in Ihnen (der betreute lernen Teil). Zu entscheiden, welche Geschichten um dem Benutzer zu zeigen, ich habe zu prüfen, die gesamte Sammlung von Geschichten. Dies ist, wo die Gegenseitige Information. Für jede Geschichte, die ich möchte wissen, wie viel Sie können mir sagen, über all die anderen Geschichten, wenn es klassifiziert ist, durch den Benutzer. Zum Beispiel, wenn es eine große Anzahl von Geschichten, die stammt aus Schottland, ich möchte, um Benutzer zu klassifizieren (mindestens) einer von Ihnen. Ähnlich wie für andere, korrelierende Funktionen wie Kategorie oder Datum. Das Ziel ist, finden Sie Beispiele für Berichte, die-wenn Sie klassifiziert sind, bieten die meisten Informationen über die anderen berichten.
Problem
Weil mein Mathe ist ein bisschen eingerostet, und ich bin neu maschinelles lernen ich habe einige Schwierigkeiten die Umwandlung der definition der Gegenseitigen Information zu einer Implementierung in Java. Wikipedia beschreibt die Gleichung für die Gegenseitige Information als:
Allerdings bin ich mir nicht sicher, ob dies tatsächlich genutzt werden kann, wenn nichts klassifiziert worden ist, und die Lern-Algorithmus nicht berechnet, noch nichts.
Als in meinem Beispiel, sagen, ich hatte eine große Anzahl von neuen, unbenannten Instanzen dieser Klasse:
public class NewsStory {
private String countryOfOrigin;
private String category;
private Date date;
//constructor, etc.
}
In meinem speziellen Szenario die Korrelation zwischen den Bereichen/Funktionen basiert auf einem genaue übereinstimmung so, zum Beispiel, einen Tag und 10 Jahre Unterschied im Datum sind gleichwertig in Ihrer Ungleichheit.
Die Faktoren, die für die Korrelation (z.B. Datum ist mehr Korrelation als Kategorie?) sind nicht unbedingt gleich, aber Sie können vordefiniert und konstant. Bedeutet das, dass das Ergebnis der Funktion p(x,y)
ist den vordefinierten Wert, oder bin ich die Vermischung der Begriffe?
Die Frage (endlich)
Wie kann ich mich über die Durchführung der gegenseitigen information Berechnung angesichts dieser (fake -) Beispiel von news stories? Bibliotheken, javadoc, code-Beispiele etc.. sind alle herzlich willkommen, Informationen. Auch wenn dieser Ansatz grundsätzlich fehlerhaft ist, zu erklären, warum das der Fall ist, wäre ebenso wertvoll eine Antwort.
PS. Ich bin mir bewusst, von Bibliotheken, wie zum Beispiel Weka und Apache Mahout, also einfach nur zu erwähnen ist nicht wirklich hilfreich für mich. Ich bin noch auf der Suche durch Dokumentation und Beispiele für beide Bibliotheken zu suchen für Sachen, die auf Gegenseitige Information speziell. Was würde mir wirklich helfen, verweist auf die Ressourcen (code-Beispiele, die javadoc), wo diese Bibliotheken helfen mit gegenseitigen information.
- Versuchen Sie Weka.
- Bitte siehe mein edit, ich bin mir dessen bewusst, Weka, aber nicht in der Lage war, Ressourcen zu finden auf das, was Sie tun können, für Informationen zu Gewinnen. Konnte Sie sein spezifischer? Vielen Dank für Ihre Zeit!
- Weka Dokumentation ist nicht die beste; wenn Sie eine Bibliothek haben spezifische Frage, schlage ich vor, Sie versuchen, die mailing-Liste.
- Ich verstehe nicht die Frage. Sie sagen, Sie möchten die Berechnung der gegenseitigen information zwischen zwei Datenpunkte, die eine ungewöhnliche Sache tun zu wollen und nicht die für mich Sinn machen. MI ist in der Regel verwendet, um zu berechnen, wie zwei Merkmale korreliert sind, und berechnet sich über alle Datenpunkte.
- Das klingt eher wie das, was ich will. Jede Instanz besteht aus vier Funktionen, die jeweils Strings. Ich möchte, um herauszufinden, wenn der Benutzer prüft und klassifiziert die Instanz, wie viel Informationen es wird mir sagen, über alle anderen Instanzen übrig. Jedes matching-Funktion bedeutet eine gewisse Korrelation zwischen den beiden Instanzen. Für jede Instanz, die gegenseitige information Wert wird summiert von allen übrigen Instanzen. Die Instanzen, die die höchste Summe, die zunächst in der Ausbildung gesetzt werden. Macht das mehr Sinn?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass dein problem ist so etwas wie...
"Eine Liste von unbeschrifteten Beispiele, Sortieren Sie die Liste nach, wie viel die prädiktive Genauigkeit des Modells verbessern würde, wenn der Benutzer als Beispiel und fügte hinzu, es die Ausbildung einstellen."
Wenn dies der Fall ist, ich glaube nicht, dass die gegenseitige information ist die richtige Sache zu verwenden, denn man kann nicht berechnen, MI zwischen zwei Instanzen. Die definition von MI wird im Sinne von Zufallsvariablen und einer einzelnen Instanz ist nicht eine zufällige variable, ist es nur ein Wert.
Den Funktionen und der Klasse label kann aber von Zufallsvariablen. Das heißt, Sie haben eine Verteilung der Werte über den gesamten Datensatz. Sie können die Berechnung der gegenseitigen information zwischen zwei Funktionen, um zu sehen, wie 'redundante' eine Funktion ist gegeben, das andere, oder zwischen einer Funktion und der Klasse beschriften, zu erhalten eine Idee von, wie viel diese Funktion kann helfen, Vorhersage. Dies ist, wie die Menschen in der Regel verwenden die gegenseitige information in ein betreutes lernen problem.
Ich denke ferdystschenko Vorschlag, dass man sich bei active learning-Methoden ist ein guter.
In Reaktion auf Grundlefleck Kommentar, ich werde gehen Sie ein bisschen tiefer in die Terminologie, indem er die Idee von einem Java-Objekt-Analogie...
Gemeinsam haben wir den Begriff der 'Instanz', 'Ding', 'Bericht' und 'Beispiel' auf das Objekt verweisen wird clasified. Lassen Sie uns darüber nachdenken, wie Instanzen einer Java-Klasse (ich habe Sie Links aus der boilerplate-Konstruktor):
Den üblichen Terminologie des maschinellen Lernens ist, dass e1 ist ein Beispiel, dass alle Beispiele haben zwei Funktionen f1 und f2, und dass für e1, f1 den Wert 'foo' und f2 den Wert 'bar'. Eine Sammlung von Beispielen, die genannt wird Datensatz.
Nehmen alle Werte von f1 für alle Beispiele in der Daten-set, das eine Liste von Zeichenketten ist, kann auch gedacht werden als eine Verteilung. Denke, wir können das feature als Zufallsvariable und dass jeder Wert in der Liste wird eine Probe entnommen, dass die zufällige variable. So können wir, zum Beispiel, die Berechnung der MI zwischen f1 und f2. Der pseudocode würde das etwa so Aussehen:
Doch man kann nicht berechnen, MI zwischen e1 und e2, es ist nur nicht definiert auf diese Weise.
Ich wissen, Informationen gewinnen, nur in Verbindung mit Entscheidungsbäumen (DTs), wo in der Konstruktion von DT, die split zu machen auf jedem Knoten ist, das maximiert die information zu gewinnen. DTs sind implementiert in Weka, so könnten Sie wahrscheinlich verwenden, die direkt, obwohl ich weiß nicht, ob Weka können Sie berechnen, Informationen zu gewinnen, die für einen bestimmten split unter einem DT Knoten.
Abgesehen davon, wenn ich Sie richtig verstehe, denke ich, was Sie zu tun versuchen, ist in der Regel bezeichnet als aktives lernen. Dort müssen Sie zunächst einige Initiale beschriftet Ausbildung Daten, die zugeführt wird, um Ihre machine-learning-Algorithmus. Dann haben Sie Ihren classifier-label eine Reihe von unbeschrifteten Instanzen und zurück das Vertrauen der Werte für jeden von Ihnen. Instanzen mit der niedrigsten vertrauenswerte sind in der Regel diejenigen, die meisten informativ, so dass Sie diese zu einem menschlichen annotator und haben Sie ihm/Ihr label diese manuell, fügen Sie Sie zu Ihrer Ausbildung, Umschulung Ihre Einstufung, und die ganze Sache immer und immer wieder, bis Ihr Klassifizierer hat eine ausreichend hohe Genauigkeit oder bis einige andere Abbruchkriterium erfüllt ist. Also, wenn dies für Sie funktioniert, könnte man im Prinzip verwenden alle ML-Algorithmus implementiert in Weka oder andere ML-framework, solange der Algorithmus, den Sie wählen, ist in der Lage, um zurückzukehren Vertrauen-Werte (im Fall der Bayes-Ansätze, dies wäre nur Wahrscheinlichkeiten).
Mit den bearbeiteten Frage, ich glaube, ich bin zu verstehen, was Ihr am Ziel. Wenn das, was Sie wollen, ist die Berechnung von MI, dann StompChicken Antwort und pseudo-code könnte nicht viel klarer in meinen Augen. Ich denke auch, dass die MI ist nicht, was Sie wollen und dass Sie versuchen, das Rad neu zu erfinden.
Lassen Sie uns rekapitulieren: Sie trainieren möchten ein Klassifikator kann vom Benutzer aktualisiert werden. Dies ist ein klassisches Beispiel für aktives lernen. Aber dafür müssen Sie ein initial-Klassifikator (grundsätzlich könnte man einfach den Benutzer zufälligen Daten-label, aber ich nehme Sie dies ist nicht eine option) und um zu trainieren und Ihre ersten Klassifizierer, müssen Sie mindestens eine kleine Menge von beschriftet Trainingsdaten für die überwachte lernen. Jedoch, alles, was Sie haben, sind unbeschriftete Daten. Was können Sie tun, mit diesen?
Gut, man könnte cluster Sie Sie in Gruppen zusammengehöriger Instanzen, mit einem der standard-clustering-algorithmen zur Verfügung gestellt von Weka oder einige spezielle clustering-tool wie Cluto. Wenn Ihr nun den x-die meisten zentralen Instanzen pro cluster (x abhängig von der Anzahl der Cluster und die Geduld des Benutzers), und der user label es als interessant oder nicht interessant ist, können Sie nehmen Sie dieses Etikett für die anderen Instanzen des Clusters, wie gut (oder zumindest für die zentralen sind). Voila, jetzt haben Sie Trainingsdaten, die Sie verwenden können, um Zug Ihre erste Klassifizierer und kick-off der aktive Lernprozess, durch Aktualisierung der Systematik jedes mal, wenn der Benutzer markiert eine neue Instanz als interessant ist oder nicht. Ich denke, was Sie zu erreichen versuchen, von der Berechnung der MI ist im wesentlichen ähnlich, aber vielleicht nur der falsche Wagen für Ihre Ladung.
Nicht wissen, die details des Szenarios, dass ich glaube, dass Sie möglicherweise gar nicht benötigen, mit der Bezeichnung Daten, außer wenn Sie interessiert sind, in den Beschriftungen selbst. Nur cluster Ihre Daten einmal, lassen Sie die Benutzer, wählen Sie ein Element interessant für ihn/Sie von der zentralen Elemente aller Cluster und schlagen andere Elemente aus den ausgewählten Clustern, als vielleicht auch interessant. Auch deuten einige random-Instanzen anderer Cluster hier und da, so dass, wenn der Benutzer wählt eine von diesen, können Sie davon ausgehen, dass die entsprechenden cluster könnte allgemein interessant sein, auch. Wenn es einen Widerspruch und ein Benutzer mag einige Mitglieder eines Clusters nicht aber einige andere von dem gleichen, dann werden Sie versuchen, re-cluster die Daten in feiner unterteilte Gruppen, welche unterscheiden das gute vom schlechten. Die re-Ausbildung Schritt könnte auch vermieden werden, indem hierarchische clustering von Anfang an und Reisen nach unten die cluster-Hierarchie an jeder Widerspruch Benutzereingaben verursacht.