Domanda

Ho implementato l'algoritmo PCA e ho capito molto bene, ma ancora ho alcune domande. Il mio codice è inferiore ed è molto semplice implementazione.

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

Prima domanda

Come si può vedere sopra la mia variabile sigma è

x.transpose (). Dot (x) / riga

Si sta dando a me una matrice nxn (n è il numero di caratteristiche). Ma la formula di sigma è $$ \ Sigma = \ frac {1} {n} \ sum_ {i = 1} ^ n x ^ {(i)} {x ^ {(i)}} ^ T $$

Perché c'è un simbolo di sommatoria nella formula? Cioè, se uso questa formulazione sigma sigma allora sarà un numero, non una matrice. Devo matrice nxn, giusto? Quindi è la mia implementazione sigma corretta? o mi sto perdendo qualcosa sulla formula?

Seconda domanda

Quando stiamo ricostruendo X (in basso nel codice), dovrebbe new_x uguale al mio primo X? Voglio dire, ho ridotto la dimensione del set di dati, poi ho ricostruito che, insieme di dati originale e set di dati ricostruito deve essere lo stesso, giusto? Questa è la mia seconda domanda.

Terzo quesito

Questo non è facile. Dovrei usare la compressione dei dati per ciascuno dei miei set di dati che ha 1000, 100000 o più funzioni? Voglio dire, posso sempre usarla? E 'una buona scelta per usarlo ogni volta?

È stato utile?

Soluzione

Per quanto riguarda la prima domanda .

Nella formula di cui sopra, se non sbaglio, x è una matrice di elementi. Così che cosa la formula vuole da te, è quello di sommare tutti i prodotti di punti di ogni riga con il suo trasposizione. Questo vi darà scalare.

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

Quindi il mio sugestion sarebbe quello di cambiare quella riga di codice:

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

Seconda domanda

Poiché è ridotto la dimensionalità, la matrice x_new non sarà lo stesso.

Terzo quesito

Quando usare il PCA è una cosa del dominio del problema. Il punto di riduzione di dimensionalità è, per ottenere nuovo set di dati, che non sarà così difficile da lavorare, ma perderà alcune informazioni. Quindi, se siete il vostro "risultato" / "tempo di processo" è buono, non credo che si dovrebbe usare.

Altri suggerimenti

Prima domanda: calcolo $ \ Sigma $

In realtà, si esegue lo stesso calcolo ma utilizzando un'operazione di matrice invece di un'operazione scalare. Potreste essere trarre in inganno dalla vostra notazione della matrice funzione di $ X $ che si scrive $ x $ perché in realtà $$ X = (x_j ^ {(i)}) _ {i, j} = \ Big (x ^ {(1)} ... x ^ {(i)} ... x ^ {(n)} \ Big) ^ T $$ vale a dire, $ i $ -esimo riga della matrice $ X $ contiene $ x ^ {(i)} $ il $ i $ -esimo campione.

Quindi, quando si vuole calcolare la matrice di covarianza empirica $ \ Sigma $ (che è davvero un $ n \ n volte $ matrice), si ha: $$ \ Sigma = \ frac {1} {n} \ sum_ {i = 1} ^ nx ^ {(i)} {x ^ {(i)}} ^ T = \ frac {1} {n} X ^ TX $$ è possibile verificare che questo è esattamente lo stesso calcolo.

Nel codice, si sono in realtà calcolando direttamente $ \ Sigma $ utilizzando l'operazione di matrice (cioè $ \ Sigma = \ frac {1} {n} X ^ TX $) e questo ti dà un $ n \ times n $ matrix. Così, sia l'implementazione e la formula è corretta.

Seconda domanda: la ricostruzione $ X $

La tua nuova matrice delle caratteristiche $ Z $ è un $ n \ volte 3 $ matrice secondo il codice. In realtà, come il codice non mostra la dimensione originale dello spazio funzione, vedremo i due casi qui:

  1. $ X $ è anche un $ matrice di $ n \ volte 3, allora non eseguire qualsiasi tipo di riduzione di dimensione e si dovrebbe avere $ X_ {nuovo} = X $ (almeno in teoria, in pratica, si potrebbe avere un piccolo errore di approssimazione numerica ma sarà essenzialmente lo stesso)
  2. $ X $ è un $ n \ volte D $ matrice $ d> 3 $, poi si fa eseguire una riduzione di dimensioni e in questo caso a sbarazzarsi di alcune informazioni contenute nei dati originali e in questo caso $ X_ {nuovo} \ neq X $

Nel tuo caso, immagino che avete $ d> 3 $ e così sei nella seconda situazione.

Terza domanda: quando applicare PCA

Bene che dipende in effetti ...

Prima di tutto PCA esegue uno SVD, che può diventare molto costoso se si dispone di un sacco di funzioni. In realtà, ci sono diversi modo per PCA di calcolo, la tua strada è il più vicino alla teoria matematica ma in pratica il calcolo di uno SVD direttamente sul $ X $ evita di calcolo $ X ^ T X $, che è costoso e permette di recuperare lo stesso spazio. Ma in ogni caso, in qualche situazione, può essere costoso e richiede tempo e quindi non pratico.

Come PCA ordina il nuovo spazio delle caratteristiche in base al valore degli autovalori, cioè della varianza delle nuove direzioni, rimozione dell'ultimo potenza direzione in alcuni casi eliminare il rumore che può aiutare. Tuttavia, allo stesso tempo, può buttare via preziose informazioni discrimative, questo è il motivo per cui altri metodi come LDA possono essere interessanti.

Quindi, per riassumere, la risposta alla domanda è no, non è una scelta buona per utilizzarlo ogni volta, dipende del vostro problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top