Ich frage mich nur, ob jemand mit dem Clustering von nominalen Eingaben vertraut ist. Ich habe SOM als Lösung betrachtet, aber anscheinend funktioniert es nur mit numerischen Funktionen. Gibt es Erweiterungen für kategoriale Funktionen? Insbesondere habe ich mich über "Wochentage" als mögliche Funktionen gewundert. Natürlich ist es möglich, es in ein numerisches Merkmal umzuwandeln (dh Mo - Sonne entsprechend Nr. 1-7), aber dann wäre der euklidische Abstand zwischen Sonne und Mo (1 & 7) nicht der gleiche wie der Abstand von Mo bis Di (1 & 2) ). Anregungen oder Ideen wäre sehr dankbar.
11
Antworten:
Hintergrund:
Der logischste Weg, die Stunde umzuwandeln, besteht in zwei Variablen, die nicht synchron hin und her schwingen. Stellen Sie sich die Position des Stundenendzeigers einer 24-Stunden-Uhr vor. Die
x
Position schwingt nicht synchron mit dery
Position hin und her . Für eine 24-Stunden-Uhr können Sie dies mitx=sin(2pi*hour/24)
,y=cos(2pi*hour/24)
.Sie benötigen beide Variablen oder die richtige Bewegung durch die Zeit geht verloren. Dies ist auf die Tatsache zurückzuführen, dass sich die Ableitung von sin oder cos zeitlich ändert, während sich die
(x,y)
Position gleichmäßig ändert, wenn sie sich um den Einheitskreis bewegt.Überlegen Sie abschließend, ob es sich lohnt, ein drittes Feature zum Verfolgen der linearen Zeit hinzuzufügen, das als Stunden (oder Minuten oder Sekunden) ab dem Beginn des ersten Datensatzes oder als Unix-Zeitstempel oder ähnliches erstellt werden kann. Diese drei Merkmale bieten dann Proxys sowohl für den zyklischen als auch für den linearen Verlauf der Zeit, z. B. können Sie zyklische Phänomene wie Schlafzyklen in der Bewegung von Menschen und auch lineares Wachstum wie Bevölkerung gegen Zeit herausziehen.
Beispiel für die Durchführung:
Probieren wir es jetzt aus:
Sie können kaum sehen, dass einige Zeiten nach Mitternacht im grünen Cluster vor Mitternacht enthalten sind. Lassen Sie uns nun die Anzahl der Cluster reduzieren und zeigen, dass vor und nach Mitternacht eine Verbindung zu einem einzelnen Cluster hergestellt werden kann:
Sehen Sie, wie der blaue Cluster Zeiten vor und nach Mitternacht enthält, die im selben Cluster zusammengefasst sind ...
Sie können dies für die Zeit oder den Wochentag oder die Woche des Monats oder den Tag des Monats oder die Jahreszeit oder irgendetwas tun.
quelle
Üblicherweise werden nominelle Variablen bei Verwendung in SOM Dummy-codiert (z. B. eine Variable für mit einer 1 für Montag 0 für nicht Montag, eine andere für Dienstag usw.).
Sie können zusätzliche Informationen einbinden, indem Sie kombinierte Kategorien benachbarter Tage erstellen. Beispiel: Montag und Dienstag, Dienstag und Mittwoch usw. Wenn sich Ihre Daten jedoch auf menschliches Verhalten beziehen, ist es häufig sinnvoller, Wochentag und Wochenende als Kategorien zu verwenden.
quelle
Für nominale Variablen wird die typische Codierung in einem neuronalen Netzwerk oder in einem elektrotechnischen Kontext als "One-Hot" bezeichnet. - ein Vektor aller Nullen, wobei eine 1 an der entsprechenden Position für den Wert für die Variable steht. Für die Wochentage gibt es beispielsweise sieben Tage, sodass Ihre One-Hot-Vektoren die Länge sieben haben. Dann würde Montag als [1 0 0 0 0 0 0], Dienstag als [0 1 0 0 0 0 0] usw. dargestellt.
Wie Tim angedeutet hat, kann dieser Ansatz leicht verallgemeinert werden, um beliebige boolesche Merkmalsvektoren zu umfassen, wobei jede Position im Vektor einem Merkmal entspricht, das für Ihre Daten von Interesse ist, und die Position auf 1 oder 0 gesetzt wird, um das Vorhandensein oder Fehlen davon anzuzeigen Feature.
Sobald Sie binäre Vektoren haben, wird der Hamming-Abstand zu einer natürlichen Metrik, obwohl auch der euklidische Abstand verwendet wird. Bei One-Hot-Binärvektoren interpoliert der SOM (oder ein anderer Funktionsapproximator) natürlich für jede Vektorposition zwischen 0 und 1. In diesem Fall werden diese Vektoren häufig als Parameter einer Boltzmann- oder Softmax-Verteilung über den Raum der nominalen Variablen behandelt. Diese Behandlung bietet die Möglichkeit, die Vektoren auch in einer Art KL-Divergenzszenario zu verwenden.
Zyklische Variablen sind viel schwieriger. Wie Arthur in den Kommentaren sagte, müssten Sie selbst eine Entfernungsmetrik definieren, die die zyklische Natur der Variablen berücksichtigt.
quelle
Angenommen, der Wochentag (dow) geht von [0, 6] aus, anstatt Daten auf einen Kreis zu projizieren, besteht eine andere Option darin, Folgendes zu verwenden:
Um zu verstehen warum, betrachten Sie den Dow als eine Uhr
Der Unterschied zwischen 6 und 1 kann 6 - 1 = 5 (im Uhrzeigersinn von 1 bis 6) oder 7 - (6 - 1) = 2 sein.
Im Allgemeinen können Sie verwenden:
min(abs(diff), range - abs(diff))
quelle
Ich habe Wochentage (und Monate des Jahres) erfolgreich als Tupel von (cos, sin) codiert, wie in seinem Kommentar hervorgehoben. Als benutzte euklidische Distanz.
Dies ist ein Beispiel für Code in r:
Der euklidische Abstand zwischen 0 und 6 ist gleich 0 und 1.
quelle