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)".
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 |
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 |
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.
Wenden Sie die Hauptkomponentenanalyse auf die in> 84 erhaltene Wortkontextmatrix an und komprimieren Sie den Wortbedeutungsvektor auf 300 Dimensionen.
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)
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.
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)
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 ...
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