[파이톤] 레이먼 다면체의 멍에 사다리법
동시에 파이톤의 실현에 대한 소개입니다.
대상 문제
레이먼 달러\mathcal{M}의 무제약 최적화 문제
$$\mathop{\text{minimize}}_{x\in\mathcal M}\quad f(x)$$
여기서 $f:\mathcal M\to\mathbR은 매끄러운 매핑입니다.
수공간 공멍 사다리법
공멍 사다리법의 알고리즘은 다음과 같다.
공멍 사다리법의 알고리즘은 다음과 같다.
달러로 검색 방향 초기화
레이먼 다면체의 멍에 사다리법
리먼 다면체의 경우 공멍 사다리법의 알고리즘, Absil 등 다양체에 최적화된 책'Optimization Algorithms on Matrix Manifolds'에 소개됐다.
다음은 각각의 해설.
레만도르양의 체내적
레이먼에서 $\mathcal M달러를 다양화하고, 레이먼의 도량에 따라 어떤 점$x\in\mathcal M달러의 접촉 공간$T$\langle\cdot,\cdot\rangele결정했어.
레이먼 다면체의 사다리
$\mathcal M=\mathbR^n 달러의 경사도는
$$\nabla f(x) :=\left(\frac{\partial f}{\partial x_1}(x),\frac{\partial f}{\partial x_2}(x),\ldots,\frac{\partial f}{\partial x_n}(x)\right)^\top$$
이때 사다리와 방향 도수 사이에서
$$\mathop{\mathrm D}f(x)[d] :=\frac{\mathrm d}{\mathrm dt}f(x+td) =\nabla f(x)^\top d$$
관계를 맺다.
레이먼 다면체\mathcal M 달러 상한선 $f 달러의 방향도수, $\gamma(0)=x달러와 $\dot\gamma(0)=d달러의 곡선 $\gamma:\mathbR\to\mathcal M 달러 사용
$$\mathop{\mathrm D}f(x)[d] :=\frac{\mathrm d}{\mathrm dt}f(\gamma(t))$$
이 방향의 미분으로 함수 $f$\mathop{mathrm{grad}의 레이먼 다면체의 사다리를 계산할 수 있습니다
$$\mathop{\mathrm{D}} f(x)[d] =\langle\mathop{\mathrm{grad}} f(x), d\rangle_x$$
전체 버전 보기상원으로 정의하다.
복제하다
레이먼 변형 $\mathcal M의 변수 업데이트 공식에서 $x^k\in\mathcal M$d^k\in T{x^k}\mathcal M달러, 소속 공간이 다르기 때문에 단순히 $x^{k+1}=x^k+t업데이트할 수 없습니다.
따라서 자연의 확장으로 리만 다양성의 직선(가속도 0)을 따라 지선을 갱신하는 것을 고려할 수 있다.
$$x^{k+1}=\gamma(t_k;x^k,d^k)=:\exp_{x^k}(t_kd^k)$$
여기서 $\exp:T\mathcal M\to\mathcal M은 지수 매핑이라고 합니다.
레이먼 다면체의 최적화 분야에서 지수영사를 사용하면 더욱 일반화된 굴절영사라고 불린다.
$$x^{k+1}=R_{x^k}(t_kd^k)$$
변수를 업데이트합니다.
벡터 수송
공멍 사다리법의 탐색 방향을 레이먼 다면체로 확장하기 $\mathcal M 시 그대로 유지
$$d^{k+1}=−\mathop{\mathrm{grad}} f(x^{k+1})+\beta_kd^k$$
$mathop{\mathrm{grad}f(x^{k+1})\in T{x^{k+1}\mathcal M달러 및 $d^k\in T{x^k}\mathcal M달러가 속한 접촉 공간이 다르기 때문이다.
그래서 자연의 확장으로{x^k}\mathcal M$T{x^{k+1}\mathcal M달러와 평행으로 이동합니다. 여기서 말하는 평행은 어떤 곡선 (예를 들어 측지선 $\gamma (t; x^k, d^k) $) 을 따라 벡터장이 평행하는 것을 말합니다.
레이먼 다면체의 최적화 영역에서 평행운동은 벡터 전송의 보다 일반화된 매핑 $\mathcal T,
$$d^{k+1}=−\mathop{\mathrm{grad}} f(x^{k+1})+\beta_k\mathcal T_{t_kd^k}(d^k)$$
구문을 사용합니다.{eta x} $T$x\mathcal M$\xi 조인트 벡터x$T{R x (\eta x)} $\mathcalT 이상{eta x} {\xi x} 달러에 비추어 다음과 같은 두 가지 조건을 만족시킨다.
파이톤에서의 실현
Python에서 Pymanopt라는 레이먼 다면체의 최적화 구해기를 실현했다.
사용 예
문제.
다음 Brockett cost function의 최소화를 고려합니다.\begin{align}
\mathop{\mathrm{minimize}}_{X\in \mathbb R^{n \times r}} &\quad f(X) :=\mathop{\mathrm{tr}}\left(X^\top A X N\right)\\
\text{subject to} &\quad X^\top X = I_r
\end{align}
여기, $A\in\mathb{R}^{n\timesn}은 대칭 행렬이고, $N\in theb{R}^{timesr}는 양수 대각 행렬 $N=\mathop{mathrm{diag}(\mu 1,\mu 2,\ldots,\mu r)$1\leq\mu_2\leq\dots\leq\mu_적합한 솔루션 찾기$A$A의 작은 순서에 따라 $r$개의 특징 값에 대응하는 고유 벡터를 배열하는 행렬입니다.
$$\nabla f(X) = 2AXN$$
계산하다.
이 최적화 문제는 슈티펠 다면체입니다.\mathop{\mathrm{St}}(n, r) := \left\{X\in\mathbb{R}^{n\times r} \mid X^\top X = I_r\right\}
위의 무제약 최적화 문제\mathop{\mathrm{minimize}}_{X \in \mathop{\mathrm{St}}(n, r)} \quad f(X)
로 변환할 수 있습니다.
실행 예
대칭 행렬 $A$A는 다음과 같이 생성됩니다.import numpy as np
n = 10
r = 3
np.random.seed(0)
A = np.random.randn(n, n)
A = 0.5 * (A + A.T)
pymanopt.solvers.conjugate_gradient.ConjugateGradient
를 사용하려면 설정pymanopt.solvers.conjugate_gradient.ConjugateGradient
이 필요합니다. 설정 방법은 pymanopt.core.problem.Problem에 기재되어 있으며, 이번에도 파이톤 함수로 목적 함수와 사다리(유클리드 공간)를 지정하는 방법으로내부가 유클리드 공간의 사다리 $\nablaf$\mathop{mathrm{grad}에서 슈티펠 다면체의 사다리 $\mathop{mathrm{grad}로 변환되었습니다.class Brockett:
def __init__(self, A: np.ndarray, r: int):
if A.ndim != 2:
raise ValueError(f'Expected 2D array, got {A.ndim}D array instead.')
self.A = A
r = np.minimum(r, A.shape[0])
self.N = np.arange(1, r + 1) / r
def cost(self, X: np.ndarray) -> float:
return np.sum((self.A @ X) * (X * self.N))
def egrad(self, X: np.ndarray) -> np.ndarray:
return 2 * self.A @ X * self.N
위에서 정의한 Brockett cost function의 클래스를 사용하여 Pymanopt의Problem
를 다음과 같이 설정합니다.from pymanopt import Problem
from pymanopt.manifolds import Stiefel
brockett = Brockett(A=A, r=r)
stiefel = Stiefel(n, r)
prob = Problem(manifold=stiefel, cost=brockett.cost, egrad=brockett.egrad)
ConjugateGradient
에서 $\beta의 종류를 지정할 수 있습니다. 이번에는 beta_type=0
(Fletcher-Reeves)를 사용했습니다. 또한 solve
함수에서는 문제 외에 초기점을 지정할 수 있습니다.0=(I r, O)^\top 달러를 초기 매트릭스로 사용합니다.from pymanopt.solvers import ConjugateGradient
X0 = np.eye(n, r)
solver = ConjugateGradient(beta_type=0)
Xopt = solver.solve(prob, x=X0)
얻은 해의 정확성은 numpy.linalg.eigh
의 결과와 비교하여 확인한다._, V = np.linalg.eigh(A)
print(np.sum(Xopt * V[:, :r][:, ::-1], axis=0)) # [1. 1. 1.]
참고 문헌
\begin{align}
\mathop{\mathrm{minimize}}_{X\in \mathbb R^{n \times r}} &\quad f(X) :=\mathop{\mathrm{tr}}\left(X^\top A X N\right)\\
\text{subject to} &\quad X^\top X = I_r
\end{align}
\mathop{\mathrm{St}}(n, r) := \left\{X\in\mathbb{R}^{n\times r} \mid X^\top X = I_r\right\}
\mathop{\mathrm{minimize}}_{X \in \mathop{\mathrm{St}}(n, r)} \quad f(X)
import numpy as np
n = 10
r = 3
np.random.seed(0)
A = np.random.randn(n, n)
A = 0.5 * (A + A.T)
class Brockett:
def __init__(self, A: np.ndarray, r: int):
if A.ndim != 2:
raise ValueError(f'Expected 2D array, got {A.ndim}D array instead.')
self.A = A
r = np.minimum(r, A.shape[0])
self.N = np.arange(1, r + 1) / r
def cost(self, X: np.ndarray) -> float:
return np.sum((self.A @ X) * (X * self.N))
def egrad(self, X: np.ndarray) -> np.ndarray:
return 2 * self.A @ X * self.N
from pymanopt import Problem
from pymanopt.manifolds import Stiefel
brockett = Brockett(A=A, r=r)
stiefel = Stiefel(n, r)
prob = Problem(manifold=stiefel, cost=brockett.cost, egrad=brockett.egrad)
from pymanopt.solvers import ConjugateGradient
X0 = np.eye(n, r)
solver = ConjugateGradient(beta_type=0)
Xopt = solver.solve(prob, x=X0)
_, V = np.linalg.eigh(A)
print(np.sum(Xopt * V[:, :r][:, ::-1], axis=0)) # [1. 1. 1.]
Reference
이 문제에 관하여([파이톤] 레이먼 다면체의 멍에 사다리법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Mrrmm252/items/d48a2eee45d046b707ee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)