2015-10-18 11 views
5

Angenommen, ich habe eine Liste von Ereignissen. Zum Beispiel A, D, T, H, U, A, B, F, H, ....Muster in kontinuierlichen Sequenzdaten

Was ich brauche ist, häufige Muster zu finden, die in der vollständigen Sequenz auftreten. In diesem Problem können wir keine traditionellen Algorithmen wie a priori oder fp growth verwenden, da sie separate Elementmengen benötigen. Und ich kann diesen Stream nicht in kleinere Sets aufteilen.

Jede Idee, welcher Algorithmus würde für mich arbeiten?


EDIT

Zum Beispiel für die Sequenz A, D, T, H, U, A, D, T, H, T, H, U, A, H, T, H und mit min_support = 2.

Die häufigen Muster wird

Of length 1 --> [A, D, T, H, U] 
Of length 2 --> [AD, DT, TH, HU, UA, HT] 
Of length 3 --> [ADT, DTH, THU, HUA] 
Of length 4 --> [ADTH, THUA] 
No sequences of length 5 and further 
+0

Ich denke, die Frage ist viel zu weit gefasst, aber als erste Vermutung möchten Sie vielleicht einen Blick auf [iSAX] (http://www.cs.ucr.edu/~eamonn/iSAX/iSAX.html) werfen) – Marco13

+0

Ich möchte nur häufige Muster aller Längen in diesem einen großen Strom finden.Nach langem Suchen konnte ich nichts im Internet finden. – Haris

+0

["String" -Komprimierung] (https://en.wikipedia.org/wiki/Lossless_compression#General_purpose) Algorithmen versuchen, (zumindest lokal) vorhersehbare Ungleichförmigkeit in der Sequenzwahrscheinlichkeit zu nutzen. – greybeard

Antwort

2

Sie können Aho-Corasick-Algorithmus mit einem Platzhalter und/oder nur mit allen Teilstrings versuchen. Aho-corasick ist im Grunde eine endliche Zustandsmaschine, es benötigt ein Wörterbuch, aber dann findet es mehrere Muster in der Suchkette sehr schnell. Sie können einen endlichen Automaten mit einem Trie und einer Breitensuche erstellen. Hier ist ein schönes Beispiel mit Animation: http://blog.ivank.net/aho-corasick-algorithm-in-as3.html. Sie benötigen also grundsätzlich 2 Schritte: Erstellen Sie den endlichen Automaten und suchen Sie den String.

+0

Es ist sehr nahe daran, einen * Suffix-Baum * für alle möglichen Teilstrings zu erstellen und dann später nach Mustern zu suchen. Eigentlich denke ich darüber nach. – Haris

0

Sie alle möglichen Teil erzeugen können, zB .:

A 
AD 
ADT 
ADTH 
... 
D 
DT 
DTH 
... 

Nun ist die Frage, wird die Reihenfolge der Elemente die kleineren Teil Materie.

Wenn nicht, können Sie versuchen, Standard-Association Mining-Algorithmen auszuführen.

Wenn ja, dann ist die Reihenfolge in der gesamten Sequenz und ihren Untersequenzen von Bedeutung, was dies zu einem Signalverarbeitungs- oder Zeitreihenproblem macht. Aber selbst wenn die Reihenfolge wichtig ist, können wir diesen Weg mit allen Teilsträngen fortsetzen. Wir können versuchen, sie zu vergleichen, genaue Übereinstimmung oder Fuzzy-Match und solche Sachen.

+0

Wird das nicht viel Zeit für eine sehr große Sequenz brauchen? Um alle möglichen Teilstrings zu erzeugen, wird nur eine exponentielle Zeit benötigt. – Haris

+0

Es gibt n^2 Teilstrings. Ich denke, es ist machbar. – dimm

+0

das scheint machbar, aber ich muss jede Sequenz mit ihrer Häufigkeit des Auftretens speichern, um die optimale zu wählen. – Haris

0

Dies ist eine besondere Variante von häufige Itemset Mining, bekannt als sequenzielle Musterbergbau.

Wenn Sie nach diesem Thema suchen, finden Sie buchstäblich Dutzende von Algorithmen.

Es gibt GSP, SPADE, PrefixSpan und viele mehr.

+0

GSP kann nicht verwendet werden. oder SPADE, weil sie an bereits erscheinenden Sequenzen arbeiten, die voneinander getrennt sind. Keine große kontinuierliche Sequenz. – Haris

+1

Sie könnten es dann zum Beispiel auf Nigrams dieser Sequenz ausführen. –

+0

Ich habe Sie nicht verstanden, können Sie ein wenig durch Bearbeiten Ihrer Antwort ausarbeiten. – Haris

0

Hier ist ein einfacher Algorithmus (in JavaScript), der eine Zählung aller Teilstrings generiert.

Behalten Sie eine Anzahl von Substring-Vorkommen in einem Wörterbuch. Iterieren jede mögliche Teilkette in den Strom über, und wenn es schon im Wörterbuch enthalten ist, erhöht es, sonst fügen Sie es mit einem Wert von 1.

var stream = 'FOOBARFOO'; 
var substrings = {}; 
var minimumSubstringLength = 2; 

for (var i = 1; i <= stream.length; i++) { 
    for (var j = 0; j <= i - minimumSubstringLength; j++) { 
     var substring = stream.substring(j, i); 
     substrings[substring] ? substrings[substring]++ : substrings[substring] = 1; 
    } 
} 

dann einen Sortieralgorithmus verwenden das Wörterbuch durch seine Werte zu bestellen.

+0

Ja, das wurde schon vorgeschlagen. Aber ich will etwas effizienteres als Bruteforce. – Haris

+1

Habt ihr schon einmal http://stackoverflow.com/q/2560262/5111146 gesehen? –

+0

Das sieht wie eine gute Quelle aus. Danke, ich werde es durchgehen. – Haris