遅延評価とは、式の値が必要になるまで式の評価を遅らせる評価戦略です。 遅延評価戦略をメモ化と組み合わせると、繰り返しの評価が回避され、特定の関数の実行時間を大幅に短縮できます。
時系列ライブラリーは、遅延評価を使用してデータを処理します。 概念的には、実行グラフは、出力がマテリアライズされたときにのみ評価がトリガーされる時系列データ上に構築されます。 オブジェクトが 1 次元空間内を移動しており、このオブジェクトのロケーションが x(t) によってキャプチャーされるとします。 以下のように、このオブジェクトの過酷な加速/ブレーキ(h(t)
)を判別できます。その時は、速度(v(t)
)および加速(a(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 コード・スニペットを示しています。 このライブラリーには、組み込みの変換が複数含まれています。 この例では、加速の時系列を計算するために、ロケーションの時系列に差分変換が 2 回適用されています。 マップ操作は、コード・サンプルの後で定義される、+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])
harsh ラムダは、以下のように定義されます。
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
PythonSDKを使用するには、tspy
PythonSDK資料を参照してください。
親トピック: 時系列分析