# Code from Chapter 6 of Machine Learning: An Algorithmic Perspective (2nd Edition) # by Stephen Marsland (http://stephenmonika.net) # You are free to use, change, or redistribute the code in any way you wish for # non-commercial purposes, but please maintain the name of the original author. # This code comes with no warranty of any kind. # Stephen Marsland, 2008, 2014 # An algorithm to compute PCA. Not as fast as the NumPy implementation import numpy as np def pca(data,nRedDim=0,normalise=1): # Centre data m = np.mean(data,axis=0) data -= m # Covariance matrix C = np.cov(np.transpose(data)) # Compute eigenvalues and sort into descending order evals,evecs = np.linalg.eig(C) indices = np.argsort(evals) indices = indices[::-1] evecs = evecs[:,indices] evals = evals[indices] if nRedDim>0: evecs = evecs[:,:nRedDim] if normalise: for i in range(np.shape(evecs)[1]): evecs[:,i] / np.linalg.norm(evecs[:,i]) * np.sqrt(evals[i]) # Produce the new data matrix x = np.dot(np.transpose(evecs),np.transpose(data)) # Compute the original data again y=np.transpose(np.dot(evecs,x))+m return x,y,evals,evecs