Frage

Ich habe den PCA -Algorithmus implementiert und habe es sehr gut verstanden, aber ich habe immer noch einige Fragen. Mein Code ist unten und es ist eine sehr einfache Implementierung.

import numpy as np

x = np.loadtxt('CCPP', delimiter=',')
row, column = x.shape

# Mean normalization
for i in range(column):
    x[:,i] = (x[:,i] - x[:,i].mean()) / (x[:,i].max() - x[:,i].min())

sigma = x.transpose().dot(x) / row
u, s, v = np.linalg.svd(sigma, 0)
z = x.dot(u[:,:3]) ## new features

new_x = z.dot(u[:,:3].transpose()) ##reconstruction

Erste Frage

Wie Sie oben sehen können, ist meine Sigma -Variable

X.Transpsis (). Dot (x) / Zeile

Es gibt mir eine NXN -Matrix (n ist die Anzahl der Funktionen). Aber Sigmas Formel ist $$ sigma = frac {1} {n} sum_ {i = 1}^nx^{(i)} {x^{(i)}}^t $$

Warum gibt es ein Summierungssymbol in der Formel? Ich meine, wenn ich diese Sigma -Formulierung verwende, wird Sigma eine Zahl und keine Matrix sein. Ich muss NXN Matrix bekommen, oder? Ist meine Sigma -Implementierung also korrekt? Oder fehlt mir etwas an der Formel?

Zweite Frage

Wenn wir x rekonstruieren (unten im Code), sollte New_x meinem ersten x gleich sind? Ich meine, ich habe die Dimension des Datensatzes reduziert, dann habe ich ihn rekonstruiert, der ursprüngliche Datensatz und der rekonstruierte Datensatz müssen gleich sein, oder? Dies ist meine zweite Frage.

Dritte Frage

Dieser ist einfach. Sollte ich die Datenkomprimierung für jeden meiner Datensatz verwenden, der 1000, 100000 oder mehr Funktionen hat? Ich meine, kann ich es immer benutzen? Ist es eine gute Wahl, es jedes Mal zu verwenden?

War es hilfreich?

Lösung

Bezüglich der ersten Frage.

Wenn ich in der obigen Formel nicht falsch bin, ist x eine Matrix von Elementen. Also, was die Formel von Ihnen will, ist, alle Punktprodukte jeder Linie mit ihrer Transponierung zusammenzufassen. Dies gibt Ihnen Skalar.

x = np.array([1, 2, 3, 4])
res = x.dot(x.transpose())
# res = 30

Mein Vorgang wäre also, diese Codezeile in:

for i in range(row):
    sigma += x[i].transpose().dot(x[i])
sigma = sigma/row

Zweite Frage

Da Sie die Dimensionalität reduziert haben, ist die X_New -Matrix nicht gleich.

Dritte Frage

Wann die PCA verwendet werden soll, ist ein Domänenproblem. Die Reduzierung der Dimensionalität besteht darin, einen neuen Datensatz zu erhalten, der nicht so schwer zu verarbeiten ist, aber einige Informationen verlieren wird. Wenn Sie also Ihr "Ergebnis"/"Zeit zum Verarbeiten" sind, ist ich nicht, dass Sie es verwenden sollten.

Andere Tipps

Erste Frage: Berechnung $ sigma $

Tatsächlich führen Sie dieselbe Berechnung durch, verwenden jedoch einen Matrixoperation anstelle eines Skalaroperos. Sie könnten durch Ihre Notation der Feature -Matrix $ x $ irreführend sein, dass Sie $ x $ schreiben, weil tatsächlich $$ x = (x_j^{(i)}) _ {i, j} = big (x^{(((((x^{(() 1)} ... x^{(i)} ... x^{(n)} big)^t $$ Das heißt, $ i $ -Th der Matrix $ x $ enthält $ x ^{(i)} $ Das $ i $ -TH-Probe.

Wenn Sie also die empirische Kovarianzmatrix $ sigma $ berechnen möchten (was tatsächlich eine $ n mal n $ matrix ist) haben Sie: $$ sigma = frac {1} {n} sum_ {i = 1}^nx^{(i)} {x^{(i)}}^t = frac {1} {n} x^tx $$ Sie können überprüfen, ob dies genau die gleiche Berechnung ist.

In Ihrem Code berechnen Sie tatsächlich $ sigma $ mit der Matrixoperation (dh $ sigma = frac {1} {n} x^tx $), und dies gibt Ihnen eine $ n mal n $ matrix. Sowohl Ihre Implementierung als auch die Formel sind also korrekt.

Zweite Frage: rekonstruieren $ x $

Ihre neue Funktion matrix $ z $ ist eine $ n mal 3 $ matrix gemäß Ihrem Code. Da Ihr Code nicht die ursprüngliche Größe des Feature -Raums zeigt, werden wir hier die beiden Fälle sehen:

  1. $ X $ ist auch eine $ n mal 3 $ $ matrix, dann führen Sie keine Dimensionsreduzierung durch und Sie sollten $ x_ {new} = x $ haben (zumindest theoretisch haben Sie in der Praxis möglicherweise eine sehr kleine Numerischer Approximationsfehler, aber es ist im Grunde genommen der gleiche)
  2. $ X $ ist eine $ n mal d $ matrix mit $ d> 3 $, dann führen Sie eine Dimensionsreduzierung durch und in diesem Fall werden einige in den Originaldaten enthaltene Informationen und in diesem Fall $ x_ {new} los neq x $

In Ihrem Fall denke ich, dass Sie $ d> 3 $ haben und Sie sind in der zweiten Situation.

Dritte Frage: Wann ist PCA anzuwenden

Nun, das hängt in der Tat ab ...

Zunächst führt PCA eine SVD durch, die sehr teuer werden kann, wenn Sie viele Funktionen haben. Tatsächlich gibt es verschiedene Möglichkeiten, PCA zu berechnen. Ihr Weg ist näher an der mathematischen Theorie, aber in der Praxis wird ein SVD direkt auf $ x $ berechnet, das $ x^tx $ berechnet, was teuer ist und den gleichen Raum abrufen kann. In irgendeiner Situation kann es jedoch teuer und zeitaufwändig und damit nicht praktisch sein.

Wenn PCA den neuen Feature -Raum nach dem Wert der Eigenwerte sortiert, kann der dh der Varianz der neuen Richtungen die letzte Richtung entfernt. In einigen Fällen kann in einigen Fällen etwas Rauschen entfernen, was helfen kann. Gleichzeitig kann es jedoch wertvolle diskrimative Informationen wegwerfen. Aus diesem Grund können andere Methoden wie LDA interessant sein.

Zusammenfassend lässt sich sagen, dass die Antwort auf die Frage nein ist, es ist keine gute Wahl, sie jedes Mal zu verwenden. Es hängt von Ihrem Problem ab.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top