注:行数,特征数 --> 样本数,序列长度(窗口长度),特征数 --> 批次大小,序列长度,特征数
一、时间步长(seq_len)和批次大小(batch_size)
批次大小(batch_size)和时间步长(seq_len)并不是直接通过拆分一个长时间序列来得到的,它们描述的是训练过程中的两个独立的维度,通常分别由不同的因素决定。
-
批次大小(batch_size):
- 含义:批次大小表示在一个训练步骤中并行处理多少个样本。假设批次大小为 32,那么在每个训练步骤中,神经网络会同时处理 32 个独立的样本。
- 来源:批次大小通常是由用户设定的超参数,与模型的训练过程和硬件资源(如 GPU 内存)等因素相关。选择合适的批次大小有时需要在训练效率和内存限制之间进行权衡。
-
时间步长(seq_len):
- 含义:时间步长表示每个样本的时间序列长度,或者说每个样本在时间维度上有多少个时间步。假设时间步长为 50,则每个样本包含 50 个时间步的数据,每个时间步通常有一些特征。
- 来源:时间步长通常由数据本身决定,或者是根据实际问题的需求来设定。如果输入的数据是一个连续的时间序列(如股票价格、气象数据等),那么时间步长通常代表该时间序列的长度。时间步长可以是固定的,也可以根据实际情况进行切割或滑动窗口处理。
批次大小与时间步长之间的关系
它们是两种不同的维度,没有直接的映射关系:
- 批次大小是批量处理的样本数(例如一次处理 32 个样本),与每个样本的时间序列长度无关。
- 时间步长是每个样本的时间序列长度(例如每个样本有 50 个时间步),与样本之间的并行处理没有关系。
时间序列拆分:
- 如果你的数据非常长(例如超过了内存处理能力),你可能会选择将一个长时间序列分成多个较小的片段(每个片段的长度为 seq_len)。但这与批次大小无关。批次大小只是决定每次训练过程中同时使用多少个这样的时间序列样本。
举例说明:
假设我们有 1000 个时间序列,每个时间序列包含 100 个时间步,且每个时间步有 10 个特征。
- 如果我们选择 批次大小 = 32 和 时间步长 = 50,那么每次训练中,我们将处理 32 个独立的样本,每个样本是一个 50 时间步长的时间序列。
- 训练过程中的每个训练步骤都会选择 32 个样本进行处理,它们每个的时间序列长度是 50 时间步。这个批次大小并不是通过拆分时间序列得到的,它是一次性处理的样本数。
如果你的原始时间序列有 100 个时间步,你可以选择将其拆分成多个 50 时间步长的片段(例如两个 50 时间步的片段),然后把这些片段按批次大小进行处理。
总结来说,批次大小是并行处理的样本数,而时间步长是每个样本的时间序列的长度,它们是独立设定的,互不依赖。
二、样本数(N)和时间步长(seq_len)
另外,样本数和时间步长是有关系的。具体来说,时间序列的拆分方式和时间步长(也就是你选择的“窗口大小”)密切相关,影响样本的数量。让我们通过以下的几个关键概念来理解这个关系。
1. 时间序列拆分:
假设你有一个很长的时间序列数据 T
,如果你按时间步长拆分成多个子序列或时间窗口,你会使用一个固定的窗口大小(时间步长)来创建样本。
-
时间步长:窗口的大小,指每个子序列包含的时间步数。例如,如果时间步长为 10,那么每个子序列会包含连续 10 个时间步的数据。
-
滑动窗口:可以是重叠的或不重叠的。滑动窗口方式通常是指窗口每次滑动一个时间步。
2. 样本数与时间步长的关系:
假设时间序列的总长度为 L
,时间步长(窗口大小)为 w
,如果你使用非重叠窗口来拆分时间序列样本,样本数 N
的计算方法如下:
-
如果不重叠的窗口:
你可以将时间序列分成 N = ⌊ L w ⌋ N = \left\lfloor \frac{L}{w} \right\rfloor N=⌊wL⌋个样本,其中每个样本大小是 ( w )。例如,如果
L = 1000
(总时间步长)且w = 100
(时间步长),那么你将获得大约 10 个样本(( N = 1000 / 100 = 10 ))。 -
如果是重叠窗口:
你可以选择窗口的步长(stride),通常步长为 1(表示每次滑动 1 个