AI/Time series

[시계열 데이터 이미지 인코딩] 1. Gramian Angular Field (GAF) 개념 및 적용

daeunnniii 2024. 11. 24. 22:46
728x90
반응형

1. Gramian Angular Field (GAF) 이란?

  • Gram Matrix: 각 시점 간의 시간적 상관관계를 극좌표를 기반으로 표현하는 알고리즘 ($G = X^TX$)
    • 서로 다른 모든 벡터들에 대해 유사도를 나타내는 행렬이라고 볼 수 있다.
    • cosine similarity와 비슷하게 값이 1에 가까우면 유사도가 높고, 0이면 유사도가 없고, -1이면 정반대의 유사도를 가진다.
    • 극좌표 기반 행렬은 시계열 데이터를 이미지로 변경할 때 시간 상관관계를 보존할 수 있다는 장점이 있다.

 

1. Time Series 데이터를 -1~1까지로 정규화를 한다.

  • 시계열 데이터의 작거나 큰 다양한 범위들을 [-1, 1] 혹은 [0, 1] 구간으로 정규화시킨다.

2. 정규화된 Time Series 값을 극좌표계(poloar coordinate)로 변환한다.

  • 극좌표계: 평면 위의 위치를 각도와 거리를 써서 나타내는 2차원 좌표계
    • (x, y)를 (r, $\phi$)에 대해 표현. 아래 이미지에서는 $(rcos\phi, rsin\phi)$

  • 데이터 i번째의 반지름은 $t_{i}$(t는 timestamp를 자연수로 나타낸 값)를 데이터 개수 N으로 나눈 것

3. 내적 진행해서 Gram Matrix를 만든다.

  • GAF는 내적을 특별하게 정의한다.

$<x_1, x_2> = cos(\phi_1 + \phi_2) = \cos(\arccos(\widetilde{x}{1}) + \arccos(\widetilde{x}{2}))$

    • 수포자도 아래 그림을 보면 수월하게 이해할 수 있다.
    • 아래와 같이 반지름이 1인 원을 예시로 보면, $cos(\phi)=x$ 이고, 우리는 현재 $\phi$가 아닌 $x$ 값을 알고 있으므로 이를 역함수로 나타내면 \phi=arccos(x) 이다. 따라서 $cos(\phi_1 + \phi_2)$를 정규화된 신호인 $\tilde{x}$를 사용하여 $\cos(\arccos(\widetilde{x}_{1}) + \arccos(\widetilde{x}_{2}))$ 로 표현할 수 있다.

  • 결론적으로 TIme Series X로부터 Gram Matrix를 구하는 과정인데, X 대신 \widetilde{X} 를 사용하고 내적 대신 새롭게 정의한 내적을 사용하여 Gram Maxtrix를 구한다.

 

추가로, 

2. Sin & Cos 그래프 예시

from pyts.image import GramianAngularField
import matplotlib.pyplot as plt

n_samples = 100
time = np.linspace(0, 2 * np.pi, n_samples)
sin_wave = np.sin(time)
cos_wave = np.cos(time)

data = np.vstack((sin_wave, cos_wave))

gaf = GramianAngularField(image_size=n_samples, method='difference')
gaf_matrix = gaf.fit_transform(data)

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(range(n_samples), sin_wave, label='Sin Wave')
plt.plot(range(n_samples), cos_wave, label='Cos Wave')
plt.title('Original Data')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()

plt.subplot(1, 2, 2)
plt.imshow(gaf_matrix[0], cmap='rainbow', origin='lower')
plt.title('Gramian Angular Field')
plt.xlabel('Time')
plt.ylabel('Time')
plt.colorbar()

plt.tight_layout()
plt.show()

결과

 

728x90
반응형