LoginSignup
0
1

More than 5 years have passed since last update.

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

Posted at

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の挙動を勉強するには良い練習だった。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1