class PCA matplotlib for face recognition
Question: I am trying to make face recognition by Principal Component Analysis (PCA)
using python. I am using class `pca` found in `matplotlib`. Here is it's
documentation:

> class matplotlib.mlab.PCA(a) compute the SVD of a and store data for PCA.
> Use project to project the data onto a reduced set of dimensions
>  
>  
>     Inputs:
>     a: a numobservations x numdims array
>     Attrs:
>     a a centered unit sigma version of input a
>     numrows, numcols: the dimensions of a
>     mu : a numdims array of means of a
>     sigma : a numdims array of atandard deviation of a
>     fracs : the proportion of variance of each of the principal components
>     Wt : the weight vector for projecting a numdims point or array into PCA
> space
>     Y : a projected into PCA space
>  

The factor loadings are in the Wt factor, ie the factor loadings for the 1st
principal component are given by Wt[0]

And here is my code:

    
    
    import os
    from PIL import Image
    import numpy as np
    import glob
    import numpy.linalg as linalg
    from matplotlib.mlab import PCA
    
    
    #Step 1: put database images into a 2D array
    filenames = glob.glob('C:\\Users\\Karim\\Downloads\\att_faces\\New folder/*.pgm')
    filenames.sort()
    img = [Image.open(fn).convert('L').resize((90, 90)) for fn in filenames]
    images = np.asarray([np.array(im).flatten() for im in img])
    
    
    #Step 2: database PCA
    results = PCA(images.T)
    w = results.Wt
    
    
    #Step 3: input image
    input_image = Image.open('C:\\Users\\Karim\\Downloads\\att_faces\\1.pgm').convert('L')
    input_image = np.asarray(input_image)
    
    
    #Step 4: input image PCA
    results_in = PCA(input_image)
    w_in = results_in.Wt
    
    
    #Step 5: Euclidean distance
    d = np.sqrt(np.sum(np.asarray(w - w_in)**2, axis=1))
    

But I am getting an error:

    
    
    Traceback (most recent call last):
      File "C:/Users/Karim/Desktop/Bachelor 2/New folder/matplotlib_pca.py", line 32, in <module>
        d = np.sqrt(np.sum(np.asarray(w - w_in)**2, axis=1))
    ValueError: operands could not be broadcast together with shapes (30,30) (92,92)
    

  1. Can anyone help me to correct the error?
  2. Is that the correct way for face recognition?


Answer: The error is telling you that the two arrays (`w` and `w_in`) are not the same
size and `numpy` can not figure out how to broadcast the values to take the
difference.

I am not familiar with this function, but I would guess that the source of the
issue is your input images are different sizes.

