Theano
フィボナッチ数列

Theanoのscanを使ってフィボナッチ数列を計算する。

More than 1 year has passed since last update.

Theano

Pythonの数値計算ライブラリ。
自動微分を行ってくれるので深層学習でよく使われる。
今更ながら勉強してます。

scanについて

Theanoにおける繰り返し処理に対応する関数。
RNNなどの時系列処理における中心的役割を担う関数。

使い方は下記が分かりやすかった。
Python Theano function / scan の挙動まとめ

フィボナッチ数列

フィボナッチ数とは第 n 項の値が第 n - 1 項と第 n - 2 項の和となる数のこと
これを並べた
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …
みたいな数列をフィボナッチ数列と言う。

詳しくはWiki参照

やってみた

こんな感じでできた。

import numpy as np
import theano
from theano import tensor as T


def fib(seq1, seq2):
    return seq2, seq1 + seq2


x = T.iscalar('x')
y = T.iscalar('y')
n = T.iscalar('n')
result, _ = theano.scan(fn=fib,
                        outputs_info=[x, y],
                        sequences=None,
                        non_sequences=None,
                        n_steps=n)
f = theano.function(inputs=[x, y, n], outputs=result)
print f(0, 1, 20)[0]
[   1    1    2    3    5    8   13   21   34   55   89  144  233  377  610
  987 1597 2584 4181 6765]

最初に[0, 1]を与えてあげる。20は計算回数。
n項目の計算は、(n-1)+(n-2)なので、3項目の計算は、1項目と2項目の和となる。
また、n+1項目の計算は、(n)+(n-1)なので、n-1項目の値は、n,n+1での計算に使われる。
なので、fib関数でn項目の計算時、seq1 + seq2[(n-1)+(n-2)]だけでなく、seq2[(n-1)]の値も返している。
(n+1項目の計算でn-2項目の値は不要なので、seq1は返す必要がない。)

もっと良い書き方もある気がするけど、とりあえずできた。
scanの挙動を勉強するには良い練習だった。