Вони сильно пов’язані між собою. Ваш приклад не відтворюється, оскільки ви не включили свої дані, тому я зроблю нові. Перш за все, давайте створимо періодичну функцію:
T <- 10
omega <- 2*pi/T
N <- 21
x <- seq(0, T, len = N)
sum_sines_cosines <- function(x, omega){
sin(omega*x)+2*cos(2*omega*x)+3*sin(4*omega*x)+4*cos(4*omega*x)
}
Yper <- sum_sines_cosines(x, omega)
Yper[N]-Yper[1] # numerically 0
x2 <- seq(0, T, len = 1000)
Yper2 <- sum_sines_cosines(x2, omega)
plot(x2, Yper2, col = "red", type = "l", xlab = "x", ylab = "Y")
points(x, Yper)
Тепер давайте створимо основу Фур'є для регресії. Зауважте, що при не має сенсу створювати більше базових функцій , тобто непостійних синусів і косинусів, оскільки компоненти більш високої частоти заручені на такій сітці. Наприклад, синус частоти не відрізняється від костанта (синуса): розглянемо випадок , тобто . У будь-якому випадку, якщо ви хочете подвоїти перевірку, просто перейдіть на фрагмент нижче та подивіться на останні два стовпці: ви побачите, що вони насправді марні (і вони створюють проблеми для пристосування, оскільки матриця дизайну тепер є єдиною ).N=2k+1N−2N−3=2(k−1)kωN=3k=1N-2
N
# Fourier Regression with fda
library(fda)
mybasis <- create.fourier.basis(c(0,T),N-2)
basisMat <- eval.basis(x, mybasis)
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef)
Зауважимо, що частоти є саме правильними, але амплітуди ненульових компонентів немає (1,2,3,4). Причина полягає в тому, що fda
функції основи Фур'є масштабуються дивним чином: їх максимальне значення не дорівнює 1, як це було б для звичайної бази Фур'є . Це не , як це було б за ортонормальної основи Фур'є, .1,sinωx,cosωx,…1π√12π√,sinωxπ√,cosωxπ√,…
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Ви чітко бачите, що:
- максимальне значення менше1π√
- Основа Фур'є (прирізана до перших членів ) містить постійну функцію (чорна лінія), синуси зростаючої частоти (криві, які дорівнюють 0 на межі домену) і косинуси зростаючої частоти (криві, які дорівнює 1 на межах домену), як і належитьN−2
Просто масштабування бази Фур'є, задане методом fda
, щоб отримати звичайну основу Фур'є, призводить до коефіцієнтів регресії, що мають очікувані значення:
basisMat <- basisMat/max(abs(basisMat))
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef, names.arg = colnames(basisMat), main = "rescaled FDA coefficients")
Спробуємо fft
зараз: зауважимо, що оскільки Yper
це періодична послідовність, остання точка насправді не додає жодної інформації (DFT послідовності завжди є періодичною). Таким чином, ми можемо відкинути останню точку при обчисленні FFT. Крім того, FFT - це лише швидкий алгоритм числення для обчислення DFT, а DFT послідовності дійсних чи складних чисел є складним . Таким чином, ми дуже хочемо модулів коефіцієнтів FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Ми множимо на , щоб мати те саме масштабування, як і в основі Фур'є . Якби ми не масштабували, ми все одно відновимо правильні частоти, але амплітуди були би масштабовані одним і тим же фактором стосовно того, що ми виявили раніше. Давайте тепер побудуємо коефіцієнти fft:2N−11,sinωx,cosωx,…
fft_coef <- fft_coef[1:((N-1)/2)]
terms <- paste0("exp",seq(0,(N-1)/2-1))
barplot(fft_coef, names.arg = terms, main = "FFT coefficients")
Гаразд: частоти є правильними, але зауважте, що тепер базові функції вже не є синусами та косинусами (вони є складними експоненціалами , де з я позначаю уявну одиницю). Зауважимо також, що замість набору ненульових частот (1,2,3,4), як і раніше, ми отримали множину (1,2,5). Причина полягає в тому, що у цьому комплексному розширенні коефіцієнта (таким чином є складним) відповідає двом реальним у тригонометричне розширення бази, завдяки формулі Ейлера . Модуль комплексного коефіцієнта дорівнює сумі квадратури двох реальних коефіцієнтів, тобтоexpniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx 5=√|xn|=a2n+b2n−−−−−−√ . Власне кажучи, .5=33+42−−−−−−√