2015-07-21 4 views
7

Im Versuch ZCA Bleaching und fand einige Artikel zu implementieren, es zu tun, aber sie sind ein wenig verwirrend .. kann jemand für mich ein Licht leuchten?Wie ZCA Whitening implementieren? Python

Jede Spitze oder Hilfe ist willkommen! Hier

ist der Artikel lese ich:

http://courses.media.mit.edu/2010fall/mas622j/whiten.pdf http://bbabenko.tumblr.com/post/86756017649/learning-low-level-vision-feautres-in-10-lines-of

ich einige Dinge ausprobiert, aber die meisten von ihnen i didnt verstehen, und ich hätte irgend Schritt gesperrt. Im Moment habe ich dies als Basis wieder zu starten:

dtype = np.float32 
data = np.loadtxt("../inputData/train.csv", dtype=dtype, delimiter=',', skiprows=1) 
img = ((data[1,1:]).reshape((28,28)).astype('uint8')*255) 

Antwort

9

Sind Ihre Daten in einer mxn Matrix gespeichert? Wo ist m die Dimension der Daten und n sind die Gesamtzahl der Fälle? Wenn dies nicht der Fall ist, sollten Sie die Größe Ihrer Daten ändern. Zum Beispiel, wenn Ihre Bilder die Größe 28x28 haben und Sie nur ein Bild haben, sollten Sie einen 1x784 Vektor haben. Sie könnten diese Funktion nutzen:

import numpy as np 

def flatten_matrix(matrix): 
    vector = matrix.flatten(1) 
    vector = vector.reshape(1, len(vector)) 
    return vector 

Dann bewerben Sie ZCA Whitening auf Ihre Trainingssatz mit:

def zca_whitening(inputs): 
    sigma = np.dot(inputs, inputs.T)/inputs.shape[1] #Correlation matrix 
    U,S,V = np.linalg.svd(sigma) #Singular Value Decomposition 
    epsilon = 0.1    #Whitening constant, it prevents division by zero 
    ZCAMatrix = np.dot(np.dot(U, np.diag(1.0/np.sqrt(np.diag(S) + epsilon))), U.T)      #ZCA Whitening matrix 
    return np.dot(ZCAMatrix, inputs) #Data whitening 

Es ist wichtig, die ZCAMatrix Matrix zu speichern, sollten Sie Ihre Testfälle multiplizieren, wenn Sie wollen vorhersagen nach dem Training des Neuronalen Netzes.

Zum Schluss lade ich Sie ein, die Stanford UFLDL Tutorials unter http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial oder http://ufldl.stanford.edu/tutorial/ zu nehmen. Sie haben ziemlich gute Erklärungen und einige Programmierübungen auf MATLAB, aber fast alle Funktionen, die auf MATLAB gefunden werden, sind auf Numpy mit dem gleichen Namen. Ich hoffe, dass dies einen Einblick geben kann.

+0

tatsächlich die Daten = np.loadtxt ("../ EingDaten/train.csv", dtype = dtype, delimiter = '', skiprows = 1) für jede Zeile ein Vektor von schwarzen/weißen Pixeln (0 - 255), der img ist nur 1 Bild, das ich zu 28,28 umformte. Für den Fall, dass ich ZCA das gesamte 'Daten' Objekt wollte, wie soll ich das machen? Vielen Dank undfoy! –

+0

Wenn Ihre Daten bereits durch eine an m x 784-Matrix dargestellt werden, sollten Sie zca_whitening (data) aufrufen. Handelt es sich um den MNIST-Datensatz handgeschriebener Zahlen? –

+0

Ja ist es! Von Kaggle Wettbewerb :) –

10

Wie wies darauf hin, in R.M 's comment, Andfoy' s ZCA Aufhellungsfunktion enthält einen kleinen, aber entscheidenden Fehler: die np.diag(S) entfernt werden sollte. Numpy gibt S als einen m × 1-Vektor und nicht eine m × m-Matrix zurück (wie es bei anderen SVD-Implementierungen üblich ist, z. B. Matlab). Daher wird die ZCAMatrix Variable ein m × 1 Vektor und nicht eine m × m Matrix, wie es sein sollte (wenn die Eingabe m × n ist). (Auch die Kovarianzmatrix in Andfoys Antwort ist nur gültig, wenn X vorzentriert ist, d. H. Mittelwert 0).

Hier ist eine Python-Funktion, um die ZCA Bleaching Matrix zur Erzeugung:

def zca_whitening_matrix(X): 
    """ 
    Function to compute ZCA whitening matrix (aka Mahalanobis whitening). 
    INPUT: X: [M x N] matrix. 
     Rows: Variables 
     Columns: Observations 
    OUTPUT: ZCAMatrix: [M x M] matrix 
    """ 
    # Covariance matrix [column-wise variables]: Sigma = (X-mu)' * (X-mu)/N 
    sigma = np.cov(X, rowvar=True) # [M x M] 
    # Singular Value Decomposition. X = U * np.diag(S) * V 
    U,S,V = np.linalg.svd(sigma) 
     # U: [M x M] eigenvectors of sigma. 
     # S: [M x 1] eigenvalues of sigma. 
     # V: [M x M] transpose of U 
    # Whitening constant: prevents division by zero 
    epsilon = 1e-5 
    # ZCA Whitening matrix: U * Lambda * U' 
    ZCAMatrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T)) # [M x M] 
    return ZCAMatrix 

Und ein Beispiel für die Nutzung:

X = np.array([[0, 2, 2], [1, 1, 0], [2, 0, 1], [1, 3, 5], [10, 10, 10] ]) # Input: X [5 x 3] matrix 
ZCAMatrix = zca_whitening_matrix(X) # get ZCAMatrix 
ZCAMatrix # [5 x 5] matrix 
xZCAMatrix = np.dot(ZCAMatrix, X) # project X onto the ZCAMatrix 
xZCAMatrix # [5 x 3] matrix 

Hoffe, es hilft!

NB: Sie können die vollständige Antwort in Python auf die Stanford UFLDL ZCA Whitening Übung here sehen.

Verwandte Themen