[PYTHON] Eine Methode zum Clustering von Punkten, die auf einer Hypersphäre verteilt sind. Dies ist praktisch für das Text Mining und die Merkmalsextraktion von Richtungsinformationen.

zunaechst

Aufgrund von Untersuchungen war es notwendig, dreidimensionale Vektordaten als Eingabe für maschinelles Lernen zu verwenden. Als Datenformat erhalten wir alle paar Sekunden einen dreidimensionalen Vektor mit unterschiedlichen Längen.

Wenn wir uns nur auf die Richtung des Vektors konzentrieren, normalisieren wir die Länge des zusammengesetzten Vektors auf 1. Der Hauptinhalt besteht darin, wie die Merkmalsmenge der Richtungsdaten extrahiert wird, die in einer so großen Menge von Zeitreihen erhalten werden. Zusammenfassend werden die Parameter höchstwahrscheinlich aus der von Mises-Fisher-Verteilung (vMFD) geschätzt, und die Richtungsdaten auf der Hypersphäre werden durch Mischung von vMFD (movMFD) geclustert. Dieser modellierte Wert kann als eine Art Merkmalsgröße in den Richtungsdaten bezeichnet werden. Wie diejenigen, die eine Verarbeitung in natürlicher Sprache durchführen, verstehen werden, ist dies eine Methode, die eng mit dem Worthäufigkeitsindex tf-idf in Dokumenten zusammenhängt. Es kann auch in Systemen verwendet werden, in denen sich die "Richtung des Vektors" im physischen Raum über die Zeit ändert.

Das Buch, auf das ich mich dieses Mal bezog, ist Kapitel 7, "Abnormalitätserkennung von Richtungsdaten" in "Abnormalitätserkennung und Änderungserkennung". Das verwendete Programm ist clara-labs Sphärencluster. Außerdem habe ich einen Teil der detaillierten Erläuterung dieses Dokuments verwendet ("Clustering auf der Einheitshypersphäre mit von Mises-Fisher-Verteilungen"). Es ist. Der Zweck besteht darin, die Merkmalsmenge von D-dimensionalen Vektordaten zu extrahieren, aber gemäß dem Beispiel des Sphärenclusters werden wir nach dem Extrahieren der Merkmalsmenge alles bis zur Clusterbildung tun. Dank dieses Pakets hat sich die Arbeitseffizienz sofort verbessert. Vielen Dank.

** Dies ist das erste Mal, dass von Mises-Fisher Verteilungs- und Richtungsinformationen verwendet werden. Wenn Sie also Entwicklungsmeinungen oder Missverständnisse haben, würde ich mich freuen, wenn Sie dies kommentieren könnten. ** **.

Versuchen Sie es mit einem Kugelcluster

Paketübersicht

Sphärecluster ist ein Python-Paket, das auf der Grundlage des in diesem Dokument vorgestellten Algorithmus erstellt wurde. Es besteht hauptsächlich aus zwei Algorithmen, Spherical K-means (spkmeans) und movMF, und es gibt zwei Arten von movMF, soft- und hard-. Installieren Sie zuerst diesen Kugelcluster.

pip install spherecluster

Es ist einfach. Das hängt übrigens von Paketen wie sklearn und numpy ab.

Algorithms Spherical Clustering Eine Methode, die das Konzept von K Means auf eine sphärische Oberfläche erweitert. Die Berechnungsmethode ist dieselbe wie bei KMeans, nur der Eingaberaum ist als sphärische Oberfläche definiert.

Über vMFD

vMFD ist eine allgemeine Ausdrucksmethode, die auf einer Hypersphäre verteilte Punkte als Wahrscheinlichkeitsverteilung wie eine Normalverteilung ausdrückt. Siehe Wikipedia

Screen Shot 2017-01-27 at 13.26.54.png

Wenn Sie sich die Formel ansehen, können Sie sehen, dass sie durch zwei Parameter [$ \ mu $, $ \ kappa $] für die Eingabe x dargestellt wird. $ \ Mu $ ist die durchschnittliche Richtung der verteilten Punkte und $ \ kappa $ ist der Konzentrationsgrad um $ \ mu $. Mit anderen Worten, wie in der folgenden Abbildung gezeigt, existieren Punkte bis zu einer Position außerhalb der Durchschnittsrichtung $ \ mu $ (durchgezogene Linie), wenn der Konzentrationsgrad $ \ kappa $ zunimmt.

Bild des Wikis \kappaUnd Vertriebsbeziehung(\thetaIst der Winkel von der Durchschnittsrichtung)
Screen Shot 2017-01-26 at 8.09.47.png

Wie Sie der mathematischen Formel entnehmen können, enthält die Berechnung der Regularisierungskonstante eine komplizierte Funktion, die als erstklassige Transformationsgefäßfunktion bezeichnet wird, und es scheint, dass das Verständnis einige Zeit in Anspruch nehmen wird.

Das diesmal verwendete mov-MFD ist diese gemischte Verteilung von vMFD (Mixture Distribution). In diesem Artikel konzentrieren wir uns eher auf tatsächliche Verwendungsbeispiele als auf das Verständnis mathematischer Formeln.

movMFD Die Wahrscheinlichkeit einer gemischten Verteilung, die aus einem gemischten Verteilungsmodell (Mischungsmodell) und vMFD besteht, wird durch den EM-Algorithmus gelöst.

Screen Shot 2017-01-27 at 7.43.35.png

Ein Ansatz ähnlich dem gängigen Mixed Gaussian Model. Mit anderen Worten, es wird auf diese Weise als unabhängige vMFD auf der sphärischen Oberfläche geclustert.

sphere_w_clusters.png

Example1: small-mix Zweidimensionale Dummy-Daten werden auf vier Arten geclustert: K-Mittel, sphärische KM-Mittel, Soft-MovMF und Hard-Mov-MF. Das eigentliche Programm ist hier.

Installieren Sie zuerst die Bibliothek.

import numpy as np
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics

import sys
sys.path.append('../spherecluster')

from spherecluster import SphericalKMeans
from spherecluster import VonMisesFisherMixture
from spherecluster import sample_vMF

Anschließend werden Daten basierend auf den folgenden zwei vMFs generiert. \mu_0=[-0.251, -0.968], \kappa_0=8 \mu_1=[0.399, 0.917], \kappa_1=2 Die Anzahl der Daten num_points_per_class beträgt 100.

# Generate small-mix dataset
mu_0 = np.array([-0.251, -0.968])
mu_1 = np.array([0.399, 0.917])
mus = [mu_0, mu_1]
kappa_0 = 8 # concentration parameter
kappa_1 = 2 # concentration parameter
kappas = [kappa_0, kappa_1]
num_points_per_class = 100

X_0 = sample_vMF(mu_0, kappa_0, num_points_per_class)
X_1 = sample_vMF(mu_1, kappa_1, num_points_per_class)
X = np.zeros((2 * num_points_per_class, 2))
X[:num_points_per_class, :] = X_0
X[num_points_per_class:, :] = X_1
labels = np.zeros((2 * num_points_per_class, ))
labels[num_points_per_class:] = 1

Dann passen Sie zu K Mean, Spherical K-Means, Soft-MovMF, Hard-Mov-MF.

Zu diesem Zeitpunkt kann der folgende Fehler auftreten.

ValueError: Data l2-norm must be 1

In der movMF-Funktion werden die Eingabedaten als eindeutiger Wert für jeden Satz berechnet, aber der absolute Wert des eindeutigen Werts kann größer als 1e-4 sein, mit einer Wahrscheinlichkeit von etwa 5% in den vom ursprünglichen sample_vMF erzeugten Daten. Zu diesem Zeitpunkt wird das Programm aufgrund einer Fehlerverarbeitung angehalten. Daher werden wir hier den eindeutigen Wert zwangsweise berechnen und die Fehlerursache beseitigen.

Wenn Sie vor dem Anpassen das folgende Programm ausführen, verschwindet der Fehler. (Die Daten, die den Fehler verursacht haben, verschwinden jedoch ebenfalls, sodass auch die Gesamtzahl der Proben abnimmt.)

import scipy.sparse as sp
dummy = []
n_samples = X.shape[0]
for ee in range(n_samples):
    if sp.issparse(X):
        n = sp.linalg.norm(X[ee, :])
    else:
        n = np.linalg.norm(X[ee, :])

    if np.abs(n - 1.) > 1e-4:
        dummy.append([ee, n])

X = np.delete(X, np.array(dummy)[:, 0], 0)

Das Ausführungsergebnis ist wie folgt.

small_mix_2d.png

Da die Originaldaten sauber in zwei Gruppen unterteilt sind, gibt es keinen merklichen Unterschied zwischen den Methoden.

Example2: small-mix_3d Lassen Sie uns 3D-Daten mit demselben Inhalt wie in Beispiel 1 gruppieren. Klicken Sie hier für den Originalcode.

Wenn Sie sich das Skript ansehen, sehen Sie, dass es fast mit Examaple1 identisch ist. Hier ist das Ergebnis der Ausführung.

figure_2.png

Das Schätzergebnis ist übrigens so.

Screen Shot 2017-01-27 at 10.58.06.png Zumindest für die vorliegenden Daten scheint es eine bessere Leistung zu zeigen als kmeans und spkmeans.

Dateneinführung

Einführung in die diesmal verarbeiteten Daten.

Screen Shot 2017-01-26 at 6.56.25.png

id ist ein Wert, der jedem Knoten zugeordnet ist, und diesmal ist es ein fester Wert. [x, y, z] ist ein dreidimensionaler Vektor, Azimut, Winkel wird beiseite gelegt und Norm ist die kombinierte "Länge" von [x, y, z]. Angenommen, es gibt ungefähr 3000 Proben dieser Daten.

EDA

Derzeit ist nur eine einfache Visualisierung erforderlich.

Das Histogramm und das Korrelationsdiagramm jeder Variablen sind wie folgt. Irgendwie scheint jeder Parameter seine eigenen Eigenschaften zu haben, aber ich weiß nicht, wie ich diese Eigenschaften extrahieren soll.

download (4).png

Hier ist das Ergebnis der Visualisierung in 3D. Ich verstehe nicht mehr und mehr.

download (5).png

Extrahieren Sie unter Bezugnahme auf Beispiel für einen Kugelcluster (Erstellen eines Kugelgraphen) nur die Richtungsdaten aus dem obigen Streudiagramm. Zeichnen wir es auf einer sphärischen 3D-Oberfläche.

Sphärische Darstellung aller Daten Sphärische Darstellung der ersten und zweiten Hälfte
download.png download.png

Irgendwie kamen die Features heraus. In Anbetracht des Einflusses der Zeit habe ich versucht, den Zeitstempel der Daten für die erste Hälfte (blau) und die zweite Hälfte (rot) getrennt darzustellen, aber es scheint, dass sich insbesondere in der ersten und zweiten Hälfte keine Zeitänderung ergibt.

An movMF anpassen

Schließlich wird movMF an die Testdaten angepasst.

###############################################################################
# Mixture of von Mises Fisher clustering (soft)
vmf_soft = VonMisesFisherMixture(n_clusters=1, posterior_type='soft', n_init=20)
vmf_soft.fit(X)

print "center:{}".format(vmf_soft.cluster_centers_)
print "kappa:{}".format(vmf_soft.concentrations_[0])

Das Ergebnis ist wie folgt.

center:[[-0.82651971  0.17847126  0.53386626]]
kappa:3.91851479297

Wir konnten die Richtung und den Grad der Dispersion aus dem dreidimensionalen Vektor mit der Wahrscheinlichkeitsdichteverteilung erfolgreich modellieren. Wenn beispielsweise die Anzahl der Dimensionen von X mit der Anzahl der im Dokument angezeigten Wörter übereinstimmt, ist es möglich, die Verteilung der auf der Hypersphäre der D-Dimension verteilten Punkte mit movMF zu modellieren und zu gruppieren.

Recommended Posts

Eine Methode zum Clustering von Punkten, die auf einer Hypersphäre verteilt sind. Dies ist praktisch für das Text Mining und die Merkmalsextraktion von Richtungsinformationen.
Text Mining: Wahrscheinlichkeitsdichteverteilung auf Hypersphäre und Textclustering mit KMeans
Welche Methode eignet sich am besten für die asynchrone Verarbeitung des TCP-Servers?