2016-10-26 4 views
6

Spark verfügt nun über zwei maschinelle Lernbibliotheken - Spark MLlib und Spark ML. Sie überschneiden sich etwas in dem, was implementiert wird, aber wie ich es verstehe (als eine Person, die neu im gesamten Spark-Ökosystem ist), ist Spark ML der Weg zu gehen und MLlib ist immer noch hauptsächlich aus Gründen der Abwärtskompatibilität.PCA in Spark MLlib und Spark ML

Meine Frage ist sehr konkret und im Zusammenhang mit PCA. In MLlib Implementierung scheint

spark.mllib PCA eine Begrenzung der Anzahl der Spalten werden unterstützt für hoch-und-dünne Matrizen in zeilenorientierten Format und alle Vektoren gespeichert.

Auch, wenn Sie auf den Code Beispiel Java sehen gibt es diese auch

Die Anzahl der Spalten sollte klein sein, zum Beispiel weniger als 1000.

Auf der anderen Seite Wenn Sie sich die Dokumentation ML ansehen, werden keine Einschränkungen erwähnt.

Also meine Frage ist - gibt es diese Einschränkung auch in Spark ML? Und wenn ja, warum die Einschränkung und gibt es einen Workaround, um diese Implementierung verwenden zu können, selbst wenn die Anzahl der Spalten groß ist?

+0

Interessante Frage. Ich habe viele andere Inkonsistenzen in der mllib-Dokumentation gesehen. – Rob

Antwort

1

PCA besteht darin, eine Menge unabhängiger Zufallsvariablen zu finden, mit denen Sie Ihre Daten darstellen können, und zwar in absteigender Reihenfolge in Bezug auf die Varianz, die sie beibehalten.

Diese Variablen können durch Projizieren Ihrer Datenpunkte auf einen bestimmten orthogonalen Unterraum gefunden werden. Wenn Ihre (mittlere) Datenmatrix X ist, besteht dieser Unterraum aus den Eigenvektoren X^T X.

Wenn X groß ist, etwa der Dimensionen n x d Sie X^TX durch Berechnen des äußeren Produkts von jeder Zeile der Matrix, die durch sich selbst berechnen kann, dann Addition aller Ergebnisse up . Dies ist natürlich einem einfachen Map-Reduction-Verfahren zugänglich, wenn d klein ist, egal wie groß n ist. Das ist, weil das äußere Produkt jeder Zeile für sich selbst eine Matrix ist, die von jedem Arbeiter im Hauptspeicher manipuliert werden muss. Deshalb können Sie beim Umgang mit vielen Spalten Probleme bekommen.

Wenn die Anzahl der Spalten groß ist (und die Anzahl der Zeilen nicht so sehr), können Sie tatsächlich PCA berechnen. Berechnen Sie einfach die SVD Ihrer (mean-centered) transponierten Datenmatrix und multiplizieren Sie sie mit den resultierenden Eigenvektoren und der Inversen der Diagonalmatrix der Eigenwerte. Da ist dein orthogonaler Subraum.

Fazit: Wenn die spark.ml-Implementierung jedes Mal dem ersten Ansatz folgt, sollte die Einschränkung gleich sein. Wenn sie die Dimensionen des Eingabe-Datasets überprüfen, um zu entscheiden, ob sie für den zweiten Ansatz verwendet werden sollen, haben Sie keine Probleme mit einer großen Anzahl von Spalten, wenn die Anzahl der Zeilen gering ist.

Unabhängig davon ist die Begrenzung durch die Speicherkapazität Ihrer Mitarbeiter vorgegeben. Sie können also Benutzer an die Decke bringen, anstatt eine Begrenzung vorzuschlagen, die für einige nicht gelten kann. Das könnte der Grund sein, warum sie beschlossen haben, die Einschränkung in den neuen Dokumenten nicht zu erwähnen.

Update: Der Quellcode zeigt, dass sie jedes Mal den ersten Ansatz wählen, unabhängig von der Dimensionalität der Eingabe. Das tatsächliche Limit ist 65535 und bei 10.000 geben sie eine Warnung aus.

+0

Vielen Dank für Ihre Antwort, Entschuldigung für meine späte Antwort. Wissen Sie am Ende vielleicht, welchen Ansatz sie angewendet haben, beide Ansätze oder nur den ersten (existiert das Limit)? Und warum haben sie die Zahl von 1.000 Spalten genommen, das sind 64MB ((8 * 10^3)^2, 8 Bytes pro Doppelwert) Daten, wenn ich nicht falsch liege, sollte das in den Speicher eines Executors passen? – Marko

+1

Ein Blick auf den Code ist aufschlussreich. In MLLib berechnen sie X^T X unter Verwendung einer BLAS-Operation für das äußere Produkt der Zeilen, d. H. Den ersten Ansatz. Ich sehe keinen Hinweis darauf, dass sie eine Überprüfung durchführen, um den zweiten Ansatz zu übernehmen. Sie überprüfen jedoch ein paar Dinge: erstens, dass die Anzahl der Spalten weniger als 65536 ist, nur um die notwendige Zuweisung für die obere Hälfte der Matrix (die symmetrisch ist) zu berechnen. Zweitens, dass die Anzahl der Spalten weniger als 10.000 ist. Andernfalls warnen sie lediglich vor dem notwendigen Speicher. – broncoAbierto

+1

Warum haben sie sich dafür entschieden, in den Dokumenten das empfohlene Limit auf 1000 zu setzen, naja, vielleicht haben sie einfach eine mehr oder weniger vernünftige Zahl gewählt, unter der niemand Schwierigkeiten erwarten sollte, ohne zu viel Härte. Obwohl heutzutage jeder Arbeiter eine Matrix dieser Größe verwenden kann, wird es oft empfohlen, zu große Kartenaufgaben zu vermeiden. Vielleicht haben sie deshalb diese Nummer gewählt. – broncoAbierto

Verwandte Themen