Factorizing my face
Matrix factorization is a commonly used technique to fill in the blanks in sparse matrices, or to reduce features to lower dimensional spaces.
I found myself wondering how well they reconstruct data, so let’s factorize a matrix we can all agree on: my face.
I know, hard to improve on that. But still, lets throw it into a common matrix factorization algorithm, singular value decomposition.
First I open the image as an array in numpy:
I = np.asarray(Image.open(‘Lester.jpg’))
I’m going to reverse out the colour, so that I can set all that white space to be sparse.
rev = 255-I
and now I’m gonna normalise between 0 and 1 and put it in a sparse matrix:
from scipy.sparse import coo_matrix
image_coo = coo_matrix(rev/255)
The SVD… we create 3 smaller matrices (u, s, vt) that can reconstruct out original image:
from scipy.sparse.linalg import svds
u, s, vt = svds(image_coo, k=10)
s_diag = np.diag(s)
svd_reconstructed = np.dot(np.dot(u, s_diag), vt)
svd_corrected = (1-svd_reconstructed)*255
Not bad for just 10 dimensions! This increases my faith that my mf-based recommendation engines are recreating the patterns that exist in my data.