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.
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! –
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? –
Ja ist es! Von Kaggle Wettbewerb :) –