R / Python - для оператора цикла для тригонометрической формулы - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над модулем оценки, где мы вычисляем изменения сезонности и прогнозируем.Ранее для оценки мы использовали фиксированные синусоидальные функции 5-го порядка.Формула была следующей:

doy_seasonality = exp(z[1]*sin(2*pi*doy/365)+z[2]*cos(2*pi*doy/365)
                       +z[3]*sin(4*pi*doy/365)+ z[4]*cos(4*pi*doy/365)
                       +z[5]*sin(6*pi*doy/365)+ z[6]*cos(6*pi*doy/365)
                       +z[7]*sin(8*pi*doy/365)+ z[8]*cos(8*pi*doy/365)
                       + z[9]*sin(10*pi*doy/365)+ z[10]*cos(10*pi*doy/365))

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

Например, в моем текущем наборе данных у меня есть следующий массив заказов.

order_FFT = [2, 6, 10, 24],, такой, что

order_FFT[0] = 2
order_FFT[1] = 6
order_FFT[2] = 10
order_FFT[3] = 24

Здесь будет 4 заказа.С некоторым другим набором данных может быть более или менее нет.заказов.Поэтому мне нужно определить цикл for, чтобы формула была изменена.

С моим текущим набором данных и соответствующим массивом orders_FFT цикл for должен выполнить следующую формулу:

doy_seasonality = exp(z[1]*sin(2*pi*doy/365)+z[2]*cos(2*pi*doy/365)
                       +z[3]*sin(6*pi*doy/365)+ z[4]*cos(6*pi*doy/365)
                       +z[5]*sin(10*pi*doy/365)+ z[6]*cos(10*pi*doy/365)
                       +z[7]*sin(24*pi*doy/365)+ z[8]*cos(24*pi*doy/365)

, котораяв основном означает

doy_seasonality = exp(z[1]*sin(order_FFT[0]*pi*doy/365)+z[2]*cos(order_FFT[0]*pi*doy/365)
                       +z[3]*sin(order_FFT[1]*pi*doy/365)+ z[4]*cos(order_FFT[1]*pi*doy/365)
                       +z[5]*sin(order_FFT[2]*pi*doy/365)+ z[6]*cos(order_FFT[2]*pi*doy/365)
                       +z[7]*sin(order_FFT[3]*pi*doy/365)+ z[8]*cos(order_FFT[3]*pi*doy/365)

Я в растерянности, пытаясь выяснить код цикла for для этого.Извините, что я не могу показать свои усилия здесь.

1 Ответ

0 голосов
/ 06 декабря 2018

Я бы не использовал цикл.Вот подход R:

#Some test data
set.seed(42)
z <- rnorm(8)
doy <- 1:365
order_FFT <- c(2, 6, 10, 24)

#separate coefficients for sin and cos in two rows:
z <- matrix(z, nrow = 2)
#calculate the sins and cosins:
sins <- outer(doy, order_FFT, function(x, y) sin(x * pi * y / 365))
cosins <- outer(doy, order_FFT, function(x, y) cos(x * pi * y / 365))
#use matrix products to multiply and sum
doy_seasonality2 <- c(exp(sins %*% z[1,] + cosins %*% z[2,]))

Дает ли он тот же результат?

doy_seasonality = exp(z[1]*sin(2*pi*doy/365)+z[2]*cos(2*pi*doy/365)
                      +z[3]*sin(6*pi*doy/365)+ z[4]*cos(6*pi*doy/365)
                      +z[5]*sin(10*pi*doy/365)+ z[6]*cos(10*pi*doy/365)
                      +z[7]*sin(24*pi*doy/365)+ z[8]*cos(24*pi*doy/365))
all.equal(doy_seasonality, doy_seasonality2)
#[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...