Spaces:
Build error
Build error
| """Functions for training and applying whitening""" | |
| import numpy as np | |
| def l2_normalize_vec(X): | |
| """L2-normalize given descriptors""" | |
| return X / (np.linalg.norm(X, ord=2, axis=1, keepdims=True) + 1e-6) | |
| def whitenapply(X, m, P, dimensions=None): | |
| """Apply whitening (m, P) on descriptors X. If dimensions not None, perform dim reduction.""" | |
| if not dimensions: | |
| dimensions = P.shape[1] | |
| X = np.dot(X-m, P[:, :dimensions]) | |
| return l2_normalize_vec(X) | |
| def pcawhitenlearn_shrinkage(X, s=1.0): | |
| """Learn PCA whitening with shrinkage from given descriptors""" | |
| N = X.shape[0] | |
| # Learning PCA w/o annotations | |
| m = X.mean(axis=0, keepdims=True) | |
| Xc = X - m | |
| Xcov = np.dot(Xc.T, Xc) | |
| Xcov = (Xcov + Xcov.T) / (2*N) | |
| eigval, eigvec = np.linalg.eig(Xcov) | |
| order = eigval.argsort()[::-1] | |
| eigval = eigval[order] | |
| eigvec = eigvec[:, order] | |
| P = np.dot(np.linalg.inv(np.diag(np.power(eigval, 0.5*s))), eigvec.T) | |
| return m, P.T | |