인공지능관련/S, R 그래프 그리기

퓨리에 변환

학위논문통계 2016. 11. 14. 14:18

 

 

 

이번에는 시공간(time domain) 데이터를 주파수 공간(frequency domain) 데이터로 전환하는 Fourier 변환에 대해서 조금 알아보죠.

 

 

이 퓨리에 변화는 음성 인식에서 많이 사용되는 모양입니다. 또 지난번 알파고에서 CNN을 사용하였다고 하는데 아마 생각해도 이미지 프로세싱 이론을 뉴런넷과 결합한 모형인 것 같습니다. 제 추측인데 그럴 가능성이 매우 높다고 보입니다. 그래서 이미지 프로세싱에 대한 섹터도 따로 만들려고 합니다. 옛날에 보던 책을 다시 보니까 기억이 가물가물하네요. 이론적으로 그렇게 어려운 분야는 아닙니다. 하여간 이 이미지 프로세싱에서 퓨리에 전환 이론이 매우 중요합니다.

 

 

S에서는 불행하게 이미지를 읽은 함수가 없습니다. R에서는 있을 가능성이 있고요. 아직 확인은 안했습니다. Matlab에서는 있습니다. 시간이 나면 Matlab을 배워 한번 시도해보고 싶지만 먹고 살기 바빠서요. 옛날에 찔끔 찔금 몇 번 해보게 다입니다. 그리고 이미지 프로세싱 하는 모듈을 따로 팔 가능성이 있고요. 하여간 저는 이미지 프로세싱 책에 나오는 내용을 소개하는 정도로 하겠습니다.

 

 

이미지 프로세싱에 관한 책도 인터넷에 pdf로 돌아다닙니다. Gonzalez & Woods의 Digital Image Processing 3ed.입니다. 제가 옛날에 공부한 책은 Gonzales & Wintz의 Digital Image Processing 2ed.입니다. 아마 내용이 비슷할 겁니다. 최근 이론이 좀 더 보강이 된 정도일겁니다.

 

 

퓨리에 이론의 개념은 간단합니다. 전에 한번 쓴 적이 있는데 우리가 구체적인 함수식을 표현할 수 있는 함수는 사실 몇 개 안됩니다. 이 몇 개 안되는 함수에서 곱하고 더하고, 나누고 이런 식으로 복잡하게 표현하는 것이죠.

 

그럼 이상하게 생긴 함수 모양은 어떻게 표현하고 어떻게 현실 문제에서 해결할가요? 아래 그림을 한번 보시기 바랍니다. 시간에 따른 데이터 값을 찍은 것입니다.

 

이런 복잡한 함수는 시리즈로 표현합니다. 그래서 계산 가능한 선에서 local하게 처리합니다. 대표적인 예가 테일러 시리즈입니다. 함수를 일차 함수, 이차함수, 삼차 함수의 결합으로 처리하고 일차나 이차 함수 정도에서 끊어 local하게 근사적으로 처리 합니다.

 

퓨리에 시리즈는 이 함수를 각각 주기가 sine과 cosine의 결합의 형태로 표현합니다. 

 

 

 

   

 

 

이 그림에서 규칙적인 몇 개의 삼각함수의 흐름이 보이십니까?

 

위의 함수는

 

 

f(t)=5*sine(2pi*0.001)+3*sine(2pi*0.01)+1*sine(2pi*0.1)+noise

 

 

입니다. 위 식을 가지고 제가 f(t) 값을 생성해서 찍은 것입니다. 다음은 S 코드입니다.

 

drawsine<-function(a,b,c){

x<-1:1000;

y<-a*sin(2*pi*0.001*x)+b*sin(2*pi*0.01*x)+c*sin(2*pi*0.1*x)+rnorm(1000,0,0.5);

plot(x,y, type="l");

y;

}

 

 

실제 이 함수는 다음 그림의 4개 합수가 선형결합되어 나온 것입니다. 다음은 이 네 개의 함수와 S 코드입니다.

 

 

   

 

drawsine1<-function(a,b,c){

x<-1:1000;

y1<-a*sin(2*pi*0.001*x)

y2<-b*sin(2*pi*0.011*x)

y3<-c*sin(2*pi*0.1*x)

y4<-rnorm(1000,0,0.5);

plot(x,y1, type="n");

lines(x,y1,type="l",lwd=2,col=2);

lines(x,y2,type="l",lwd=2,col=3);

lines(x,y3,type="l",lwd=2,col=5);

lines(x,y4,type="l",lwd=2,col=6);

}

 

 

하여간 위 시간에 따른 데이터 흐름에서 사용된 주파수는 0.001, 0.01, 0.1입니다. 우리는 이 주파수에 따라 진폭(5, 3, 1)의 정도를 측정하려고 합니다. 다음은 퓨리에 전환을 이용하여 위 시공간에서 함수를 주파수에 대한 함수 f(t)로 전환한 것입니다. 이건 FTT(fast Fourier transformation)이라고 유명한 알고리즘이 있습니다. 이건 S에서도 ftt라는 명령문이 있습니다. 단 복소수 값이 결과로 나옵니다. 다음은 S 명령문입니다. 아래 그림에서 0.001, 0.01, 0.1에서 뽀쪽하게 높게 나오는 것이 보이죠. 

 

 

specz<-spec.pgram(z,pad=1,plot=T)

 

 

  

 

 

통계학에서는 진폭 a, b, c를 확률적인 변수로 봅니다. 수학에서 처럼 결정적인 값으로 보지 않는다는 것이죠. 그래서 S에서 이런 것을 처리하게 위해 다양한 옵션을 줍니다. 다음은 데이터를 스므딩해서 퓨리에 전환한 결과입니다. 

 

 

spec.pgram(z,span=c(9,9),plot=T)

 

  

 

 

spec.pgram(z,span=c(3,3,3),plot=T)

 

 

   

'인공지능관련 > S, R 그래프 그리기' 카테고리의 다른 글

다차정규분포, 3d그래프  (0) 2016.11.11
정규분포 그림 그리기  (0) 2016.11.10