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)

And recreate:

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.

Show your support

Clapping shows how much you appreciated Lester Litchfield’s story.