Họ có liên quan mạnh mẽ. Ví dụ của bạn không thể lặp lại được vì bạn không bao gồm dữ liệu của mình, do đó tôi sẽ tạo một dữ liệu mới. Trước hết, hãy tạo một hàm tuần hoàn:
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)
Bây giờ, hãy tạo một cơ sở Fourier cho hồi quy. Lưu ý rằng, với , việc tạo ra nhiều hơn hàm cơ bản , nghĩa là không phải là hằng số, vì các thành phần tần số cao hơn được đặt bí danh trên một lưới như vậy. Ví dụ: một sin có tần số không thể phân biệt được với một chi phí (sin): xem xét trường hợp , tức là . Dù sao, nếu bạn muốn kiểm tra lại, chỉ cần thay đổi để trong đoạn mã dưới đây và nhìn vào hai cột cuối cùng: bạn sẽ thấy rằng họ đang thực sự vô dụng (và họ tạo ra các vấn đề cho phù hợp, bởi vì ma trận thiết kế hiện nay là số ít ).N= 2 k + 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)
Lưu ý rằng tần số chính xác là đúng, nhưng biên độ của các thành phần khác không phải là (1,2,3,4). Lý do là các fda
hàm cơ sở Fourier được chia tỷ lệ theo một cách kỳ lạ: giá trị tối đa của chúng không phải là 1, vì nó sẽ dành cho cơ sở Fourier thông thường . Nó cũng không phải là , vì nó sẽ dành cho cơ sở Fourier trực giao, .1 , tội lỗiω x ,cosω x ,...1π√12 π√, tội lỗiω xπ√, cosω xπ√, ...
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Bạn thấy rõ rằng:
- giá trị tối đa nhỏ hơn1π√
- cơ sở Fourier (được cắt theo các thuật ngữ đầu tiên ) chứa hàm không đổi (đường màu đen), các tần số tăng dần (các đường cong bằng 0 tại các ranh giới miền) và các cosin có tần số tăng dần (các đường cong là bằng 1 tại các ranh giới miền), vì nó phải làN- 2
Chỉ cần nhân rộng cơ sở Fourier được cung cấp bởi fda
, để có được cơ sở Fourier thông thường, dẫn đến các hệ số hồi quy có các giá trị mong đợi:
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")
Hãy thử fft
ngay bây giờ: lưu ý rằng vì Yper
là một chuỗi tuần hoàn, điểm cuối cùng không thực sự thêm bất kỳ thông tin nào (DFT của chuỗi luôn luôn là định kỳ). Do đó, chúng ta có thể loại bỏ điểm cuối cùng khi tính toán FFT. Ngoài ra, FFT chỉ là một thuật toán số nhanh để tính toán DFT và DFT của một chuỗi các số thực hoặc số phức là phức tạp . Vì vậy, chúng tôi thực sự muốn các mô-đun của các hệ số FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Chúng tôi nhân với để có cùng tỷ lệ với cơ sở Fourier . Nếu chúng tôi không mở rộng quy mô, chúng tôi vẫn sẽ phục hồi tần số chính xác, nhưng tất cả các biên độ sẽ được điều chỉnh theo cùng một yếu tố liên quan đến những gì chúng tôi tìm thấy trước đây. Bây giờ chúng ta hãy vẽ các hệ số fft:2N- 11 , tội lỗiω 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: tần số là chính xác, nhưng lưu ý rằng bây giờ các hàm cơ bản không còn là sin và cosin nữa (chúng là số mũ phức tạp , trong đó với tôi biểu thị đơn vị tưởng tượng). Cũng lưu ý rằng thay vì một bộ tần số khác không (1,2,3,4) như trước đây, chúng tôi đã có một bộ (1,2,5). Lý do là một thuật ngữ trong việc mở rộng hệ số phức này (do đó là phức tạp) tương ứng với hai thuật ngữ thực trong Mở rộng cơ sở lượng giác, do công thức Euler . Mô-đun của hệ số phức bằng tổng của phương trình bậc hai của hai hệ số thực, nghĩa làđiểm kinh nghiệmn i ω xTôixnđiểm kinh nghiệmn i ω xxnmộtns i n ( n ω x ) + bnc o s ( n ω x )điểm kinh nghiệmtôi x =cosx +tôiphạm tộix| xn| = a2n+ b2n------√ . Thực tế, .5 = 33+ 42------√