[PYTHON] Verstehen Sie t-SNE und verbessern Sie die Visualisierung

Einführung

Dieses Mal habe ich den Dimensionsreduktionsalgorithmus ** t-SNE ** (t-Distributed Stochastic Neighbor Embedding) zusammengefasst. t-SNE ist ein ** Dimensionsreduktionsalgorithmus ** zum Konvertieren und Visualisieren hochdimensionaler Daten in 2 oder 3 Dimensionen und wurde von Professor Hinton entwickelt, der auch als Vater des tiefen Lernens bekannt ist. (Professor Hinton ist unglaublich) Dieses Mal werde ich dieses t-SNE verstehen und die Visualisierungsleistung verbessern.

Referenz

Zum Verständnis von t-SNE habe ich mich auf Folgendes bezogen.

Übersicht über t-SNE

Der Ursprung von t-SNE

** t-SNE ** ist ein Dimensionsreduktionsalgorithmus zum Ablegen hochdimensionaler Daten in zwei oder drei Dimensionen. PCA und MDS sind die Klassiker der Dimensionsreduzierung, aber es gab einige Probleme mit diesen linearen Dimensionsreduzierungen.

  1. ** Ein Algorithmus, der sich darauf konzentriert, unterschiedliche Daten in den unteren Dimensionen fernzuhalten **, sodass er anfällig dafür ist, ähnliche Daten in den unteren Dimensionen nahe zu halten
  2. Insbesondere bei nichtlinearen Daten mit hohen Dimensionen ist es fast unmöglich, "ähnliche Daten auch bei niedrigen Dimensionen nahe zu halten".

Um diese Probleme zu lösen, wurden verschiedene nichtlineare Dimensionsreduktionstechnologien ** entwickelt, um die lokale Datenstruktur beizubehalten (ähnliche Daten auch in niedrigeren Dimensionen nahe zu halten). Ich tat. t-SNE ist ein Algorithmus, der diesem Trend folgt.

Unten sehen Sie ein Bild nichtlinearer Daten.

figure_10_original.png

Merkmale von t-SNE

Die Punkte von t-SNE werden beschrieben. Ich möchte den spezifischen Inhalt des Prozesses und die Gründe für die Vor- und Nachteile in der folgenden Erläuterung des Algorithmus ausführlich beschreiben.

** Bearbeitungspunkte **

verdienen

** Fehler **

t-SNE-Algorithmus

Um den t-SNE-Algorithmus zu verstehen, verstehen wir zunächst seinen Vorgänger, den SNE-Algorithmus. Danach werden wir die Probleme von SNE lösen und das durch Lösen der Probleme erzeugte t-SNE zusammenfassen.

Wie SNE funktioniert

1. Konvertieren Sie den Abstand zwischen Datenpunkten in bedingte Wahrscheinlichkeit

SNE konvertiert zunächst den Abstand zwischen Datenpunkten in eine bedingte Wahrscheinlichkeit. Wählen Sie $ x_ {j} $ als Nachbarschaft für die Ähnlichkeit zwischen den Datenpunkten $ x_ {i} $ und $ x_ {j} $ bei gegebener $ x_ {i} $ ** Bedingte Wahrscheinlichkeit $ p_ { Ausgedrückt als j | i} $. ** Außerdem nehmen wir an, dass $ x_j $ wahrscheinlich ** basierend auf einer ** Normalverteilung ausgewählt wird, die auf $ x_ {i} $ zentriert ist.

Dann kann $ p_ {j | i} $ durch die folgende Formel ausgedrückt werden.


p_{j|i} = \frac{\exp(-||x_{i} - x_{j}||^2/2\sigma_{i}^2)}{\sum_{k\neq i}\exp(-||x_{i} - x_{k}||^2/2\sigma_{i}^2)}

Das Obige ergibt sich aus der Wahrscheinlichkeitsdichtefunktion der Normalverteilung. $ \ Frac {1} {\ sqrt {2πσ ^ 2}} $ ist eine Konstante und wird vom Nenner gelöscht.


\frac{1}{\sqrt{2πσ^2}}\exp{(-(x-μ)^2/2σ^2)}

Wir gehen von einer Normalverteilung mit dem Mittelwert $ x_ {i} $ und der Varianz $ \ sigma_ {i} ^ 2 $ aus, aber der Wert der Varianz $ \ sigma_ {i} ^ 2 $ wird gemäß den unten beschriebenen Parametern angepasst. .. Da die Verteilung $ \ sigma_ {i} ^ 2 $ ändert, welche Art von Verteilung angenommen wird, ändert sich auch die Ausgabe nach der endgültigen Dimensionsreduzierung erheblich.

Da diesmal der Zweck darin besteht, den Abstand zwischen verschiedenen Daten mit einer bedingten Wahrscheinlichkeit auszudrücken, werden wir ihn wie folgt platzieren.


p_{i|i} = 0

2. Der Abstand zwischen Datenpunkten nach der Dimensionsreduktion wird auch durch die bedingte Wahrscheinlichkeit ausgedrückt.

Die Ähnlichkeit zwischen den dimensionsreduzierten Datenpunkten $ y_ {i} $ und $ y_ {j} $ wird wie zuvor auch als ** bedingte Wahrscheinlichkeit $ q_ {j | i} $ ausgedrückt. ** Nehmen Sie auch an, dass $ y_j $ wahrscheinlich basierend auf einer Normalverteilung ausgewählt wird, die auf $ y_ {i} $ zentriert ist, aber anders als zuvor ** ist die Varianz $ \ frac {1} { Behoben mit \ sqrt {2}} $ **. Durch Fixieren können Sie die Dispersion aus der vorherigen Formel aufheben und vereinfachen.

$ q_ {j | i} $ kann durch die folgende Formel ausgedrückt werden.


q_{j|i} = \frac{\exp(-||y_{i} - y_{j}||^2)}{\sum_{k\neq i}\exp(-||y_{i} - y_{k}||^2)}

Platzieren Sie es wie folgt.


q_{i|i} = 0

3. Verlustfunktionsdesign mit KL-Divergenz

Da die Abstandsbeziehung zwischen Datenpunkten in der höheren Dimension und die Abstandsbeziehung in der niedrigeren Dimension nach der Dimensionsreduzierung so weit wie möglich übereinstimmen sollte,p_{i|j} = q_{i|j}Ich will es sein. Diesmalp_{i|j}Wannq_{i|j}の距離を測る指標WannしてKLダイバージェンス(Keine strenge Definition der Entfernung)を使用します。KLダイバージェンスWann損失関数Wannしてその最小化を目指します。

Die Verlustfunktion $ C $ wird diesmal durch die folgende Formel ausgedrückt.


C = \sum_{i}KL(P_{i}||Q_{i}) = \sum_{i} \sum_{j} p_{j|i}\log\frac{p_{j|i}}{q_{j|i}}

$ P_ {i} $ repräsentiert alle bedingten Wahrscheinlichkeiten bei $ x_ {i} $, $ Q_ {i} $ repräsentiert alle Bedingungen bei $ y_ {i} $ Stellt eine Wahrscheinlichkeit dar.

HierDie KL-Divergenz ist ein asymmetrischer IndikatorDamitKL(P_{i}||Q_{i}) \neq KL(Q_{i}||P_{i})Der Punkt ist zu sein. großp_{j|i}Kleinq_{j|i}Wenn Sie mit modellieren, ist die Verlustfunktion groß. kleinp_{j|i}Der großeq_{j|i}Beim Modellieren mit wird die Verlustfunktion nicht so groß. das ist**Wenn die Position des Datenpunkts nach der Dimensionsreduzierung weit entfernt platziert wird, wenn ein nahegelegener Datenpunkt auf einer höheren Dimension ausgedrückt wird, wird die Verlustfunktion sehr groß.**Es bedeutet das. Aus diesem Grund soll sich SNE darauf konzentrieren, die lokale Struktur der Daten zu erhalten.

4.Perplexity Es gab $ \ sigma_ {i} ^ 2 $ als verbleibenden Parameter. Dies ist die Verteilung einer Normalverteilung, die auf dem hochdimensionalen Datenpunkt $ x_ {i} $ zentriert ist. Dies ist ein sehr wichtiger Parameter, da die Art der Verteilung von der Verteilung $ \ sigma_ {i} ^ 2 $ abhängt.

Wenn die Daten dicht sind, ist es angemessen, $ \ sigma_ {i} ^ 2 $ klein anzunehmen, und wenn die Daten spärlich sind, ist es angemessen, $ \ sigma_ {i} ^ 2 $ groß anzunehmen. Ein Parameter namens Ratlosigkeit wird verwendet, um die Daten anzunehmen.

SNE halbiert $ \ sigma_ {i} ^ 2 $, wodurch $ P_ {i} $ mit einer vom Benutzer angegebenen festen Ratlosigkeit erzeugt wird. Ratlosigkeit ist wie folgt definiert.


Perp(P_{i}) = 2^{H(P_{i})}

Außerdem ist $ H (P_ {i}) $ die Entropie von $ P_ {i} $ und wird wie folgt definiert.


H(P_{i}) = -\sum_{j}p_{j|i}\log_{2}p_{j|i}

Korrigieren Sie beispielsweise Ratlosigkeit mit einem Wert wie $ 40 $ und suchen Sie nach $ \ sigma_ {i} ^ 2 $, das der Gleichung entspricht. Wenn Ratlosigkeit groß ist, ist $ \ sigma_ {i} ^ 2 $ natürlich groß, und es wird angenommen, dass die Daten spärlich sind. Wenn die Ratlosigkeit klein ist, ist auch $ \ sigma_ {i} ^ 2 $ klein, vorausgesetzt, die Daten sind dicht.

Ratlosigkeit kann auch als ** die Zahl umformuliert werden, die bestimmt, wie viele Nachbarn vom Datenpunkt $ x_ {i} $ ** berücksichtigt werden.

5. Minimieren Sie die Verlustfunktion mit der Methode des probabilistischen Gradientenabfalls

Minimieren Sie die Verlustfunktion mithilfe der probabilistischen Gradientenabstiegsmethode. Der Gradient verwendet den folgenden Wert: Dies ist der Wert, der durch Differenzieren der Verlustfunktion durch $ y_ {i} $ erhalten wird.


\frac{\delta C}{\delta y_{i}} = 2\sum_{j}(p_{j|i}-q_{j|i}+p_{i|j}-q_{i|j})(y_{i}-y_{j})

Wir werden $ y_ {i} $ schrittweise mit diesem Verlauf verschieben, und die Aktualisierungsformel lautet wie folgt.


Y^{(t)} = Y^{(t-1)} + \eta \frac{\delta C}{\delta Y} + \alpha(t)(Y^{(t-1)} - Y^{(t-2)})

Ist ein Bild der Bewegung von $ Y ^ {(t-1)} $ um die Lernrate $ \ eta $ nur in Richtung des Gradienten $ \ frac {\ delta C} {\ delta Y} . ( T $ steht für die Anzahl der Iterationen.) Schließlich gibt es ein $ \ alpha (t) (Y ^ {(t-1)} - Y ^ {(t-2)}) $, das als Impulsausdruck bezeichnet wird und ein wenig von der Optimierung des Gradienten abhängt. Es gibt eine Bedeutung zu verschieben. Die Optimierung wird so gesteuert, dass sie nicht in den lokalen Minimalwert fällt und so weit wie möglich innerhalb des Minimalwerts bleibt.

Dies ist der Fluss von SNE.

Probleme mit SNE

Das Obige ist der Fluss von SNE, aber SNE hat die folgenden zwei Probleme.

Weil die Verlustfunktion KL-Divergenz verwendetp_{j|i}Wannq_{j|i}Kann nicht behandelt werdenVerlustfunktionsformel komplizierttun.((p_{j|i}-q_{j|i}+p_{i|j}-q_{i|j})Teil von)

Überfüllungsproblem Wenn ein mehrdimensionales Objekt auf eine niedrigere Dimension verschoben wird, verringert sich die Anzahl der Datenpunkte, die gleich weit voneinander entfernt sein können. Wenn die Dimension entfernt wird, wird sie überfüllt, um die Äquidistanz aufrechtzuerhalten **. Es ist ein Problem.

Zum Beispiel können im Fall von 3 Dimensionen 4 Datenpunkte mit der Anzahl der Dimensionen + 1 in gleichen Abständen voneinander existieren, aber wenn sie in 2 Dimensionen fallen gelassen werden, können nur 3 Datenpunkte mit der Anzahl der Dimensionen + 1 in gleichen Abständen existieren. Es besteht die Möglichkeit, den Spalt zu zerstören, der hätte auftreten müssen, wenn die Anzahl der Dimensionen verringert wurde. Das ist das Crowding-Problem.

T-SNE versuchte diese Probleme zu lösen.

Wie t-SNE funktioniert

Um die Probleme von SNE zu lösen, wurden t-SNE die folgenden Funktionen hinzugefügt.

Verlustfunktionssymmetrie

Die Nähe des Punktes $ x_ {i} $ und des Punktes $ x_ {j} $ wird durch die gleichzeitige Wahrscheinlichkeitsverteilung $ p_ {ij} $ als Symmetrieverarbeitung der Verlustfunktion ausgedrückt. (Beachten Sie, dass die Symmetrie eher eine simultane Wahrscheinlichkeit als eine bedingte Wahrscheinlichkeit ist.)


p_{ij} = \frac{p_{i|j} + p_{j|i}}{2n}


p_{j|i} = \frac{\exp(-||x_{i} - x_{j}||^2/2\sigma_{i}^2)}{\sum_{k\neq i}\exp(-||x_{i} - x_{k}||^2/2\sigma_{i}^2)}

p_{j|i}Es gibt keine Änderung in, aber die Verarbeitung dauert durchschnittlichp_{ij} = \frac{p_{i|j} + p_{j|i}}{2n}Es ist symmetrisch mit.

Annahme der Verteilung der Schüler

Zusätzlich wird die Nähe des Punktes $ y_ {i} $ und des Punktes $ y_ {j} $ in der unteren Dimension durch die gleichzeitige Wahrscheinlichkeitsverteilung $ q_ {ij} $ wie folgt ausgedrückt.


q_{ij} = \frac{(1+||y_{i} - y_{j}||^2)^{-1}}{\sum_{k\neq i}(1+||y_{i} - y_{j}||^2)^{-1}}

Bei der Betrachtung des Punktabstands in der unteren Dimension nehmen wir hier eine Schülerverteilung mit einem Freiheitsgrad von $ 1 $ an. ** Die t-Verteilung ist durch eine höhere Basis als die Normalverteilung gekennzeichnet **. Durch die Verwendung einer t-Verteilung mit hoher Basis können Datenpunkte mit mittlerer Reichweite als Datenpunkte mit mittlerer Reichweite im hochdimensionalen Raum und größere Entfernungen im niedrigdimensionalen Raum modelliert werden, und ** Überfüllungsprobleme können für Datenpunkte mit mittlerer Reichweite vermieden werden. Ich kann es schaffen ** ** **

download.png

Verlustfunktion minimieren

t-SNE verwendet diese $ p_ {ij} $ und $ q_ {ij} $, um die Verlustfunktion zu minimieren. Die Verlustfunktion wird wie folgt ausgedrückt.


C = \sum_{i}KL(P ||Q) = \sum_{i} \sum_{j} p_{ji}\log\frac{p_{ji}}{q_{ji}}

Dies wird auch unter Verwendung der stochastischen Gradientenabstiegsmethode wie bei SNE optimiert.


\frac{\delta C}{\delta y_{i}} = 4\sum_{j}(p_{ji}-q_{ji})(y_{i}-y_{j})(1+||y_{i} - y_{j}||^2)^{-1}

Die Aktualisierungsformel ist dieselbe wie bei SNE.

Visualisierungsbeispiel für t-SNE

Dieses Mal möchte ich die Verteilungssituation anhand von Textdaten visualisieren. Textdaten sind bei der Vektorisierung in der Regel hochdimensional, sodass der Algorithmus zur Dimensionsreduzierung sehr effektiv ist.

Bibliothek verwendet

scikit-learn 0.21.3

Datensatz

Dieses Mal denke ich, dass der Datensatz verwendet wird, um den Datenverteilungsstatus mithilfe von "Livedoor News Corpus" zu visualisieren. Einzelheiten zum Datensatz und zur Methode der morphologischen Analyse finden Sie unter Veröffentlicht im zuvor veröffentlichten Artikel. Ich werde.

Im Fall von Japanisch ist eine Vorverarbeitung erforderlich, bei der Sätze in morphologische Elemente zerlegt werden. Nachdem alle Sätze in morphologische Elemente zerlegt wurden, werden sie in den folgenden Datenrahmen verschoben.

スクリーンショット 2020-01-13 21.07.38.png

Visualisierung der Datenverteilung

Nach dem Vektorisieren der Textdaten mit TF-IDF werden diese mit t-SNE auf zwei Dimensionen reduziert.

import pickle
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

#Es wird angenommen, dass der Datenrahmen nach der morphologischen Zersetzung bereits gebeizt wurde.
with open('df_wakati.pickle', 'rb') as f:
    df = pickle.load(f)

#tf-Vektorisierung mit idf
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df[3])

#t-Dimensionsreduzierung mit SNE
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, random_state = 0, perplexity = 30, n_iter = 1000)
X_embedded = tsne.fit_transform(X)

ddf = pd.concat([df, pd.DataFrame(X_embedded, columns = ['col1', 'col2'])], axis = 1)

article_list = ddf[1].unique()

colors =  ["r", "g", "b", "c", "m", "y", "k", "orange","pink"]
plt.figure(figsize = (30, 30))
for i , v in enumerate(article_list):
    tmp_df = ddf[ddf[1] == v]
    plt.scatter(tmp_df['col1'],  
                tmp_df['col2'],
                label = v,
                color = colors[i])
    
plt.legend(fontsize = 30)

Das Ergebnis ist hier. Es ist möglich, die Existenz von Clustern für jedes Artikelmedium zu visualisieren.

download2.png

Next Ich denke, es wäre schön, andere Dimensionsreduktionsalgorithmen zusammenzufassen. Vielen Dank für das Lesen bis zum Ende.

Recommended Posts

Verstehen Sie t-SNE und verbessern Sie die Visualisierung
[Hinweis] PCA und t-SNE
Grundlegendes zu PyTorchs DataSet und DataLoader (2)
Grundlegendes zu PyTorchs DataSet und DataLoader (1)
Lernen Sie Python-Pakete und -Module kennen
Interaktive Visualisierung mit ipywidgets und Bokeh
[Python / matplotlib] FuncAnimation verstehen und verwenden
Clustering und Visualisierung mit Python und CytoScape
Verstehen Sie Zahnräder und Erweiterungen in discord.py
Verstehe die Regeln und konvexen Funktionen von Armijo
Aggregation und Visualisierung akkumulierter Zahlen