Контролируемый выбор функций на основе множественного внимания в многомерных временных рядах

Я работал над проблемой многомерных временных рядов. Набор данных содержит не менее 40 различных факторов. Я пытался выбрать только подходящие функции перед обучением модели. Я наткнулся на документ под названием «Метод контролируемого выбора признаков на основе многостороннего внимания для многомерных временных рядов».

Документ выглядит многообещающе, однако я не смог найти его реализацию. Я хотел бы знать, сталкивался ли кто-нибудь с подобной статьей и знает, как реализовать архитектуру в статье?

Если нет, я хочу знать альтернативные методы, чтобы найти только подходящие функции для моего многомерного временного ряда перед обучением модели.

1 ответ

Я считаю, что правильно реализовал эту статью. Код для него приведен ниже:

      import numpy as np
import tensorflow as tf
from keras import backend as K

from keras import backend as K

class MTSAttention(tf.keras.layers.Layer):
    def __init__(self, units=128, **kwargs):
        super(MTSAttention, self).__init__(**kwargs)
        self.attention_T = None
        self.attention_V = None
        self.dense_E_AoT = None
        self.dense_U_AoT = None
        self.dense_E_AoV = None
        self.dense_U_AoV = None
        self.units = units

    def get_config(self):
        config = super().get_config()
        config['dense_E_AoT'] = self.dense_E_AoT
        config['dense_U_AoT'] = self.dense_U_AoT
        config['dense_E_AoV'] = self.dense_E_AoV
        config['dense_U_AoV'] = self.dense_U_AoV
        config['units'] = self.units
        return config

    def build(self, input_shape):
        reduction_size_shape_AoT = int(input_shape[-1] * .4)
        reduction_size_shape_AoV = int(input_shape[1] * .6)

        self.dense_E_AoT = tf.keras.layers.Dense(reduction_size_shape_AoT, trainable=True, activation='tanh', use_bias=True,
                                                 name='dense_E_AoT')
        self.dense_U_AoT = tf.keras.layers.Dense(input_shape[-1], trainable=True, use_bias=True, name='dense_U_AoT')

        self.dense_E_AoV = tf.keras.layers.Dense(reduction_size_shape_AoV, trainable=True, activation='tanh', use_bias=True,
                                                 name='dense_E_AoV')
        self.dense_U_AoV = tf.keras.layers.Dense(input_shape[1], trainable=True, use_bias=True, name='dense_U_AoV')

        super(MTSAttention, self).build(input_shape)

    def AoT_AoV(self, data):
        AoT = data
        p_AoT = self.dense_E_AoT(AoT)
        n_AoT = self.dense_U_AoT(p_AoT)
        temporal_attention = K.softmax(n_AoT, axis=-2)

        AoV = tf.transpose(data, [0, 2, 1])
        p_AoV = self.dense_E_AoV(AoV)
        n_AoV = self.dense_U_AoV(p_AoV)
        variable_attention = K.softmax(n_AoV, axis=-2)

        global_weight_generation = tf.matmul(temporal_attention, variable_attention)

        weighted_data = tf.matmul(global_weight_generation, data)

        return weighted_data, global_weight_generation

    def get_config(self):
        """
        Returns the config of a the layer. This is used for saving and loading from a model
        :return: python dictionary with specs to rebuild layer
        """
        config = super(MTSAttention, self).get_config()
        config.update({'units': self.units})
        return config

    def call(self, x):
        return self.AoT_AoV(x)