> 技术文档 > 构建轨迹矩阵(Hankel / Toeplitz)详解_hankel矩阵

构建轨迹矩阵(Hankel / Toeplitz)详解_hankel矩阵


构建轨迹矩阵(Hankel / Toeplitz)详解

目录

  1. 概述
  2. 为什么要构建轨迹矩阵
  3. Hankel 矩阵与 Toeplitz 矩阵的定义
  4. 构建方法与数学公式
    1. 时间序列与窗口大小
    2. Hankel 型轨迹矩阵
    3. Toeplitz 型轨迹矩阵
    4. 行数与列数的计算
  5. 常见用途:SSA 轨迹矩阵
  6. 附录:示例代码与简要说明

概述

在时间序列分析中,构建轨迹矩阵(Trajectory/Embedding Matrix)是一种常用的技巧,用于将一维时间序列映射到高维空间,以便发掘其中潜在的结构、模式或周期性。它在许多算法(如 奇异谱分析,SSA)中扮演核心角色。在构建轨迹矩阵时,常见的做法是生成 Hankel 矩阵Toeplitz 矩阵,它们本质上都是嵌入时间序列数据的一种形状结构。


为什么要构建轨迹矩阵

  • 更好地捕捉时间相关性:一维序列可能难以直观揭示周期或趋势,而将其嵌入到二维矩阵后,可以用矩阵的行、列来表示局部时序信息,从而有利于后续进行奇异值分解(SVD)、特征提取等。
  • 降噪与特征重构:在轨迹矩阵上执行 SVD 时,可以在奇异值空间区分主要模式和噪声模式,再通过“截断重构”有效去噪。
  • 可视化:从二维角度观察原本一维的时间序列,常能提供新的视角。例如,观察矩阵秩与奇异值分布,可以推断时间序列的周期和趋势。

Hankel 矩阵与 Toeplitz 矩阵的定义

Hankel 矩阵

Hankel 矩阵的每条反对角线(从左下到右上)上的元素相同。换言之,对于一个 m×n m \\times n m×n 的 Hankel 矩阵 H H H,如果记 H(i,j) H(i, j) H(i,j) 为第 i i i 行、第 j j j 列的元素,则:
H ( i , j ) = H ( i + 1 , j − 1 ) , 满足  1 ≤ i < m ,   2 ≤ j ≤ n . H(i, j) = H(i+1, j-1), \\quad \\text{满足 } 1 \\leq i < m, \\, 2 \\leq j \\leq n. H(i,j)=H(i+1,j1),满足 1i<m,2jn.
Hankel 矩阵具有对角线上的元素值相等的特点。对于一个简单的 3×3 3 \\times 3 3×3 Hankel 矩阵例子:
H = ( h 1 h 2 h 3 h 2 h 3 h 4 h 3 h 4 h 5) H = \\begin{pmatrix} h_1 & h_2 & h_3 \\\\ h_2 & h_3 & h_4 \\\\ h_3 & h_4 & h_5 \\end{pmatrix} H= h1h2h3h2h3h4h3h4h5
可以看到,反对角线上的元素(例如 h 1 , h 2 , h 3 h_1, h_2, h_3 h1,h2,h3)是相同的。

Toeplitz 矩阵

Toeplitz 矩阵的每条主对角线(从左上到右下)上的元素相同。对于一个 m×n m \\times n m×n 的 Toeplitz 矩阵 T T T,如果记 T(i,j) T(i, j) T(i,j) 为第 i i i 行、第 j j j 列的元素,则:
T ( i , j ) = T ( i − 1 , j − 1 ) , 满足  2 ≤ i ≤ m ,   2 ≤ j ≤ n . T(i, j) = T(i-1, j-1), \\quad \\text{满足 } 2 \\leq i \\leq m, \\, 2 \\leq j \\leq n. T(i,j)=T(i1,j1),满足 2im,2jn.
例如, 3×3 3 \\times 3 3×3 的 Toeplitz 矩阵:
T = ( t 1 t 2 t 3 t 2 t 1 t 2 t 3 t 2 t 1) T = \\begin{pmatrix} t_1 & t_2 & t_3 \\\\ t_2 & t_1 & t_2 \\\\ t_3 & t_2 & t_1 \\end{pmatrix} T= t1t2t3t2t1t2t3t2t1
可以看到,主对角线上的元素(例如 t 1 , t 2 , t 3 t_1, t_2, t_3 t1,t2,t3)是相同的,而其他对角线上的元素则重复。


构建方法与数学公式

本节将结合时间序列的概念,介绍如何从一维数据中形成 Hankel/Toeplitz 型的轨迹矩阵。

1. 时间序列与窗口大小

给定一个长度为 N N N 的一维时间序列:
x 1 , x 2 , x 3 , ⋯   , x N . x_1, x_2, x_3, \\cdots, x_N. x1,x2,x3,,xN.
在构建轨迹矩阵时,需要设定一个 窗口大小(window size) M M M。这个窗口大小决定了矩阵的列数,每一列包含一个长度为 M M M 的序列切片。

2. Hankel 型轨迹矩阵

当我们采用 Hankel 结构 时,可以将轨迹矩阵定义为:
X H a n k e l= ( x 1 x 2 x 3 ⋯ x M x 2 x 3 x 4 ⋯ x M + 1 x 3 x 4 x 5 ⋯ x M + 2 ⋮ ⋮ ⋮ ⋱ ⋮ x L x L + 1 x L + 2 ⋯ x L + M − 1 ) , \\mathbf{X}_{Hankel} = \\begin{pmatrix} x_1 & x_2 & x_3 & \\cdots & x_M \\\\ x_2 & x_3 & x_4 & \\cdots & x_{M+1} \\\\ x_3 & x_4 & x_5 & \\cdots & x_{M+2} \\\\ \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\ x_L & x_{L+1} & x_{L+2} & \\cdots & x_{L+M-1} \\end{pmatrix}, XHankel= x1x2x3xLx2x3x4xL+1x3x4x5xL+2xMxM+1xM+2xL+M1 ,
其中 L=N−M+1 L = N - M + 1 L=NM+1,即矩阵的行数为 L L L

  • 第 1 行包含 x 1 , x 2 , … , x M x_1, x_2, \\dots, x_M x1,x2,,xM
  • 第 2 行包含 x 2 , x 3 , … , x M + 1 x_2, x_3, \\dots, x_{M+1} x2,x3,,xM+1
  • 以此类推,第 i i i 行包含 x i , x i + 1, … , x i + M − 1 x_i, x_{i+1}, \\dots, x_{i+M-1} xi,xi+1,,xi+M1
  • 总共有 L L L 行, M M M 列。

在这个矩阵中,每一条反对角线上的元素是相等的,例如:
{ x 1 , x 2 , x 3 , …   } , { x 2 , x 3 , x 4 , …   } , … \\{ x_1, x_2, x_3, \\dots \\}, \\{ x_2, x_3, x_4, \\dots \\}, \\dots {x1,x2,x3,},{x2,x3,x4,},
这符合 Hankel 矩阵的定义。

3. Toeplitz 型轨迹矩阵

如果想构造 Toeplitz 矩阵,可以让每一行的开头对齐时间序列中的某个固定位置。比如:
X T o e p l i t z= ( x 1 x 2 x 3 ⋯ x M x 2 x 3 x 4 ⋯ x M + 1 x 3 x 4 x 5 ⋯ x M + 2 ⋮ ⋮ ⋮ ⋱ ⋮ x L x L + 1 x L + 2 ⋯ x L + M − 1 ) \\mathbf{X}_{Toeplitz} = \\begin{pmatrix} x_1 & x_2 & x_3 & \\cdots & x_M \\\\ x_2 & x_3 & x_4 & \\cdots & x_{M+1} \\\\ x_3 & x_4 & x_5 & \\cdots & x_{M+2} \\\\ \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\ x_L & x_{L+1} & x_{L+2} & \\cdots & x_{L+M-1} \\end{pmatrix} XToeplitz= x1x2x3xLx2x3x4xL+1x3x4x5xL+2xMxM+1xM+2xL+M1
与 Hankel 矩阵相似,但更强调的是如果把列下标向右下移动,同一个对角线就会保持相等。Toeplitz 结构在具体实现时,也是一种将“一维向量”映射到“二维矩阵”的常见形式。

4. 行数与列数的计算

给定时间序列长度 N N N 和窗口大小 M M M,则轨迹矩阵的行数 L L L 通常定义为:
L = N − M + 1. L = N - M + 1. L=NM+1.
最终形成的矩阵大小为:
L × M . L \\times M. L×M.
注意,当 M M M 较大时,能够在每一行包含更多的历史信息;但如果 M M M 太大,也会使矩阵行数 L L L 减少,从而影响分析的效果。实际中,选择 M M M 需要在保留信号特征与方便后续运算之间做平衡。


常见用途:SSA 轨迹矩阵

SSA(Singular Spectrum Analysis,奇异谱分析) 中,我们最常见的操作流程为:

  1. 构建 Hankel 轨迹矩阵;
  2. 对该矩阵进行奇异值分解;
  3. 选取前几个主要奇异值来重构;
  4. 将重构后的矩阵通过 Hankelization(对角平均)重新变成一个一维序列。

对于时间序列 x 1 , x 2 ,…, x N x_1, x_2, \\dots, x_N x1,x2,,xN 和选定的窗口大小 M M M,进行如下操作:
( x 1 x 2 x 3 ⋯ x M x 2 x 3 x 4 ⋯ x M + 1 ⋮ ⋮ ⋮ ⋱ ⋮ x L x L + 1 x L + 2 ⋯ x L + M − 1 ) ⏟ Hankel 矩阵  X \\underbrace{ \\begin{pmatrix} x_1 & x_2 & x_3 & \\cdots & x_M \\\\ x_2 & x_3 & x_4 & \\cdots & x_{M+1} \\\\ \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\ x_L & x_{L+1} & x_{L+2} & \\cdots & x_{L+M-1} \\end{pmatrix} }_{\\text{Hankel 矩阵 } X} Hankel 矩阵 X x1x2xLx2x3xL+1x3x4xL+2xMxM+1xL+M1
随后做奇异值分解 X=UΣ V T X = U \\Sigma V^T X=UΣVT,截断奇异值,重构子矩阵,再把子矩阵对角线元素进行求平均还原回一维信号。这样实现了去噪、趋势提取等功能。


附录:示例代码与简要说明

import numpy as npdef build_trajectory_matrix(signal, window_size): \"\"\" 构造 Hankel 型轨迹矩阵。 参数: ------- signal : ndarray 一维输入信号序列,长度为 N window_size : int 窗口大小,记为 M 返回: ------- traj_matrix : ndarray Hankel 型轨迹矩阵,维度为 (L, M),其中 L = N - M + 1 \"\"\" N = len(signal) M = window_size L = N - M + 1 # 预先创建一个二维数组,用于储存轨迹矩阵 traj_matrix = np.zeros((L, M)) # 按行填充:第 i 行对应原始序列的 x_i 到 x_(i+M-1) for i in range(L): traj_matrix[i, :] = signal[i : i + M] return traj_matrix# 简要测试if __name__ == \"__main__\": # 假设我们有一个简单的序列 x = np.arange(1, 11) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] M = 4 matrix = build_trajectory_matrix(x, M) print(\"原始序列:\", x) print(\"轨迹矩阵:\\n\", matrix)