如何标准化 Tensorflow.js 中的日期?
How do I normalise dates in Tensorflow.js?
我一直在 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
}
我通过使用 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
}
基本原理是你需要将日期格式(如2021-03-21
)转换为数字,然后你可以使用你已有的规范化和反规范化功能。在您的解决方案中,您已经做到了这一点,但是,您可以用更简单的方式编写它。您可以使用 date-fns
,但标准 JavaScript Date object 也足够,所以我将使用它。
假设您的输入是日期字符串数组,如 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));
我一直在 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
}
我通过使用 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
}
基本原理是你需要将日期格式(如2021-03-21
)转换为数字,然后你可以使用你已有的规范化和反规范化功能。在您的解决方案中,您已经做到了这一点,但是,您可以用更简单的方式编写它。您可以使用 date-fns
,但标准 JavaScript Date object 也足够,所以我将使用它。
假设您的输入是日期字符串数组,如 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));