Są silnie powiązane. Twój przykład nie jest powtarzalny, ponieważ nie podałeś swoich danych, dlatego zrobię nowy. Po pierwsze, stwórzmy funkcję okresową:
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)
Teraz utwórzmy podstawę Fouriera dla regresji. Zauważ, że przy tak naprawdę nie ma sensu tworzyć więcej niż funkcji bazowych, tj. niesynchroniczne sinus i cosinus, ponieważ składniki o wyższej częstotliwości są aliasowane na takiej siatce. Na przykład sinus o częstotliwości jest nie do odróżnienia od costant (sinus): rozważ przypadek , tj. . W każdym razie, jeśli chcesz dwukrotnie sprawdzić, po prostu przejdź do fragmentu kodu poniżej i spójrz na dwie ostatnie kolumny: zobaczysz, że są one faktycznie bezużyteczne (i powodują problemy z dopasowaniem, ponieważ macierz projektowa jest teraz pojedyncza ).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)
Zauważ, że częstotliwości są dokładnie właściwe, ale amplitudy składników niezerowych nie są (1,2,3,4). Powodem jest to, że fda
funkcje podstawowe Fouriera są skalowane w dziwny sposób: ich maksymalna wartość nie wynosi 1, tak jak w przypadku zwykłej podstawy Fouriera . Nie jest to również , jak byłoby w przypadku ortonormalnej podstawy Fouriera, .1,sinωx,cosωx,…1π√12π√,sinωxπ√,cosωxπ√,…
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Wyraźnie widać, że:
- maksymalna wartość jest mniejsza niż1π√
- podstawa Fouriera (skrócona do pierwszych składników ) zawiera stałą funkcję (czarna linia), sinusy o rosnącej częstotliwości (krzywe, które są równe 0 na granicach domen) i cosinus o rosnącej częstotliwości (krzywe, które są równa 1 na granicach domeny), tak jak powinno byćN−2
Proste skalowanie podanej przez Fouriera podstawy Fouriera fda
, aby uzyskać zwykłą podstawę Fouriera, prowadzi do współczynników regresji o oczekiwanych wartościach:
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")
Spróbujmy fft
teraz: zwróć uwagę, że ponieważ Yper
jest to sekwencja okresowa, ostatni punkt tak naprawdę nie dodaje żadnych informacji (DFT sekwencji jest zawsze okresowa). W ten sposób możemy odrzucić ostatni punkt przy obliczaniu FFT. Ponadto FFT to szybki algorytm numeryczny do obliczania DFT, a DFT ciągu liczb rzeczywistych lub zespolonych jest złożony . Tak więc naprawdę chcemy modułów współczynników FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Mnożymy przez , aby uzyskać takie samo skalowanie jak w przypadku podstawy Fouriera . Gdybyśmy nie skalowali, nadal odzyskalibyśmy prawidłowe częstotliwości, ale wszystkie amplitudy byłyby skalowane o ten sam współczynnik w stosunku do tego, co znaleźliśmy wcześniej. Teraz wykreślmy współczynniki 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")
Ok: częstotliwości są poprawne, ale zauważ, że teraz podstawowymi funkcjami nie są już sinus i cosinus (są złożonymi wykładnikami , gdzie oznaczam jednostkę urojoną). Zauważ też, że zamiast zestawu niezerowych częstotliwości (1,2,3,4), jak poprzednio, otrzymaliśmy zestaw (1,2,5). Powodem jest to, że termin w tym złożonym rozwinięciu współczynnika (a więc jest złożony) odpowiada dwóm rzeczywistym warunkom w trygonometryczne rozszerzenie podstawy, ze względu na formułę Eulera . Moduł współczynnika zespolonego jest równy sumie kwadratury dwóch rzeczywistych współczynników, tj.expniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx 5=√|xn|=a2n+b2n−−−−−−√ . W rzeczywistości .5=33+42−−−−−−√