機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

numpyの行列計算(tensor×matrix)

ベクトル同士、行列×ベクトルだとイメージしやすいが、テンソル(※)×行列は頭の中でイメージするのが難しい場合がある。
※ここでは、3階以上の階数の行列を指す

結論を先に書いておくと、

3階テンソル 行列 内積
m×n×k k×p m×n×p

また、

行列 3階テンソル 内積
p×k k×n p×m×n


numpyで簡単な数字で確認してみた。
テスト①

import numpy

tensor = numpy.ones([3, 4, 2])

matrix = numpy.ones([2, 3])
print matrix.shape
print matrix
(2L, 3L)
[[ 1.  1.  1.]
 [ 1.  1.  1.]]

print numpy.dot(tensor, matrix)
[[[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]

 [[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]

 [[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]]

3×4×2のテンソルと2×3の行列なので、
まず、4×2と2×3の内積をとる。(4×3)それ×3

テスト②

import numpy

tensor = numpy.ones([3, 4, 2])
print tensor.shape
print tensor
(3L, 4L, 2L)
[[[ 1.  1.]
  [ 1.  1.]
  [ 1.  1.]
  [ 1.  1.]]

 [[ 1.  1.]
  [ 1.  1.]
  [ 1.  1.]
  [ 1.  1.]]

 [[ 1.  1.]
  [ 1.  1.]
  [ 1.  1.]
  [ 1.  1.]]]

matrix = numpy.ones([2, 4])
print matrix.shape
print matrix
(2L, 4L)
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]

print numpy.dot(tensor, matrix)
[[[ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]
  [ 2.  2.  2.  2.]]]

4×2の行列と2×4の内積をとる。(4×4)それ×3

テスト③

import numpy

tensor = numpy.ones([3, 4, 2])

matrix = numpy.ones([2, 5])
print matrix.shape
print matrix
(2L, 5L)
[[ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]]

print numpy.dot(tensor, matrix)
[[[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]]

4×2の行列と2×5の内積をとる。(4×5)それ×3

テンソルm×n×kの場合、行列はk×pである必要がある。
テンソル×行列の内積をとった後のテンソルは、「m×n×p」の形となる。