python 如何相对于最后一个元素归一化tensorflow 时间序列中的数据

vd2z7a6w  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(113)

我试图遵循tensorflow的tutorial来进行时间序列预测,我有一些变化很大的温度数据,因此,我实际上并不想预测实际值,只想预测与最后一个元素相比变化了多少。
假设我有一个时间序列训练数据点类型(input,label):([8,7,5,9,11,10],[12]),我想将其转换为一个数据点,其中所有内容都由输入中的最后一个条目规范化。在这个具体的示例中,我希望数据点如下所示:([0.8、0.7、0.5、0.9、1.1、1.0]、[1.2])。
按照教程,我能够从固定间隔收集的原始温度数据创建窗口数据集。这将创建Tensor数据集,但不允许我修改这些Tensor中的值。因此,我不能在创建的数据集中循环所有窗口,然后通过除以输入数组中的最后一个值来归一化。此外,我不能在创建数据集之前规范化数据,因为我需要窗口结构。我如何以这种方式规范化每个窗口的数据?
我的猜测是,它需要在数据集和窗口创建之后才能完成。因此,在这个函数的某个地方,可能是:

def make_dataset(self, data):
    data = np.array(data, dtype=np.float32)
    ds = tf.keras.utils.timeseries_dataset_from_array(
        data=data,
        targets=None,
        sequence_length=self.total_window_size,
        sequence_stride=1,
        shuffle=True,
        batch_size=32,)

    ds = ds.map(self.split_window)

    return ds
zzlelutf

zzlelutf1#

一种方法是使用一个数据生成器,你可以在里面实现你想要的逻辑,比如除以每一批中最大的输入,下面是一个如何实现的例子:

import numpy as np
my_array = np.arange(1024)

def generate_sequence(generate_data,batch_size=16,sequence_length=8):
    list_of_x = []
    list_of_y = []
    while True:
        for i in range(len(generate_data)//sequence_length):
            born_inf = i * sequence_length
            born_sup = (i+1) * sequence_length
            current_data = generate_data[born_inf:born_sup]
            max_n = np.max(current_data)
            list_of_x.append(current_data/max_n)
            list_of_y.append(generate_data[min(born_sup+1,len(generate_data)-1)]/max_n)
            print(list_of_x)
            print(list_of_y)
        if len(list_of_x) == batch_size:
            yield np.array(list_of_x),np.array(list_of_y)
            list_of_x = []
            lst_of_y = []

相关问题