Cluster in einer binären Sequenz erkennen


8

Ich habe eine binäre Sequenz wie 11111011011110101100000000000100101011011111101111100000000000011010100000010000000011101111

Wo auf Cluster von meistens Einsen eine größere Anzahl von Nullen folgt, wie im Bild unten (Schwarz steht für 1):

Geben Sie hier die Bildbeschreibung ein

Ich möchte eine Technik anwenden (vorzugsweise in R oder in Python), bei der ich diese Cluster von Einsen automatisch erkennen und Bereiche erzeugen kann (im Bild als rote Linien bezeichnet). Ich weiß, dass man dies mit einem Schwellenwert tun könnte, dh dass zwei Cluster durch mindestens n Nullen getrennt sein müssen, um Cluster zu sein, aber ich frage mich, ob es andere etablierte Methoden gibt, die keine vordefinierten Schwellenwerte verwenden.

Irgendeine Idee?

Antworten:


5

Ich würde es vermeiden, sie "Cluster" zu nennen. Mit dieser Terminologie werden Sie ständig von Data Mining in mehrdimensionale Techniken abgelenkt.

Ihr Problem ist eine viel einfachere eindimensionale Einstellung. Und noch einfacher: Sie haben nicht einmal Koordinaten, sondern eine Reihe von Nullen und Einsen.

Es wird keine one-size-fits all - Lösung für Ihr Problem immer . Weil ein Benutzer möglicherweise sehr hochauflösende "Barcodes" lesen möchte, während der andere Benutzer viel Rauschen hat.

Am Ende benötigen Sie also einen Parameter. Sie haben eine Reihe von Möglichkeiten: absolute Lückengrößen, relative Lückengrößen, Kernelbandbreite usw.

Ein sehr einfacher "kernelbasierter" Ansatz wäre, jedes Pixel auf die Anzahl der in -10 ... + 10 eingestellten Pixel abzubilden. Das sind also 21 Zellen, der Wert ist 0 bis 21. Suchen Sie nun nach einem lokalen Minimum. Erhöhen Sie die Fenstergröße, wenn Läufe aufgeteilt werden, die Sie noch nicht teilen wollten.


Vielen Dank. Der Vorschlag mit dem Kernel und dem lokalen Minimum ähnelt tatsächlich dem, was @EngrStudent vorgeschlagen hat, oder? Trotzdem verstehe ich nicht ganz, was damit gemeint ist. Wie kann ich überhaupt maschinenbasiert nach einem lokalen Minimum suchen? Dh wie kann ich die erste Ableitung der "Funktion" berechnen, ohne die Funktion selbst zu kennen, sondern nur die Werte?
wnstnsmth

Ja, das ist wahrscheinlich das gleiche wie von EngrStudent vorgeschlagen. Die Schätzung der Kerndichte ist eine sehr übliche Technik zum Glätten. Es wird auch überall in der Bildverarbeitung verwendet! Es ist ein lokales Minimum, wenn es keinen kleineren Nachbarwert gibt ... es ist so einfach, wenn Sie einen diskreten Datensatz haben.
Hat aufgehört - Anony-Mousse

2

Referenz 1 auf den Seiten 49-55 enthält einen schönen Abschnitt zu kernelbasierten Methoden, die hier hilfreich sein können. Wenn ich es tun würde, würde ich mir eine gewichtete Summe der tatsächlichen Werte und ihrer ersten Ableitung ansehen, da dies ein besserer Indikator für "Informationen" sein könnte.

Referenz: http://amzn.com/0198538642 "Neuronale Netze zur Mustererkennung" von Christopher Bishop (1995)


1
Die numerische erste Ableitung in Bezug auf den Index ist "diff". Wenn Sie also viele "Einsen" in einer Reihe haben, ist die Ableitung Nullen. Wenn Sie spärliche haben, ist das Diff jedes Mal größer, wenn es wechselt. Sie könnten EWMA als Kernel eines armen Mannes verwenden. en.wikipedia.org/wiki/Exponential_smoothing . Wie funktioniert es? Es ergibt einen gewichteten Durchschnitt eines Wertefensters. Eine Kernelfunktion erledigt etwas Verwandtes, ist aber etwas komplexer. Ein Fenster benötigt manchmal ein viel breiteres Fenster und berechnet dann eine Funktion basierend auf den darin enthaltenen Werten. Manchmal sieht die Funktion wie ein PDF aus.
EngrStudent

1
Wenn Sie den Diff- und den Rohwert summieren, erhalten Sie Informationen, wenn die Werte spärlich und dicht sind.
EngrStudent

Könnten Sie Ihre Antwort und Ihren Kommentar mit einer kleinen Beispielsequenz erläutern? Ich habe ein sehr ähnliches Problem.
Arun Jose

Der Absolutwert eines Diff ist ein Kantendetektor. Wenn Sie eine Sequenz wie 000111000 haben und den Diff nehmen, erhalten Sie 00100 (-1) 00. Die Position der 1 im Diff zeigt Ihnen die ansteigende Flanke und die -1 zeigt die abfallende Flanke. Wenn Sie den absoluten Wert des Diff nehmen und dann summieren würden, würden Sie 2 Kanten zusammen erhalten. Wenn Sie die Sequenz 010101010 hatten, ist ihr absoluter Unterschied 11111111, was 8 Kanten ergibt. Es gibt eine wesentlich höhere Kantenzahl. Wenn Sie NICHT die abs diff und verwenden Sie es in einer laufenden Summe, zeigt es Ihnen, wie viele Einsen oder wie viele Nullen Sie in einer Reihe haben.
EngrStudent

Nach welchen Kriterien endet ein Lauf von Einsen und beginnt? Wie bestimmen Sie die Größe des Fensters?
Arun Jose

0

Das Problem hat eine gewisse Ähnlichkeit mit der Bildverarbeitung. Sie haben ein Binärbild mit einer Höhe von einem Pixel und möchten eine Art Segmentierung erreichen .

Die Art des Eingabebildes legt einen morphologischen Filter nahe, um die Bereiche zu glätten, z . B. das Schließen . Sie müssten das Strukturierungselement auswählen, das dadurch die "Verknüpfung" der Cluster bestimmt. Am Ende ist dies Ihrem Ansatz ziemlich ähnlich. Sie können das Bild auch mithilfe von Faltungsfiltern glätten, z. B. mithilfe von Unschärfe oder Gauß-Kernel, und einen ausgewählten Schwellenwert anwenden, um es erneut zu binarisieren.

Wenn Sie jeden 1Punkt als Punkt behandeln können, seine Position in der Sequenz als Koordinate, und eine Entfernungsmetrik bilden können, können Sie so ziemlich jeden Standard-Clustering-Algorithmus verwenden, den es gibt. Sie könnten beispielsweise hierarchisches Clustering verwenden (wählen Sie ein Verknüpfungskriterium und einen Schwellenwert), Sie könnten k-means oder ein EM mit einem Gaußschen Mischungsmodell verwenden (wählen Sie die Anzahl der gesuchten Cluster).

Aber ich glaube nicht, dass Sie irgendwann davonkommen können, ohne zumindest die Empfindlichkeit des Algorithmus vordefinieren zu müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.