Skip to content

Instantly share code, notes, and snippets.

Last active August 17, 2021 14:06
Show Gist options
  • Save dmaniry/5170087 to your computer and use it in GitHub Desktop.
Save dmaniry/5170087 to your computer and use it in GitHub Desktop.
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