Skip to content

Instantly share code, notes, and snippets.

Last active August 17, 2021 14:06
  • Star 14 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
import numpy as np
from scipy import linalg
from sklearn.utils import array2d, as_float_array
from sklearn.base import TransformerMixin, BaseEstimator
class ZCA(BaseEstimator, TransformerMixin):
def __init__(self, regularization=10**-5, copy=False):
self.regularization = regularization
self.copy = copy
def fit(self, X, y=None):
X = array2d(X)
X = as_float_array(X, copy = self.copy)
self.mean_ = np.mean(X, axis=0)
X -= self.mean_
sigma =,X) / X.shape[1]
U, S, V = linalg.svd(sigma)
tmp =, np.diag(1/np.sqrt(S+self.regularization)))
self.components_ =, U.T)
return self
def transform(self, X):
X = array2d(X)
X_transformed = X - self.mean_
X_transformed =, self.components_.T)
return X_transformed
Copy link

Hi @duschendestroyer and thank you for sharing your code!

Despite my efforts, I didn't find out how apply this method to RGB images.

According to UFLDL Tutorial and to your code, I understand that X is supposed to be a matrix (2d-array) of 0. to 1. floats with shape: (n_samples, Height * Width * 3,). Is that right?

If so, how do you transform an original dataset with shape (n_samples, Height, Witdh, 3) to (n_samples, Height * Witdh * 3) ? do you simply reshape?

Copy link

"do you simply reshape?" Yes
(the answer is prob far too late but may it help anyone who stumbles on this gist via google)

Copy link

Coderx7 commented Oct 25, 2016

How is that done in python (Im new to python)I'd be grateful if you could as well show a snippet for that.

Copy link

Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment