我一直在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
,但标准的JavaScriptDate对象也足够了,所以我将使用它。
假设您的输入是一个像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));
我通过使用date.fns将日期转换为时间戳,然后使用以下函数进行归一化来实现这一点
const getTimestamps = (data) => {
data.forEach(record => {
let newDate = record.time
newDate = new Date(newDate);
const timestamp = getUnixTime(newDate);
console.log(newDate, timestamp)
record.timestamp = timestamp
}