Skip to content
Snippets Groups Projects
Select Git revision
  • 0d6f7797d41749e183efb9979661553bd7b74a67
  • master default protected
2 results

module2_functions.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ex3_1_3.py 1.16 KiB
    # exercise 3.1.3
    # (requires data structures from ex. 3.1.1)
    import matplotlib.pyplot as plt
    from ex3_1_1 import *
    from scipy.linalg import svd 
    
    # Subtract mean value from data
    # Note: Here we use Y to in teh book we often use X with a hat-symbol on top.
    Y = X - np.ones((N, 1)) * X.mean(axis=0)
    
    # PCA by computing SVD of Y
    # Note: Here we call the Sigma matrix in the SVD S for notational convinience
    U, S, Vh = svd(Y, full_matrices=False)
    
    # scipy.linalg.svd returns "Vh", which is the Hermitian (transpose)
    # of the vector V. So, for us to obtain the correct V, we transpose:
    V = Vh.T
    
    # Compute variance explained by principal components 
    # Note: This is an important equation, see Eq. 3.18 on page 40 in the book.
    rho = (S * S) / (S * S).sum()
    
    threshold = 0.9
    
    # Plot variance explained
    plt.figure()
    plt.plot(range(1, len(rho) + 1), rho, "x-")
    plt.plot(range(1, len(rho) + 1), np.cumsum(rho), "o-")
    plt.plot([1, len(rho)], [threshold, threshold], "k--")
    plt.title("Variance explained by principal components")
    plt.xlabel("Principal component")
    plt.ylabel("Variance explained")
    plt.legend(["Individual", "Cumulative", "Threshold"])
    plt.grid()
    plt.show()
    
    print("Ran Exercise 3.1.3")