Skip to content
Snippets Groups Projects
Select Git revision
  • 245c9d47778897ca72e1ed3b8e30f09740ba98d3
  • main default protected
  • s2025dev
  • plot-fixes
  • Fall2024
5 results

ex3_1_2.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")