ハンケル行列
📂行列代数 ハンケル行列 定義 H = [ h 11 h 12 h 13 ⋯ h 1 n h 21 h 22 h 23 ⋯ h 2 n h 31 h 32 h 33 ⋯ h 3 n ⋮ ⋮ ⋮ ⋱ ⋮ h m 1 h m 2 h m 3 ⋯ h m n ]
H = \begin{bmatrix}
h_{11} & h_{12} & h_{13} & \cdots & h_{1n}
\\ h_{21} & h_{22} & h_{23} & \cdots & h_{2n}
\\ h_{31} & h_{32} & h_{33} & \cdots & h_{3n}
\\ \vdots & \vdots & \vdots & \ddots & \vdots
\\ h_{m1} & h_{m2} & h_{m3} & \cdots & h_{mn}
\end{bmatrix}
H = h 11 h 21 h 31 ⋮ h m 1 h 12 h 22 h 32 ⋮ h m 2 h 13 h 23 h 33 ⋮ h m 3 ⋯ ⋯ ⋯ ⋱ ⋯ h 1 n h 2 n h 3 n ⋮ h mn
与えられた行列 H = ( h i j ) ∈ R m × n H = \left( h_{ij} \right) \in \mathbb{R}^{m \times n} H = ( h ij ) ∈ R m × n が全ての k = 2 , 3 , ⋯ , m + n k = 2 , 3 , \cdots , m+n k = 2 , 3 , ⋯ , m + n に対して下記を満たすなら、ハンケル行列 Hankel matrix と言う。
i 1 + j 1 = k = i 2 + j 2 ⟹ h i 1 j 1 = h i 2 j 2
i_{1} + j_{1} = k = i_{2} + j_{2} \implies h_{i_{1} j_{1}} = h_{i_{2} j_{2}}
i 1 + j 1 = k = i 2 + j 2 ⟹ h i 1 j 1 = h i 2 j 2
つまり、ハンケル行列とは、反対角線上の要素が全て同じ行列のことだ。
H = [ h 2 h 3 h 4 ⋯ h 1 + n h 3 h 4 h 5 ⋯ h 2 + n h 4 h 5 h 6 ⋯ h 3 + n ⋮ ⋮ ⋮ ⋱ ⋮ h m + 1 h m + 2 h m + 3 ⋯ h m + n ]
H = \begin{bmatrix}
h_{2} & h_{3} & h_{4} & \cdots & h_{1+n}
\\ h_{3} & h_{4} & h_{5} & \cdots & h_{2+n}
\\ h_{4} & h_{5} & h_{6} & \cdots & h_{3+n}
\\ \vdots & \vdots & \vdots & \ddots & \vdots
\\ h_{m+1} & h_{m+2} & h_{m+3} & \cdots & h_{m+n}
\end{bmatrix}
H = h 2 h 3 h 4 ⋮ h m + 1 h 3 h 4 h 5 ⋮ h m + 2 h 4 h 5 h 6 ⋮ h m + 3 ⋯ ⋯ ⋯ ⋱ ⋯ h 1 + n h 2 + n h 3 + n ⋮ h m + n
説明 ハンケル行列 が 正方行列 なら、H = H T H = H^{T} H = H T のため対称行列 であり、対角行列 もハンケル行列である。
ハンケル行列分析 H = [ y 1 y 2 y 3 ⋯ y q y 2 y 3 y 4 ⋯ y q + 1 y 3 y 4 y 5 ⋯ y q + 2 ⋮ ⋮ ⋮ ⋱ ⋮ y p y p + 1 y q + 2 ⋯ y p + q ]
H = \begin{bmatrix}
y_{1} & y_{2} & y_{3} & \cdots & y_{q}
\\ y_{2} & y_{3} & y_{4} & \cdots & y_{q+1}
\\ y_{3} & y_{4} & y_{5} & \cdots & y_{q+2}
\\ \vdots & \vdots & \vdots & \ddots & \vdots
\\ y_{p} & y_{p+1} & y_{q+2} & \cdots & y_{p+q}
\end{bmatrix}
H = y 1 y 2 y 3 ⋮ y p y 2 y 3 y 4 ⋮ y p + 1 y 3 y 4 y 5 ⋮ y q + 2 ⋯ ⋯ ⋯ ⋱ ⋯ y q y q + 1 y q + 2 ⋮ y p + q
時系列データ に対して{ y t } t = 1 ( p + q ) \left\{ y_{t} \right\}_{t=1}^{(p+q)} { y t } t = 1 ( p + q ) のようなハンケル行列を構成し、その特異値分解
H = U Σ V T
H = U \Sigma V^{T}
H = U Σ V T
を見ると、U U U と V V V に階層的な分解が現れると言われている 。時系列データを行列にして分析するこの方法をハンケル行列分析 Hankel matrix analysis と言う。
コード 次は、ベクターを受け取ってハンケル行列を構成する関数をジュリア で書いたものだ。
function Hankelizer(vec)
@assert length(vec) % 2 == 1 "vector must have odd length"
m = (length(vec) ÷ 2 ) + 1
H = zeros(eltype(vec), m, m)
for i ∈ 1 :m, j ∈ 1 :m
H[i,j] = vec[i+j-1 ]
end
return H
end
elements = [8 ,2 ,0 ,6 ,5 ,1 ,5 ,4 ,0 ]
Hankelizer(elements)
function Hankelizer(vec, m, n)
@assert length(vec) == (m+n-1 ) "wrong dimensions"
H = zeros(eltype(vec), m, n)
for i ∈ 1 :m, j ∈ 1 :n
H[i,j] = vec[i+j-1 ]
end
return H
end
Hankelizer([elements; 1 ], 3 , 8 )
Hankelizer([elements; 1 ], 2 , 9 )