时序数据采样理解及实现

ryluo 2020-06-14 01:29:22
时序数据

随机采样与相邻采样的理解及实现,主要是便于自己理解

时序数据采样理解及实现

时序数据采样主要分为随机采样和相邻采样,下面主要是总结这两种方法的思路和实现方法。

评论图片

随机采样

在进行随机采样之前,首先需要深刻理解时序数据,时序数据的每个样本是一个序列,所以在构建数据的时候应该从最小的单元一直往大单元考虑。

# 基于mxnet的代码
def data_iter_random(corpus_indices, batch_size, num_steps, ctx=None):
    # 计算采样数据长度减一的原因是,最后一个字符应该用来构建标签,这是语言模型的性质
    num_examples = (len(corpus_indices) - 1) // num_steps
    epoch_size = num_examples // batch_size
    example_indices = list(range(num_examples))
    random.shuffle(example_indices) # 将索引打乱,之后采样就可以按循序进行采样了

    def _data(pos):
        return corpus_indices[pos: pos + num_steps]

    for i in range(epoch_size):
        # i从0开始,每次读取batch_size个数据
        i = i * batch_size
        batch_indices = example_indices[i: i + batch_size]
        X = [_data(j * num_steps) for j in batch_indices]
        Y = [_data(j * num_steps + 1) for j in batch_indices]
        yield nd.array(X, ctx=None), nd.array(Y, ctx=None)


相邻采样

因为相邻采样最主要的性质就是前后两次batch的数据是连续的,所以从图中也可以看出具体的采样方式,下列是具体的实现方法

# 基于mxnet的代码
def data_iter_consective(corpus_indices, batch_size, num_steps, ctx=None):
    corpus_indices = nd.array(corpus_indices)
    data_len = len(corpus_indices)
    batch_len = data_len // batch_size
    indice = corpus_indices[0: batch_size*batch_len].reshape(batch_size, batch_len)
    epoch_size = (batch_len - 1) // num_steps

    for i in range(epoch_size):
        i = i * num_steps
        X = indice[:, i: i + num_steps]
        Y = indice[:, i + 1: i + num_steps]
        yield X, Y

参考资料:《动手学深度学习》