Существует ли функция R для кодирования временных рядов в виде изображений с использованием метода граничных угловых полей (gaf / gasf)? - PullRequest
0 голосов
/ 13 мая 2019

Я хочу закодировать временные ряды в виде изображений с помощью метода градиентно-угловых полей (GAF) с целью применения сверточных нейронных сетей (CNN). Я не нашел функцию R, которая реализует это до сих пор.

Для Python я нашел следующее: https://github.com/pecu/Series2GAF

Я тоже пытался написать функцию, но не уверен, что она работает правильно. Это статья, предлагающая метод GAF: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=2ahUKEwjS5a2PxJjiAhUPIlAKHVj4BBMQFjAFegQIABAC&url=https%3A%2F%2Fwww.aaai.org%2Focs%2Findex.php%2FWS%2FAAAIW15%2Fpaper%2FviewFile%2F10179%2F10251&usg=AOvVaw0uFl_9ZuLwCRvF_BouOxnV

Вот мой код с примером значений временного ряда, хранящихся в x: х - это просто вектор с измеренными значениями, упорядоченными по дате, например,

library('tidyverse')
library('reshape2')
library('ggplot2')

x <- tibble(values = sin(-10:6))

Функция для копирования уравнений 1, 2 и 3 этой статьи:

gramian_angular_field_custom <- function(x){
  # Delete column names
  names(x) <- NULL

  # Convert to matrix
  x <- x %>% as.matrix()

  # Normalize
  x <- (x - max(x) + (x - min(x))) / (max(x) -min(x))
  x <- x %>% as.matrix()

  # Calculate phi for polar coordinates
  x <- x %>%
    as_tibble() %>%
    mutate(V1 = acos(V1)) %>%
    as.matrix() %>%
    t()

  # Create matrix by column repeat
  x <- x %>%
    t() %>%
    as_tibble() %>%
    replicate(n = length(x), .) %>%
    bind_cols()

  # Calculate sum of phi
  x <- x + as_tibble(t(x))
  x <- x %>% as_tibble()

  # Calculate cosinus
  x <- x %>% cos()

  x <- x %>% as.matrix()
  colnames(x) <- NULL

  # convert matrix to tibble in long format
  x <- x %>% 
    melt() %>% 
    as_tibble()

  return(x)
}

А затем примените эту функцию и нанесите получившееся изображение:

x %>% 
  gramian_angular_field_custom() %>% 
  ggplot(aes(Var2, Var1)) +
  geom_raster(aes(fill = value)) +
  scale_fill_gradientn(colours = c('blue', 'green', 'yellow', 'red')) +
  theme(legend.position = "none",
        axis.title.x = element_blank(),
        axis.title.y = element_blank())

Полученное изображение не является осесимметричным диагонали, как должно быть, или я ошибаюсь? Любые предложения по математике оцениваются как подсказка для функции R, которая реализует это.

Большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...