고유치로부터 고유 벡터를 구한다

7892 단어 Python3선형 대수
이제 화제의 고유치로부터 고유벡터를 구하는 논문을 구현해 보았다.
htps : // 아 rぃ v. rg/아bs/1908.03795

(Twitter상에서 R로 실장하고 있는 사람을 벌써 관측하고 있으므로, 아마 $N$ 번 달인 것이라는 것을 인지해 이 기사를 쓰고 있다)

정확하게는 $n$ 다음 Hermitian Matrix $A$ 에 대해 고유 벡터의 각 요소의 크기의 제곱을 구한다.
따라서, 복소수의 위상 성분은이 접근법에서 요구되지 않는다.
또한 Hermitian이 아닌 정방 행렬에이 기술을 적용해도 고유 벡터의 각 요소의 크기는 구할 수 없습니다.
(Hermitian의 고유 벡터는 직교한다는 성질을 증명에 사용하고 있기 때문에)

$A$ 의 $i$ 번째의 고유 벡터 $\mathbf{v}_i$ 와 고유치 $\lambda_i$ 로 정의한다.
또, $A$ 의 $j$ 행과 $j$ 열을 삭제한 행을 $M_j$ 라고 한다.
M_j = 
\left[ \begin{array}{ccc|ccc}
A_{1,1} &\cdots& A_{1,j-1} & A_{1,j+1} &\cdots& A_{1,n} \\
\vdots & \ddots & \vdots & \vdots & \ddots & \vdots \\
A_{j-1,1} &\cdots& A_{j-1,j-1} & A_{j-1,j+1} &\cdots& A_{j-1,n} \\ \hline
A_{j+1,1} &\cdots& A_{j+1,j-1} & A_{j+1,j+1} &\cdots& A_{j+1,n} \\
\vdots & \ddots & \vdots & \vdots & \ddots & \vdots \\
A_{n,1} &\cdots& A_{n,j-1} & A_{n,j+1} &\cdots& A_{n,n}
\end{array} \right]

$A_{i,j}$ 는 $A$ 의 $i$ 행 $j$ 번째 요소입니다.
또한 $M_j$의 $k$번째 고유값을 $\mu^{(j)}_k$ 로 정의한다.

그러면 $\mathbf{v}_i$ 의 $j$ 번째의 요소 $v_{i,j}$ 에 대해서, 다음과 같은 식이 성립한다(논문의 식(2)에 해당한다).
|v_{i,j}|^2 \prod_{k=1,k\neq i}^n (\lambda_i - \lambda_k)
= \prod_{k=1}^{n-1} (\lambda_i - \mu^{(j)}_k)

이 식을 사용하면, 고유치 $\lambda_i,\mu^{(j)}_k$ 로부터 고유 벡터의 각 요소의 크기의 제곱 $|v_{i,j}|^2$ 를 구한다.

이것을 Python3에서 구현해 보았습니다.
import numpy as np;
import matplotlib.pyplot as plt;


def calc_eigenvector (A, i):
    n,_ = A.shape;
    v = np.zeros ((n,1));   # 求める固有ベクトルの平方
    lams,_ = np.linalg.eig (A);

    for j in range (n):
        x = [xx for xx in range (n)];
        x.remove (j);
        Mj = A[:,x][x,:];
        muj, _ = np.linalg.eig (Mj);

        numerator = (lams[i] - muj).prod ();
        denominator = np.delete (lams[i]-lams, i).prod ();

        v[j,0] = numerator / denominator;

    return v;

N = 10;
A = np.random.randn (N,N);
A = A + A.T;
_, vs = np.linalg.eig (A);

plt.figure ();
plt.plot([0,1],[0,1]);
v_t = vs[:,0];
v_c = calc_eigenvector (A,0);

plt.scatter (v_t**2, v_c);
plt.show ();

calc_eigenvector는 이전 수식을 기반으로 고유 벡터를 찾는 함수입니다.
이것을 실행한다.

가로축이 numpy.linalg.eig 에서 구한 0번째의 고유 벡터의 각 요소의 크기의 제곱,
세로축이 함수로 구한 결과.
$y=x$ 의 직선상에 제대로 타고 있다. 대단해.

모든 고유치로 한 것은 아래 그림과 같다.

이것도 제대로 $y=x$를 타고 있는 것을 확인할 수 있었다.

좋은 웹페이지 즐겨찾기