Bunlar güçlü bir şekilde ilişkilidir. Örneğiniz tekrarlanamaz çünkü verilerinizi eklemediniz, bu yüzden yeni bir tane yapacağım. Her şeyden önce, periyodik bir fonksiyon oluşturalım:
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)
Şimdi regresyon için bir Fourier temeli oluşturalım. Dikkate alınmalıdır ki, birlikte , gerçekten anlamda daha fazlasını oluşturmak için yapmaz , baz fonksiyonları, yani sabit olmayan sinüs ve kosinüs, çünkü yüksek frekans bileşenleri böyle bir ızgarada takma addır. Örneğin, frekansının bir sinüsü bir kostandan (sinüs) ayırt edilemez: , yani örneğini düşünün . Eğer iki kez kontrol etmek istiyorsanız, yine de, sadece değiştirmek için son iki sütunda aşağıda pasajı ve görünüm: Eğer aslında yararsız olduğunu göreceksiniz (ve tasarım matrisi şimdi tekil çünkü onlar, oturması için sorunları oluşturabilir ).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)
Frekansların tam olarak doğru olduğunu, ancak sıfır olmayan bileşenlerin genliklerinin (1,2,3,4) olmadığını unutmayın. Bunun nedeni, fda
Fourier temel işlevlerinin garip bir şekilde ölçeklendirilmesidir: maksimum değerleri 1 değildir, olağan Fourier temeli . O değil ya da ortonormal Fourier bazında için olurdu gibi .1,sinωx,cosωx,…1π√12π√,sinωxπ√,cosωxπ√,…
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Bunu açıkça görüyorsunuz:
- maksimum değer değerinden küçük1π√
- Fourier temeli (ilk terimleriyle kesilmiş ) sabit bir fonksiyon (siyah çizgi), artan frekans sinüsleri (alan sınırlarında 0'a eşit olan eğriler) ve artan frekansın kosinüslerini ( alan sınırlarında 1'e eşittir)N−2
Basitçe verilen Fourier tabanının ölçeklendirilmesi fda
, böylece olağan Fourier tabanının elde edilmesi, beklenen değerlere sahip regresyon katsayılarına yol açar:
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")
Şimdi deneyelim fft
: Yper
periyodik bir dizi olduğu için, son noktanın gerçekten herhangi bir bilgi eklemediğine dikkat edin (bir dizinin DFT'si her zaman periyodiktir). Böylece FFT'yi hesaplarken son noktayı atabiliriz. Ayrıca, FFT, DFT'yi hesaplamak için sadece hızlı bir sayısal algoritmadır ve bir dizi gerçek veya karmaşık sayının DFT'si karmaşıktır . Bu nedenle, FFT katsayılarının modüllerini gerçekten istiyoruz:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
İle çarpınız Biz Fourier bazında olduğu gibi aynı ölçeğe sahip olmak için . Ölçeklemeseydik, yine de doğru frekansları geri kazanırdık, ancak genliklerin hepsi daha önce bulduğumuzla aynı faktörle ölçeklendirilirdi. Şimdi fft katsayılarını çizelim: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")
Tamam: frekanslar doğru, ama şimdi temel fonksiyonların artık sinüs ve kosinüs olmadığını unutmayın (karmaşık üstel , burada ile hayali birimi belirtiyorum). Ayrıca daha önce olduğu gibi sıfır olmayan bir frekans kümesi (1,2,3,4) yerine bir küme (1,2,5) elde ettiğimizi unutmayın. Bunun nedeni bir terimdir , bu karmaşık katsayısı genişleme (böylece iki reel tekabül karmaşıktır) içinde Euler formülü nedeniyle trigonometrik temelde genişleme . Karmaşık katsayının modülü, iki gerçek katsayının kareleme toplamına eşittir, yani,expniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx 5=√|xn|=a2n+b2n−−−−−−√ . Nitekim .5=33+42−−−−−−√