Exemple #1
0
  def gram_schmidt(self):
    """Computes QR using the Gram-Schmidt method.

    Suffers from numerical instabilities when 2 vectors
    are nearly orthogonal which may cause loss of
    orthogonality between the columns of Q.

    Since we compute a unique QR decomposition, we force
    the diagonal elements of R to be positive.
    """
    self.A = np.array(self.backup)
    M, N = self.A.shape
    self.R = np.array(self.A)
    self.A[:, 0] /= utils.l2_norm(self.A[:, 0])
    for i in range(1, N):
      for j in range(i):
        self.A[:, i] -= utils.projection(self.A[:, i], self.A[:, j])
      utils.normalize(self.A[:, i], inplace=True)
    self.Q = self.A
    self.R = np.dot(self.Q.T, self.R)
    return self.Q, self.R
Exemple #2
0
def projected_iteration(A, k, max_iter=1000, sort=True):
    """Sequentially find the k eigenpairs of a symmetric matrix.

  Concretely, combines power iteration and deflation to find
  eigenpairs in order of decreasing magnitude.

  Args:
    A: a square symmetric array of shape (N, N).
    k (int): the number of eigenpairs to return.
    sort (bool): Whether to sort by decreasing eigenvalue magnitude.

  Returns:
    e, v: eigenvalues and eigenvectors. The eigenvectors are
      stacked column-wise.
  """
    assert utils.is_symmetric(A), "[!] Matrix must be symmetric."
    assert k > 0 and k <= A.shape[0], "[!] k must be between 1 and {}.".format(
        A.shape[0])

    eigvecs = np.zeros((A.shape[0], k))
    eigvals = np.zeros(A.shape[0])
    for i in range(k):
        v = np.random.randn(A.shape[0])
        for _ in range(max_iter):
            # project out computed eigenvectors
            proj_sum = np.zeros_like(v)
            for j in range(i):
                proj_sum += utils.projection(v, eigvecs[:, j])
            v -= proj_sum

            v_new = A @ v
            v_new = utils.normalize(v_new)
            if np.all(np.abs(v_new - v) < 1e-8):
                break
            v = v_new
        e = single.rayleigh_quotient(A, v)

        # store eigenpair
        eigvecs[:, i] = np.array(v)
        eigvals[i] = e

    # sort by largest absolute eigenvalue
    if sort:
        idx = np.abs(eigvals).argsort()[::-1]
        eigvecs = eigvecs[:, idx]
        eigvals = eigvals[idx]

    return eigvals, eigvecs
Exemple #3
0
def power_iteration(A, max_iter=1000):
    """Finds the largest eigenpair of a symmetric matrix.

  Args:
    A: a square symmetric array of shape (N, N).

  Returns:
    e, v: eigenvalue and right eigenvector.
  """
    assert utils.is_symmetric(A), "[!] Matrix must be symmetric."
    v = np.random.randn(A.shape[0])
    for i in range(max_iter):
        v_new = A @ v
        v_new = utils.normalize(v_new)
        if np.all(np.abs(v_new - v) < 1e-8):
            break
        v = v_new
    e = rayleigh_quotient(A, v)
    return e, v
Exemple #4
0
def rayleigh_quotient_iteration(A, mu, max_iter=1000):
    """Finds an eigenpair closest to an initial eigenvalue guess.

  Args:
    A: a square symmetric array of shape (N, N).
    mu: an initial eigenvalue guess.

  Returns:
    e, v: eigenvalue and right eigenvector.
  """
    assert utils.is_symmetric(A), "[!] Matrix must be symmetric."
    v = np.random.randn(A.shape[0])
    for i in range(max_iter):
        v_new = solve(A - mu * np.eye(A.shape[0]), v)
        v_new = utils.normalize(v_new)
        if np.all(np.abs(v_new - v) < 1e-8):
            break
        v = v_new
        mu = rayleigh_quotient(A, v)
    return mu, v
Exemple #5
0
def inverse_iteration(A, max_iter=1000):
    """Finds the smallest eigenpair of a symmetric matrix.

  Args:
    A: a square symmetric array of shape (N, N).

  Returns:
    e, v: eigenvalue and right eigenvector.
  """
    assert utils.is_symmetric(A), "[!] Matrix must be symmetric."
    v = np.random.randn(A.shape[0])
    PLU = LU(A, pivoting='partial').decompose()
    for i in range(max_iter):
        v_new = solve(PLU, v)
        v_new = utils.normalize(v_new)
        if np.all(np.abs(v_new - v) < 1e-8):
            break
        v = v_new
    e = rayleigh_quotient(A, v)
    return e, v