I want to find out if the autoregressive model goes out of control!
For example, today's $ ξ (t) $ is yesterday's $ ξ (t-1) $, the day before yesterday's $ ξ (t-2) $, and the day before yesterday's $ ξ (t-3) $. From $ u (t) $, suppose you have the following:
Expressing this as a matrix,
x(t)=
\begin{pmatrix}
-0.5&0.34&0.08\\
1&0&0\\
0&1&0
\end{pmatrix} \times
x(t-1)
It will be. Since then, this has been generalized
x(t)=Ax(t-1)
Handles.
x(t)=7x(t-1)
This is multiplied by 7 each time $ t $ grows, so
x(t)=7^tx(0)
Then, when $ t → ∞ $, it runs out of control because it is $ 7 ^ t → ∞ $. On the other hand, if the coefficient is $ 0.2 $, there is no runaway. This is easy, isn't it?
x(t)=
\begin{pmatrix}
5&0&0\\
0&-3&0\\
0&0&0.8
\end{pmatrix} \times
x(t-1)
In the case of, the power of the diagonal matrix only needs to be the power of the component as it is.
x(t)=
\begin{pmatrix}
5&0&0\\
0&-3&0\\
0&0&0.8
\end{pmatrix}^t
x(0)
Can be written.
If it is a non-diagonal matrix, it will be forcibly converted to a diagonal matrix. Bring some regular matrix $ P $ to the original variable $ x (t) $
x(t)=Py(t)
Let's think about how to convert to another variable with. At this time, how is $ x (t) = Ax (t-1) $ converted?
First, $ x (t) = Py (t) $
y(t)=P^{-1}x(t)=P^{-1}Ax(t-1)\\
=P^{-1}A(Py(t-1))=(P^{-1}AP)y(t-1)
If you put $ Λ = P ^ {-1} AP $,
y(t)=Λy(t-1)
Can be placed. If this $ Λ $ is a diagonal matrix,
y(t)=Λ^ty(0)
You can easily find $ y (t) $ with
x(t)=Py(t)=PΛty(0)=PΛ^tP^{-1}x(0)
I was happy to find x as well.
This procedure "bringing a convenient $ P $ and making $ P ^ {-1} AP $ a diagonal matrix" is called diagonalization.
What i want to do
P^{-1}AP≡Λ=diag(λ_1,...,λ_n)
Is to find $ P $ like. In general, for the square matrix $ A $
Ap=λp\\
p≠o
The number $ λ $ and the vector $ p $ that satisfy the conditions are called eigenvalues and eigenvectors, respectively.
You can easily calculate by making full use of the function of Numpy. Let's calculate with the following matrix.
A=
\begin{pmatrix}
5&3&4\\
6&8&-8\\
6&9&-9
\end{pmatrix}
import numpy as np
def get_eigenpairs(arr):
#np.linalg.eig outputs an eigenvalue in the first argument and an eigenvector in the second argument
w, v = np.linalg.eig(arr)
eigenpairs = []
#Because v is standardized to 1. I'm not sure if this is the case.
#Therefore, the numerical value is restored by dividing by the minimum value excluding 0 in each column.
for i, val in enumerate(w):
vec = v[:, i] / np.min(np.abs(v[:, i][v[:, i] != 0]))
eigenpairs.append((val, vec))
eigenpairs.sort(key=lambda x:x[0])
return eigenpairs
A = np.array([[5,3,-4],[6,8,-8],[6,9,-9]])
get_eigenpairs(A)
#array([[-1.0, array([1., 2., 3.])],
# [2.0, array([-1., -3., -3.])],
# [3.0, array([1., 2., 2.])]], dtype=object)
We got 3 eigenvectors. These correspond to the eigenvalues $ -1, 2, 3 $, respectively. So I put three eigenvectors side by side
P=
\begin{pmatrix}
1&-1&1\\
2&-3&2\\
3&-3&2
\end{pmatrix}
Let's check if $ P ^ {-1} AP $ is a diagonal matrix.
P = np.empty((3,3))
#Store 3 eigenvectors in a 3x3 matrix
for i,val in enumerate(get_eigenpairs(a)):
P[i] = val[1]
np.rint(np.dot(np.dot(np.linalg.inv(P.T),a),P.T))
#array([[-1., 0., 0.],
# [ 0., 2., -0.],
# [ 0., 0., 3.]])
It was confirmed that $ P ^ {-1} AP = diag (-1,2,3) $ was successfully obtained. Now you can easily find out about the runaway of the autoregressive model.