시계열 지연 평가
지연 평가는 값이 필요할 때까지 표현식 평가를 지연시키는 평가 전략입니다. 메모화와 결합될 때 지연 평가 전략은 빈복되는 평가를 피하며 특정 함수의 실행 시간을 상당히 줄일 수 있습니다.
시계열 라이브러리는 데이터를 처리하기 위해 지연 평가를 사용합니다. 개념적으로 해당 평가가 출력이 구체화될 때만 트리거되는 시계열 데이터에 대해 구성됩니다. 오브젝트가 1차원 공간에서 이동 중이라고 가정하면
그의 위치는 x(t)로 캡처됩니다. 다음과 같이 속도(v(t)
) 및 가속화(a(t)
) 시계열을 사용하여 이 오브젝트의 가혹한 가속/제동(h(t)
)을 판별할 수 있습니다.
# 1d location timeseries
x(t) = input location timeseries
# velocity - first derivative of x(t)
v(t) = x(t) - x(t-1)
# acceleration - second derivative of x(t)
a(t) = v(t) - v(t-1)
# harsh acceleration/braking using thresholds on acceleration
h(t) = +1 if a(t) > threshold_acceleration
= -1 if a(t) < threshold_deceleration
= 0 otherwise
이것은 다음 양식의 단순한 실행 그래프를 생성합니다.
x(t) --> v(t) --> a(t) --> h(t)
평가는 조치가 수행될 때만 트리거됩니다(예: compute h(5...10)
, 즉 compute h(5), ..., h(10)
). 라이브러리는 시계열 사이의 좁은 일시적 의존성을 캡처합니다. 이 예에서 h(5...10)
에는 a(5...10)
이(가) 필요하고 그 다음에는 차례로 v(4...10)
이(가) 필요하며 x(3...10)
이(가) 필요합니다. a(t)
, v(t)
, x(t)
의 관련 부분만 평가됩니다.
h(5...10) <-- a(5...10) <-- v(4...10) <-- x(3...10)
또한 평가는 메모이제이션되어 h
에 대한 후속 조치에서 재사용될 수 있습니다. 예를 들어, h(7...12)
에 대한 요청이 h(5...10)
에 대한 요청 뒤에 오는 경우, 메모이제이션된 값 h(7...10)
이(가) 활용됩니다. 또한 h(11...12)
은(는) a(11...12), v(10...12)
및 x(9...12)
(을)를 사용하여 평가되며 이는 이전 컴퓨팅에서 메모이제이션된 v(10)
및 x(9...10)
을(를) 활용합니다.
더 일반적인 예에서는 다음과 같이 평탄화된 속도 시계열을 정의할 수 있습니다.
# 1d location timeseries
x(t) = input location timeseries
# velocity - first derivative of x(t)
v(t) = x(t) - x(t-1)
# smoothened velocity
# alpha is the smoothing factor
# n is a smoothing history
v_smooth(t) = (v(t)*1.0 + v(t-1)*alpha + ... + v(t-n)*alpha^n) / (1 + alpha + ... + alpha^n)
# acceleration - second derivative of x(t)
a(t) = v_smooth(t) - v_smooth(t-1)
이 예에서 h(l...u)
에는 다음과 같은 시간 종속성이 있습니다. h(l...u)
의 평가는 메모이제이션과 함께 이 시간 종속성을 엄격하게 준수합니다.
h(l...u) <-- a(l...u) <-- v_smooth(l-1...u) <-- v(l-n-1...u) <-- x(l-n-2...u)
예
다음 예는 간단한 인메모리 시계열에 대해 가혹한 가속을 구현하는 Python 코드 스니펫을 보여줍니다. 라이브러리는 여러 가지 기본 제공 변환을 포함하고 있습니다. 이 예에서 차이 변환이 위치 시계열에 두 번 적용되어
가속 시계열을 연산합니다. 맵 조작은 코드 샘플 다음에 정의된 가혹한 람다 함수를 사용하여 가속 시계열에 적용되며, 이는 가속을 +1
(가혹한 가속), -1
(가혹한 제동), 0
(그 외)에 맵핑합니다. 필터 조작은 가혹한 가속이나 가혹한 제동이 관찰되는 인스턴스만 선택합니다. get_values
을(를) 호출하기 전에 실행 그래프가 작성되지만 컴퓨팅은 수행되지 않습니다. get_values(5, 10)
을(를) 호출하면 실행 그래프에서 가장 좁은 가능한 시간 종속성에 대한 메모이제이션을 사용하여 평가가 수행됩니다.
import tspy
from tspy.builders.functions import transformers
x = tspy.time_series([1.0, 2.0, 4.0, 7.0, 11.0, 16.0, 22.0, 29.0, 28.0, 30.0, 29.0, 30.0, 30.0])
v = x.transform(transformers.difference())
a = v.transform(transformers.difference())
h = a.map(harsh).filter(lambda h: h != 0)
print(h[5, 10])
가혹한 람다는 다음과 같이 정의됩니다.
def harsh(a):
threshold_acceleration = 2.0
threshold_braking = -2.0
if (a > threshold_acceleration):
return +1
elif (a < threshold_braking):
return -1
else:
return 0
자세히 알아보기
tspy
Python SDK를 사용하려면 tspy
Python SDK 문서를 참조하십시오.
상위 주제: 시계열 분석