Frage

Szenario


Ich versuche, überwachtes Lernen über ein Datum innerhalb einer Java-GUI-Anwendung zu implementieren. Der Benutzer wird eine Liste von Elementen oder ‚Berichte‘ gegeben werden, um zu überprüfen und sie werden auf der Grundlage einer Reihe von verfügbaren Etiketten beschriften. Sobald das überwachte Lernen abgeschlossen ist, werden die markierten Instanzen dann zu einem Lernalgorithmus gegeben werden. Dieser wird versuchen, den Rest der Elemente auf, um zu bestellen, wie wahrscheinlich es ist der Benutzer sie sehen möchten.

Um das Beste aus der Zeit des Benutzers zu erhalten Ich möchte die Berichte vorzuwählen, die die meisten Informationen über die gesamte Sammlung von Berichten zur Verfügung stellt, und haben die Benutzer sie beschriften. Wie ich es, berechnen dies zu verstehen, wäre es notwendig, die Summe aller gegenseitigen Informationswerte für die einzelnen Berichte zu finden, und sie von diesem Wert bestellen. Die markierten Berichte von überwachtes Lernen werden dann verwendet werden, um ein Bayes-Netzwerk zu bilden, um die Wahrscheinlichkeit eines binären Wertes für jeden verbleibenden Bericht zu finden.

Beispiel:


Hier ein künstliches Beispiel kann helfen, zu erklären und zu Verwirrung aufklären kann, wenn ich zweifellos die falsche Terminologie verwendet habe :-) ein Beispiel betrachtet, bei dem die Anwendung Nachrichten an den Benutzer anzeigt. Es wählt aus, welche Nachrichten auf der Vorliebe des Benutzers angezeigt erste Basis anzuzeigen. Merkmale einer Nachrichtengeschichte, die eine Korrelation haben, sind country of origin, category oder date. Also, wenn ein Benutzer eine einzelne Nachrichten Geschichte als interessant markiert, wenn es von Schottland kommt, erzählt er die Maschine Lerner, dass es eine erhöhte Chance, andere Nachrichten Geschichten aus Schottland für den Benutzer interessant sein werden. Ähnliche für eine Kategorie wie Sport, oder ein Datum wie 12. Dezember 2004.

könnte Diese Bevorzugung durch die Wahl beliebige Reihenfolge für alle Nachrichten (zum Beispiel nach Kategorie, nach Datum) oder zufällig Bestellung sie, dann bevorzugt Berechnung berechnet werden, wenn der Benutzer entlang geht. Was würde Ich mag zu tun, eine Art „Vorsprung“, um auf diese Bestellung durch den Benutzer, der bei einer kleinen Anzahl von spezifischen Nachrichten schauen und sagen, wenn sie an ihnen interessiert sind (das überwachte Lernteil). Zu entscheiden, welche Geschichten um den Benutzer zu zeigen, ich habe die ganze Sammlung von Geschichten zu betrachten. Dies ist, wo die gegenseitigen Informationen kommen in. Für jede Geschichte, die ich mag wissen, wie viel es mir über all die anderen Geschichten erzählen kann, wenn es durch den Benutzer klassifiziert wird. Zum Beispiel, wenn es eine große Anzahl von Geschichten aus Schottland stammen, mag ich den Benutzer kennen zu klassifizieren (mindestens) einer von ihnen. Ähnliches gilt für andere korrelierende Funktionen wie Kategorie oder Datum. Das Ziel ist, Beispiele für Berichte zu finden, die, wenn sie klassifiziert, die meisten Informationen über die anderen Berichte liefern.

Problem


Weil meine Mathe ein wenig eingerostet ist, und ich bin neu auf maschinelles Lernen ich einige Probleme mit der Definition der gegenseitigen Information zu einer Implementierung in Java zu konvertieren. Wikipedia beschreibt die Gleichung für gegenseitige Informationen wie:

gegenseitige Information Gleichung

Allerdings bin ich mir nicht sicher, ob dies tatsächlich verwendet werden kann, wenn nichts eingestuft wurde, und der Lernalgorithmus hat noch nichts berechnet.

Wie in meinem Beispiel, sagen, ich hatte eine große Anzahl von neuen, nicht-markierten Instanzen dieser Klasse:

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

In meinem speziellen Szenario wird die Korrelation zwischen den Feldern / Features basiert auf eine genaue Übereinstimmung , so zum Beispiel an einem Tag und 10 Jahre Unterschied Datum entspricht in ihrer Ungleichheit.

Die Faktoren für die Korrelation (z ist heute mehr als korrelierende Kategorie?) Sind nicht notwendigerweise gleich, aber sie können vorgegeben und konstant gehalten werden. Bedeutet dies, dass das Ergebnis der Funktion p(x,y) ist der vorgegebene Wert ist, oder bin ich Begriffe vermischen?

Die Frage (endlich)


Wie kann ich mich über die gegenseitige Information Berechnung der Umsetzung dieses (fake) Beispiel für Nachrichten Geschichten gegeben? Bibliotheken, javadoc, Codebeispiele etc. sind alle willkommen Informationen. Auch wenn dieser Ansatz grundsätzlich fehlerhaft ist, zu erklären, warum das der Fall wäre genauso wertvoll eine Antwort.


PS. Ich bin mir bewusst, Bibliotheken wie Weka und Apache Mahout, so sie nur zu erwähnen, für mich nicht wirklich nützlich ist. Ich bin noch auf der Suche durch Dokumentation und Beispiele für diese beiden Bibliotheken speziell für die Sachen über die gegenseitigen Informationen suchen. Was würde mir wirklich helfen, zeige auf Ressourcen (Code-Beispiele, javadoc), wo diese Bibliotheken mit gegenseitiger Information helfen.

War es hilfreich?

Lösung

Ich vermute, dass Ihr Problem ist so etwas wie ...

„eine Liste von unmarkierten Beispielen gegeben, sortieren Sie die Liste, um wieviel die Vorhersagegenauigkeit des Modells verbessern würde, wenn der Benutzer das Beispiel markiert und hinzugefügt, um es auf den Trainingssatz.“

Wenn dies der Fall ist, ich glaube nicht, gegenseitige Information ist das Richtige zu verwenden, da Sie nicht MI zwischen zwei Instanzen berechnen kann. Die Definition von MI ist in Bezug auf den Zufallsvariablen und eine einzelne Instanz ist kein Zufallsvariable, es ist nur ein Wert.

Die Merkmale und das Klassenlabel können jedoch als Zufallsvariablen. Das heißt, sie haben eine Verteilung der Werte über den gesamten Datensatz. Sie können die gegenseitige Information zwischen zwei Funktionen berechnen, um zu sehen, wie ‚überflüssig‘ ein Merkmal wird die andere gegeben, oder zwischen einem Merkmal und dem Klassenlabel, eine Vorstellung davon, wie viel zu bekommen, dass Feature Vorhersage helfen könnte. Dies ist, wie die Menschen in der Regel der gegenseitige Information in einem überwachten Lernproblem verwenden.

Ich denke, ferdystschenko Vorschlag, die Sie bei aktiven Lernmethoden aussehen gut ist.


Als Reaktion auf Grundlefleck Kommentar, werde ich ein bisschen tiefer in der Terminologie geht durch seine Idee einer Java-Objekt Analogie mit ...

Insgesamt haben wir den Begriff ‚Instanz‘, ‚Ding‘, ‚Bericht‘ und ‚Beispiel‘ verwendet, um sich auf das Objekt clasified wird. Denken wir an diese Dinge als Instanzen einer Java-Klasse (Ich habe den vorformulierten Konstruktor weggelassen):


class Example
{ String f1;
  String f2;
}

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

Die übliche Terminologie in maschinellem Lernen ist, dass e1 ist ein Beispiel , dass alle Beispiele haben zwei Funktionen f1 und f2 und der für e1, f1 nimmt den Wert ‚foo 'und f2 nimmt den Wert ‚bar‘. Eine Sammlung von Beispielen wird als ein Datensatz .

alle Werte von f1 Nehmen Sie für alle Beispiele im Datensatz, das eine Liste von Strings ist, kann es auch als eine Verteilung angesehen werden. Wir können denken Sie an die Funktion als Zufallsvariable und dass jeder Wert in der Liste eine Probe aus dieser Zufallsvariable genommen ist. So können wir zum Beispiel der Berechnung des MI zwischen f1 und f2. Der Pseudo-Code wäre so etwas wie:

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
}

Jedoch Sie MI zwischen e1 und e2 nicht berechnen können, ist es einfach nicht so definiert ist.

Andere Tipps

Ich weiß nur im Zusammenhang mit Entscheidungsbäumen (dts) Informationen erhalten, wo in dem Bau eines DT, die Spaltung auf jedem Knoten zu machen, ist die eine, den Informationsgewinn maximiert. DTs werden in Weka umgesetzt, so könnten Sie wahrscheinlich, dass direkt verwenden, obwohl ich weiß nicht, ob Weka können Sie Informationsgewinn für einen bestimmten Split unter einem DT-Knoten berechnen.

aus, dass abgesehen, wenn ich Sie richtig verstanden habe, denke ich, was Sie versuchen zu tun ist im Allgemeinen als aktives Lernen . Dort müssen Sie zunächst eine anfängliche Trainingsdaten markiert, die an Ihrer Maschine Lernalgorithmus zugeführt wird. Dann haben Sie Ihr Klassifikator Label eine Reihe von nicht-markierten Instanzen und das Rückvertrauenswert für jeden von ihnen. Instanzen mit den niedrigsten Vertrauenswerte sind in der Regel diejenigen, die sehr informativ sind, so dass Sie zeigen diese an einen Menschen Kommentator und haben ihm / ihr Label diese manuell, fügen Sie sie zu Ihrem Trainingssatz, umschulen Ihre Klassifikator, und tun die ganze Sache und immer wieder, bis Ihr Klassifizierer eine ausreichend hohe Genauigkeit hat, oder bis ein anderes Abbruchkriterium erfüllt ist. Also, wenn dies für Sie arbeitet, Sie könnten im Prinzip all ML-Algorithmus in Weka oder anderem ML-Rahmen so lange umgesetzt verwenden, wie der Algorithmus Sie wählen, ist in der Lage Vertrauenswert zurück (im Fall von Bayes nähert sich dies wäre Wahrscheinlichkeiten nur) .


Mit Ihrer editierten Frage denke ich, ich komme zu verstehen, was an Ihrem Ziel. Wenn das, was Sie wollen, ist MI Berechnung, dann StompChicken Antwort und Pseudo-Code nicht sein könnte viel klarer aus meiner Sicht. Ich denke auch, dass MI ist nicht das, was Sie wollen und dass Sie versuchen, das Rad neu zu erfinden.

Lassen Sie uns rekapitulieren: Sie möchten einen Klassifikator trainieren, die vom Benutzer aktualisiert werden kann. Dies ist ein klassischer Fall für aktives Lernen. Aber dafür müssen Sie einen ersten Sichter (man könnte im Grunde nur gibt den Benutzer Zufallsdaten zu bezeichnen, aber ich nehme es dies ist keine Option) und um Ihren ersten Klassifikator zu trainieren, müssen Sie zumindest einige kleine Menge an markierter Ausbildung Daten zum überwachten Lernen. Doch alles, was Sie sind nicht markierten Daten. Was können Sie mit diesen zu tun?

Nun, man könnte Cluster sie in Gruppen von verwandten Fällen unter Verwendung einer des Standard Clustering-Algorithmen von Weka oder einige spezifische Cluster-Tool bereitgestellt, wie Cluto . Wenn Sie nun die x zentralste Instanzen der einzelnen Cluster (x in Abhängigkeit von der Anzahl der Cluster und die Geduld des Benutzers) nehmen und haben die Benutzer-Label als interessant oder uninteressant, können Sie dieses Label für die anderen Instanzen übernehmen Cluster, dass auch (oder zumindest für die zentralen sind). Voila, jetzt können Sie Trainingsdaten, die Sie Ihren ersten Klassifikator verwenden können und den aktiven Lernprozess durch die Aktualisierung des Klassifikator, wenn der Benutzer eine neue Instanz markiert als interessant oder nicht beginnen zu trainieren. Ich denke, was Sie versuchen, durch zu erreichen Berechnung MI im Wesentlichen ähnlich ist, jedoch kann nur der falsche Wagen für Ihre Ladung sein.

Nicht die Details Ihres Szenarios zu wissen, sollte ich denken, dass Sie nicht einmal überhaupt keine markierten Daten benötigen, mit der Ausnahme, wenn Sie in den Etiketten selbst interessiert sind. Cluster nur einmal Ihre Daten, damit der Benutzer einen Artikel interessant für ihn / sie von den zentralen Mitgliedern aller Cluster auswählen und schlägt andere Gegenstände aus den ausgewählten Cluster als vielleicht interessant, wie gut sein. Auch schlägt einige zufälligen Instanzen von anderen Clustern hier und da, so dass, wenn der Benutzer eines dieser auswählt, Sie davon ausgehen können, dass das entsprechende Cluster im Allgemeinen interessant sein könnte, auch. Wenn es einen Widerspruch und ein Benutzer mag einige Mitglieder eines Clusters, aber keinet einige andere von der gleichen, dann versuchen Sie, um die Daten in feinere Gruppen neu gruppieren, die die guten von den schlechten zu unterscheiden. Der Umschulungs Schritt auch durch die Verwendung hierarchischen Clustering von Anfang an und reisen Sie die Cluster-Hierarchie bei jedem Widerspruch Benutzereingaben verursacht.

vermieden werden könnte
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top