[PYTHON] Sprachverarbeitung 100 knock-85 (abgeschnittene SVD): Dimensionskomprimierung durch Hauptkomponentenanalyse

Dies ist die Aufzeichnung der 85. "Dimensionskomprimierung durch Hauptkomponentenanalyse" von Language Processing 100 Knock 2015. Komprimiert ungefähr 400.000 Dimensionen auf 300 Dimensionen. Dieses Mal führen wir eine Singularwertzerlegung anstelle einer Hauptkomponentenanalyse durch. Wenn wir die Hauptkomponenten mit Scikit-Learn analysieren würden, könnten wir dies nicht mit einer spärlichen Matrix tun, also haben wir den Kompromiss geschlossen: "Beide sind Dimensionsreduktionen!" Die Hauptkomponentenanalyse wurde in 8. Woche des berühmten Coursera-Online-Kurses für maschinelles Lernen erlernt. Wenn Sie an dem Kurs interessiert sind, lesen Sie bitte den Artikel "Einführungskurs zum maschinellen Lernen in Coursera, Tora no Maki (empfohlen für berufstätige Erwachsene)".

Referenzlink

Verknüpfung Bemerkungen
085.Dimensionskomprimierung durch Hauptkomponentenanalyse.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:85 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet
TruncatedSVD Offizielle Hilfe für abgeschnittene SVD
Über die Beziehung zwischen PCA und SVD Unterschied zwischen Hauptkomponentenanalyse und Singularwertzerlegung 1
Zeigen Sie die Beziehung zwischen PCA und SVD Unterschied zwischen Hauptkomponentenanalyse und Singularwertzerlegung 2

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.

Art Ausführung
matplotlib 3.1.1
numpy 1.17.4
pandas 0.25.3
scipy 1.4.1
scikit-learn 0.21.3

Aufgabe

Kapitel 9: Vektorraummethode (I)

enwiki-20150112-400-r10-105752.txt.bz2 Ist der Text von 105.752 Artikeln zufällig 1/10 aus den Artikeln ausgewählt, die zum 12. Januar 2015 aus etwa 400 Wörtern oder mehr der englischen Wikipedia-Artikel bestehen und im bzip2-Format komprimiert sind. Gibt es. Mit diesem Text als Korpus möchte ich einen Vektor (verteilten Ausdruck) lernen, der die Bedeutung eines Wortes ausdrückt. In der ersten Hälfte von Kapitel 9 wird der Prozess des Lernens des Wortvektors implementiert, indem er in mehrere Prozesse unterteilt wird, indem die Hauptkomponentenanalyse auf die aus dem Korpus erstellte Matrix für das gleichzeitige Auftreten von Wortkontexten angewendet wird. In der zweiten Hälfte von Kapitel 9 wird der durch Lernen erhaltene Wortvektor (300 Dimensionen) verwendet, um die Ähnlichkeit von Wörtern zu berechnen und zu analysieren (analog).

Beachten Sie, dass bei gehorsamer Implementierung von Problem 83 eine große Menge (ca. 7 GB) Hauptspeicher erforderlich ist. Wenn Ihnen der Speicher ausgeht, erstellen Sie einen Prozess oder ein 1/100 Stichproben-Korpus enwiki-20150112-400-r100-10576.txt.bz2. Verwenden Sie /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).

Diesmal * 1/100 Stichprobenkorpus enwiki-20150112-400-r100-10576.txt.bz2 400-r100-10576.txt.bz2) "* wird verwendet.

85. Dimensionskomprimierung durch Hauptkomponentenanalyse

Wenden Sie die Hauptkomponentenanalyse auf die in> 84 erhaltene Wortkontextmatrix an und komprimieren Sie den Wortbedeutungsvektor auf 300 Dimensionen.

Antworten

Antwortprogramm [085. Dimensionskomprimierung durch Hauptkomponentenanalyse.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/09.%E3%83%99%E3%82%AF%E3%83% 88% E3% 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (I) / 085.% E4% B8% BB% E6% 88% 90% E5% 88% 86% E5% 88% 86% E6% 9E% 90% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% AC% A1% E5% 85% 83% E5% 9C% A7% E7% B8% AE.ipynb)

import matplotlib.pyplot as plt
import numpy as np
from scipy import io
from sklearn.decomposition import TruncatedSVD

matrix_x = io.loadmat('084.matrix_x.mat')['x']

#Lesen bestätigen
print('matrix_x Shape:', matrix_x.shape)
print('matrix_x Number of non-zero entries:', matrix_x.nnz)
print('matrix_x Format:', matrix_x.getformat())

#Dimensionskomprimierung
svd = TruncatedSVD(300)
matrix_x300 = svd.fit_transform(matrix_x)

print(type(matrix_x300))
print('matrix_x300 Shape:',matrix_x300.shape)

print('Explained Variance Ratio Sum:', svd.explained_variance_ratio_.sum())
ev_ratio = svd.explained_variance_ratio_
ev_ratio = np.hstack([0,ev_ratio.cumsum()])
plt.plot(ev_ratio)
plt.show()

np.savez_compressed('085.matrix_x300.npz', matrix_x300)

Kommentar beantworten

Laden Sie die Datei im Mattenformat, die beim letzten Klopfen gespeichert wurde.

matrix_x = io.loadmat('084.matrix_x.mat')['x']

#Lesen bestätigen
print('matrix_x Shape:', matrix_x.shape)
print('matrix_x Number of non-zero entries:', matrix_x.nnz)
print('matrix_x Format:', matrix_x.getformat())

In der obigen Ausgabe sehen Sie, dass sowohl Form- als auch Nicht-Null-Elemente mit dem letzten Mal identisch sind. Das Format ist jedoch "csc", obwohl ich es als "lil" gespeichert habe. Ist es so etwas? Ich werde fortfahren, ohne mir darüber Sorgen zu machen.

matrix_x Shape: (388836, 388836)
matrix_x Number of non-zero entries: 447875
matrix_x Format: csc

Dies ist der Hauptdimensionskomprimierungsteil dieser Zeit. Ich verwende jedoch nur die Funktion "TruncatedSVD", damit ich keine Probleme habe. Es dauerte ungefähr 8 Minuten.

svd = TruncatedSVD(300)
matrix_x300 = svd.fit_transform(matrix_x)

print(type(matrix_x300))
print('matrix_x300 Shape:',matrix_x300.shape)

Wenn Sie den Rückgabewert überprüfen, sieht es wie das Format "numpy.ndarray" aus. Es ist wahr, dass die dichte Matrix korrekt ist, nicht die dünn besetzte Matrix, da sie dimensional komprimiert ist.

<class 'numpy.ndarray'>
matrix_x300 Shape: (388836, 300)

Nun wollen wir sehen, wie viel wir die Verteilung behalten können. Ich verweise auf den Artikel "Scikit-learn für die Hauptkomponentenanalyse (Berechnung des kumulativen Beitragssatzes)".

print('Explained Variance Ratio Sum:', svd.explained_variance_ratio_.sum())
ev_ratio = svd.explained_variance_ratio_
ev_ratio = np.hstack([0,ev_ratio.cumsum()])
plt.plot(ev_ratio)
plt.show()

Ungefähr 30%. Niedrig···. Ist es besser, die Anzahl der Dimensionen zu erhöhen? ["Es ist wünschenswert, 99% zu überschreiten, aber es scheint, dass 95% oder 90% der Schwellenwert sein können."](Https://qiita.com/FukuharaYohei/items/7a71be58818719cdf73c#232-choosing -die-Anzahl-der-Hauptkomponenten) Ich habe gelernt ...

Explained Variance Ratio Sum: 0.31949196039604355

Dies ist ein Faltliniendiagramm, das das Retentionsverhältnis der Dispersion für jede Hauptkomponente akkumuliert. image.png

Um die Datei leichter zu machen, wird sie komprimiert und mit der Funktion save_compressed gespeichert. Die Dateigröße beträgt jedoch 118 MB. Die in der vorherigen Matrix mit geringer Dichte gespeicherte Dateigröße betrug 7 MB. Selbst wenn sie dimensional komprimiert wurde, schwoll sie aufgrund der dichten Matrix an. Übrigens beträgt die Speichernutzung vor dem Speichern der Komprimierung 933 MB, sodass sie durch Komprimierung anscheinend viel kleiner wird. Andererseits hat sich die Zeit, die 9 Sekunden dauerte, auf 36 erhöht. In Bezug auf das Speichern habe ich auf den Artikel "Vergleichen Sie den Unterschied in der Dateigröße in Abhängigkeit von der Serialisierungsmethode des Numpy-Arrays" verwiesen.

np.savez_compressed('085.matrix_x300.npz', matrix_x300)

Bonus

Tipps: Können Sie die Hauptkomponenten nicht analysieren?

Ich habe untersucht, ob die "Hauptkomponentenanalyse" wie in der Aufgabe beschrieben durchgeführt werden kann. Der Engpass besteht darin, ob spärliche Matrizen als Eingabe verwendet werden können. Stackoverflows "Durchführen von PCA auf einer großen Matrix mit geringer Dichte mithilfe von sklearn" Es wurde geschrieben, dass es unmöglich war. [MRG] Randomisierte PCA # 12841 implementieren scheint eine Funktion zur Eingabe einer spärlichen Matrix zu implementieren, bleibt jedoch offen. ・ ・ ・ Ich dachte, dass es möglich sein würde, nach und nach mit der Menge an Speicher zu lernen, die in einer dichten Warteschlange überwunden werden kann, aber selbst wenn dies möglich wäre, würde es sehr viel Zeit in Anspruch nehmen, also gab ich auf ...

Tipps: Ich habe die Dimension mit 450 ausprobiert

Ich hatte das Gefühl, dass die Dispersionsretentionsrate von etwa 30% niedrig war, also vergrößerte ich die Dimension. Zuerst habe ich es in 1000 Dimensionen gemacht, aber ein Fehler ist aufgrund unzureichenden Speichers aufgetreten ... Mit 600 Dimensionen endete es auch nach 30 Minuten nicht und es war mühsam, also blieb ich auf halbem Weg stehen. Es dauerte 18 Minuten für 450 Dimensionen. Die Dispersionsretentionsrate betrug zu diesem Zeitpunkt 38%, was erheblich höher ist. Im Vergleich sieht es so aus.

Abmessungen Verarbeitungszeit Rückgabewert(matrix_x300)Erinnerung Dateigröße
300 Dimensionen 8 Minuten 0.9GB 118MB
450 Dimensionen 18 Minuten 1.40GB 178MB

Recommended Posts

Sprachverarbeitung 100 knock-85 (abgeschnittene SVD): Dimensionskomprimierung durch Hauptkomponentenanalyse
Dimensionskomprimierung durch Selbstcodierer- und Hauptkomponentenanalyse
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock-89: Analogie mit additiver Konstitutivität
Dies und das der Hauptkomponentenanalyse
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
Clustering und Hauptkomponentenanalyse nach der K-Means-Methode (Anfänger)
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Amateur-Sprachverarbeitungsklopfen: 47
Hauptkomponentenanalyse (Hauptkomponentenanalyse: PCA)
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
Visualisieren Sie die Korrelationsmatrix durch Hauptkomponentenanalyse mit Python
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Lernen ohne Lehrer 3 Hauptkomponentenanalyse
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
Japanische Verarbeitung natürlicher Sprache mit Python3 (4) Emotionsanalyse durch logistische Regression
[GWAS] Zeichnen Sie die Ergebnisse der Hauptkomponentenanalyse (PCA) von PLINK auf
Vergleich der Stapelverarbeitungsgeschwindigkeit nach Sprache
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
[Sprachverarbeitung 100 Schläge 2020] Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
Gesichtserkennung mit Hauptkomponentenanalyse
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
Sprachverarbeitung 100 knock-86: Wortvektoranzeige