CCCPaste

pca powit_3

import numpy as np
import time

def pca_powit(D):
    print("Starting power iteration...")

    t_start = time.time()
    
    # Reshape and center
    X = D.reshape(len(D), -1).T
    X -= X.mean(axis=1, keepdims=True)
    
    # Initial random vector
    rng = np.random.mtrand.RandomState(57)
    w = rng.normal(0, 1, [X.shape[0]])
    w /= np.sqrt((w**2).sum())
    
    # Covariance matrix
    S = np.dot(X, X.T) / X.shape[1]
    
    # Power iteration loop
    J_old = float('nan')
    for it in range(25):
        Sw = S @ w
        J = w @ Sw
        print(f"iteration {it:2d} J(w)={J:10.3f}")
        
        if not np.isnan(J_old) and abs(J - J_old) < 0.01:
            print("Stopping criterion satisfied")
            break
        
        w = Sw / np.sqrt((Sw**2).sum())
        J_old = J
    
    t_end = time.time()
    print(f"Time: {t_end - t_start:.3f} seconds")
    
    # Comment render while debugging
    # utils.render(w, 1, 1)
    return w