我一直在使用Tensorflow.js构建一些简单的线性回归模型,处理各种类型的数据集。然而,现在我想看看我的数据集中日期和价格之间的关系是什么。
在之前的模型中,我会对价格或其他特征进行标准化处理,使张量表示为0到1之间的向量。
对于日期,应该如何进行这种处理,使第一个日期为0,最后一个日期为1?此外,我还需要在处理后对张量进行反标准化。
我可以使用像date.fns这样的库将日期转换为Unix时间戳…但我想知道是否有更简洁的方法来做这件事。
我的标准化和反标准化函数如下:
function normalise (tensor) { const min = tensor.min(); const max = tensor.max(); const normalisedTensor = tensor.sub(min).div(max.sub(min)) return { tensor : normalisedTensor, min, max } } function denormalise(tensor, min, max) { const denormalisedTensor = tensor.mul(max.sub(min)).add(min); return denormalisedTensor }
回答:
基本原则是,你需要将日期格式(如2021-03-21
)转换为数字,然后你就可以使用你已经拥有的标准化和反标准化函数了。在你的解决方案中,你已经这样做了,但是你可以用更简单的方式来编写。你可以使用date-fns
,但标准的JavaScript Date对象也足够了,所以我将使用它。
假设你的输入是一组日期字符串,如2021-05-01
,那么你可以这样做:
const dateStrings = ['2021-05-01', '2021-05-07', '2021-05-31'];const timestamps = dateStrings.map(dateString => new Date(dateString).valueOf());const unnormalisedTensor = tf.tensor1d(timestamps);
然后你可以使用你现有的函数进行标准化(和反标准化)。
你可以这样将时间戳转换回日期字符串:
const timestamps = await unnormalisedTensor.array();const dateStrings = timestamps.map(timestamp => new Date(timestamp).toISOString().substring(0,10));