34. 行列演算の関数プログラミング的実装
34
map() と reduce() を使った関数プログラミング的な実装に基づく
と,NumPy による計算は理解しやすいだろう
リストではなく,共通の配列に map() して要素ごとの計算をしたあ
と,sum() や max() などの集約演算で reduce() すると考える
例:pLSAモデル
Pr[X, Y ] =
P
Z Pr[X|Z] Pr[Z|Y ] Pr[Y ]
Pr[X | Z ]
pXgZ[x, z]
Pr[Z | Y ]
pZgY[z, y]
Pr[Y ]
pY[y]
y
z
z
x
y
49. Theano:シンボル変数の定義
49
In [1]: import theano
In [2]: import theano.tensor as T
In [3]: x = T.scalar('x')
In [4]: a = T.dmatrix('A')
In [5]: y = T.drow('y')
パッケージのインポート
シンボルの定義
dscalar は倍精度のスカラー,dmatrix は倍精度の行列など
引数はシンボルの名前.pprint などの表示に用いる
複数のシンボルをまとめて定義する scalars や matrices なども
b:バイト w:16bit整数 i:32bit整数 l:64bit整数
f:単精度 d:倍精度 c:複素数
scalar:スカラー vector:ベクトル
matrix:行列
row:行数1の行列 col:列数1の行列
tensor3:3次元テンソル tensor4:4次元テンソル
50. Theano:関数の定義と評価
50
In [6]: f = theano.function([x, y], x + y)
In [7]: f(3, [[1, 2]])
Out[8]: array([[ 4., 5.]])
関数の定義と評価
theano.function( inputs=〈入力変数〉, outputs=〈出力式〉)
入力変数と出力式を指定して関数を定義
入力変数には定義したシンボルを与える
関数に入力を与えれば,関数をその入力値で評価して結果を返す
6行:入力はスカラー x と,行ベクトル y であることを,出力式は
出力式は x + y であることを指定して,関数 f を定義
7行:x=3,y=[[1, 2]] を与えると,x + y の式を評価して
[[4, 5]] の行ベクトルを得る
51. Theano:関数の定義と評価
51
自動微分
In [9]: f = x**2 + T.log(x)
In [10]: grad_f = theano.function([x], T.grad(f, x))
In [11]: grad_f(1.0)
Out[11]: array(3.0)
T.grad(〈微分する式〉,〈微分する変数〉)
式や変数の指定には定義したシンボルを用いて記述する
9行:関数 f(x) = x2
+ log x を定義
10行:T.grad(f, x) で関数 f を変数 x
11行:f(x) を x で微分した f’(x) = 2x + 1/x を x=1.0 で評価して 3.0
の解を得る