Mathematics에서 Power Iteration(혹은 power method라고 부름)은 eigenvalue algorithm이다.

Diagnoalizable Matrix A가 주어지면 이 알고리즘은 가장 큰 값을 가지는 A에 대한 Eignevalue인 lambda와 해당 lambda의 eigenvector인 0이 아닌 vector v를 생성를 생성한다.

Power Iteration은 매우 간단한 알고리즘이지만 converge가 매우 느리다.

벡터와 행렬 곱으로 알고리즘의 가장 시간이 걸리는 작업이며, 적절한 구현과 매우 큰 희소 행렬에 효과적이다.

Code Imp 1.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/efb9cbe5-d44a-4698-a17e-826bd0364366/Untitled.png

import numpy as np

def power_iteration(A, num_simulations):
    # Ideally choose a random vector
    # To decrease the chance that our vector
    # Is orthogonal to the eigenvector
    b_k = np.random.rand(A.shape[1])

    for _ in range(num_simulations):
        # calculate the matrix-by-vector product Ab
        b_k1 = np.dot(A, b_k)

        # calculate the norm
        b_k1_norm = np.linalg.norm(b_k1)

        # re normalize the vector
        b_k = b_k1 / b_k1_norm

    return b_k

power_iteration(np.array([[0.5, 0.5], [0.2, 0.8]]), 10)

Code Imp 2.

Finding the eigenvalue:

$$ \lambda = \frac{v^TA^Tv}{v^Tv}=\frac{(Av)^Tv}{v^Tv} $$

$$ \frac{(Av)^Tv}{v^Tv} = \frac{\lambda v^Tv}{v^Tv} = \lambda $$

def eigenvalue(A, v):
    Av = A.dot(v)
    return v.dot(Av)

def power_iteration(A):
    n, d = A.shape

    v = np.ones(d) / np.sqrt(d)
    ev = eigenvalue(A, v)

    while True:
        Av = A.dot(v)
        v_new = Av / np.linalg.norm(Av)

        ev_new = eigenvalue(A, v_new)
        if np.abs(ev - ev_new) < 0.01:
            break

        v = v_new
        ev = ev_new

   return ev_new, v_new

Power Iteration Process

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c2d5f3e1-27d7-44e0-9f87-c312a1d219c5/Untitled.png