#pca svd working

def svd(D):
    import time
    import numpy

    # Record starting time
    timestart = time.time()

    # Prepare and center the data for PCA
    # Reshape from 3D array to 2D array
    # from (pics, height, width)
    # to (pics, all_pixels)
    # here: from (2000, 62, 47) to (2000, 2914)
    # then transpose
    X = D.reshape(len(D), -1).T
    X -= X.mean(axis=1, keepdims=True)

    # Singular Value Decomposition
    U, L, V = numpy.linalg.svd(X / X.shape[1]**0.5, full_matrices=False)

    # Print time
    tfinish = time.time()
    print('Time in seconds: %.3f' % (tfinish - timestart))

    # Visualize first two principal components
    utils.scatterplot(U[:,0].dot(X), U[:,1].dot(X), xlabel='PCA 1', ylabel='PCA 2')

    # Render first 60 eigenfaces (principal components)
    utils.render(U[:,:60].T, 15, 4)

# call the function
svd(D)