그들은 강하게 관련되어 있습니다. 데이터를 포함하지 않았기 때문에 예제를 재현 할 수 없으므로 새로 작성하겠습니다. 우선, 주기적 함수를 만들어 봅시다 :
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)
주파수는 정확히 올바른 주파수이지만 0이 아닌 성분의 진폭은 (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")
Ok : 빈도는 정확하지만 이제 기본 함수는 더 이상 죄와 코사인이 아닙니다 (복잡한 지수 이며 여기서 는 허수 단위를 나타냅니다). 또한 이전과 같이 0이 아닌 주파수 세트 (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−−−−−−√