Edited at

ゼロから作る Deep Learning 勉強メモ #2

More than 1 year has passed since last update.


はじめに

https://www.oreilly.co.jp/books/9784873117584/

https://www.amazon.co.jp/dp/4873117585

この記事は #1 の続きの記事です。

勉強メモ#1

勉強メモ#3

勉強メモ#4

勉強メモ#5

勉強メモ#6

勉強メモ#7


numpy の動作確認

numpy に行列と行列の演算をやらせてみます。

下記のコードを実行してみます。

import numpy as np

a = np.array([1, 2])
b = np.array([3, 4])

print(a)
print(b)
print(a * b)
print(b * a)
print(np.dot(a, b))
print(np.dot(b, a))
print(np.cross(a, b))
print(np.cross(b, a))

このコードの実行ログです。

$ deep python ./test_numpy.py

[1 2]
[3 4]
[3 8]
[3 8]
11
11
-2
2

なるほど...(よくわかってない)

よくわかってないので、後で復習します。


matplotlib の動作確認

matplotlib を使ってグラフを描画してみます。

下記のコードを実行してみます。

import numpy as np

import matplotlib.pyplot as plt

x = np.arange(0, 6, 0.1)
y = np.sin(x)

plt.plot(y)
plt.show()

このコードを実行すると、こんな感じのグラフが出てきます。

figure_1.png

とりあえず、これで numpy と matplotlib の動作確認は終わりです。


[番外編] matplotlib の設定ファイル

設定ファイルの場所を教えてもらいます。

>>> import matplotlib

>>> matplotlib.matplotlib_fname()
'/Users/<ユーザ名>/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/matplotlib/mpl-data/matplotlibrc'

まずはこのファイルを見てみます。

ズラッとコメントアウトされていて、生きているのはこの行だけみたいです。

backend      : macosx

ファイルの冒頭のコメントによると、下記の場所に設定ファイルを置けば、そっちを優先して読んでくれるみたいです。

# other platforms:

# $HOME/.matplotlib/matplotlibrc

ということで、こっちにファイルを置いてみます。

cp /Users/<ユーザ名>/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/matplotlib/mpl-data/matplotlibrc ~/.matplotlib

これで設定ファイルを心置き無くいじることができます。


[番外編] 行列の計算を復習

下記の3行のソースコードでどのような計算が行われているのか復習します。

print(a * b)

print(np.dot(a, b))
print(np.cross(a, b))


アスタリスク(*)

print(a * b)

これは、内積でも外積でもなく、ブロードキャストという機能を使った計算になるようです。

[1, 2][3, 4]で掛け算をする場合、

[1 * 3, 2 * 4]という結果になるようです。

なので、a * b == b * aです。

試してみます。

import numpy as np

a = np.array([1, 2])
b = np.array([3, 4])

print(a * b)
print(b * a)
print(((a * b) == (b * a)))
print(((a * b) == (b * a)).all())

$ python test_numpy.py

[3 8]
[3 8]
[ True True]
True

all()はすべての要素が True の場合、True を返す関数らしいです。


dot()

これは内積です。

[1, 2][3, 4]と、両方同じ大きさの配列なので、内積が定義できます。

計算は1 * 3 + 2 * 4になります。

内積が定義できない場合はどうなるのか気になりました。

試してみます。

import numpy as np

a = np.array([1, 2])
b = np.array([3, 4])
c = np.array([5, 6, 7])

print(np.dot(a, b))
print(np.dot(a, c))

$ deep python test_numpy.py

11
Traceback (most recent call last):
File "test_numpy.py", line 8, in <module>
print(np.dot(a, c))
ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)

案の定、エラーが出ました。配列の次元が違うよ〜とのこと。


cross()

これは外積です。

[1, 2][3, 4]の外積なのでスカラ値になってしまう。

長さが3のベクトル同士だと、結果も長さが3のベクトルになりそうです。

ためしてみます。

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(np.cross(a, b))

[-3  6 -3]

出ました。

[1, 2, 3][4, 5, 6]の外積なので、下記のように計算できます。

[2 * 6 - 3 * 5, 3 * 4 - 1 * 6, 1 * 5 - 2 * 4]

[12 - 15, 12 - 6, 5 - 8]

[-3, 6, -3]

確認できました。