(#01って、二桁で読み終われるのだろうか…。)
大変よろしくないことに仕事が停滞してしまっているので、すき間時間を使って『ゼロから学ぶDeep Learning』の勉強を始めました。私は何ごとに付け基本がなっていないし、機械学習をまともに学習したこともないので、最も基本となるところはここかなと本書に手を出した次第です。
#まあ、QIITAでリンクを貼る必要はないかもしれないですけどね
とりあえず今日は1章をさらさらっと。Python自体はすでにインストールしてあって、VS Codeも使えるようにはしてある程度の経験者なので、NumPyのところ以外は復習という感じもありました。
NumPyはまったく初めてではないですが、今まで読んだ書籍で紹介されていたサンプルプログラムに出てきたくらい。そこでの解説を読めば「なるほど」とは思いますが、あんまり理解できた感じはしない。ましてやNumPyを使ったコードなど書けません。そもそも、NumPyが必要なプログラムを着想することもできなさそうという感じ。
#と書いた先から「あそこで使えるのかも」と思ったところがあったりなかったり
さて、今日読んだ中から覚えておきたいところを先々の自分向けにまとめてみました。
ブロードキャストによる配列計算
行列の計算は文系出身者としては頭の痛いところです。かなりのおじさんなので高校時代に確かに行列は教わりました。「ややこしいよね」という印象だけが残っている感じ。
ただ、NumPyの配列クラスは同じ位置の要素同士で演算する(という認識で正しいかはちょっと自信ないけど)ので、「どことどこをかけ算して、それをあっちのかけ算とたし算して…」は不要なところにはちょっとホッとできる。それだけに要素数の異なる配列の演算になると「???」と急にフリーズしてしまっていたのです。
でも、本書のブロードキャストの解説はものすごく腑に落ちました。
>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([10, 20])
>>> A * B
というコードだと、
array([[ 10, 40],
[ 30, 80]])
という結果になりますが、これはNumPyの側で自動的に
>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([[10, 20], [10, 20]]) # 後ろの[10, 20]を補完
>>> A * B
array([[10, 40],
[30, 80]])
と抜けている分の要素を補完して計算してくれるということなんですね。これは何かものすごく「演算のコードをどう書けばいいか」がよくわかった気になれました。
要素へのアクセス
解説でも基本的には通常のリストのように記述するとあったので、まあまあ理解していることをおさえ直したという感じです。
ところが! flatten
には「おおっ!」となりました。
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> X = X.flatten()
>>> print(X)
[51 55 14 19 0 4]
配列が苦手な私としては何かこうしちゃったほうがわかりやすいかも、と思える場面もありそうで、こんな簡単にフラットにできちゃうメソッドが用意されているなんて!と感激した次第です。
それと、
>>> X[np.array([0, 2, 4])]
array([51, 14, 0])
配列から要素を離散的に呼び出すことができるというのも初めて知りました。入門書ではlist[1:3]
的な解説がほとんどなので、連続してるところしか取り出せないのかと思っていました。これ、使いでありそう。さらに、
>>> X[X>15]
array([51, 55, 19])
も、知っていたら活用できそうな感じがしました。
[雑]plt.legend――レジェンド?
今までの写経ではあまり気に留めていなかったのですが、matplotlibでグラフを描画する際、plt.legend
という行があるのに引っかかりました。p.17の「1.6.2 pyplotの機能」で紹介されているコードの文脈からすると、「軸ラベルとかタイトルを設定したので、それを表示する要素として扱ってね」というのがplt.legend
の意味なんだろうなあとは思いました。実際、matplotlibの解説記事を検索すると「タイトルや凡例などのこと」と説明されていることが多いです。
逆にmatplotlibの公式ドキュメントには
Place a legend on the Axes.
とあるので(matplotlib.pyplot.legend)、各軸に配置するものがlegendなのだなあと。
プログラミング的にはそこで疑問が晴れたのでいいんですが、伝説と見出しといったように日本語では同じ方向を向いていないように見えても、言葉として同じなんだったら語源が同じなんだからどこかに通じるところがあるはずだよなあと。なので、語学的にちょっと調べてみました。
すると、
「レジェンド」の語源はラテン語の “legenda” です。
legenda はラテン語の直訳で「読まれるべき」という意味の言葉です。
という解説(レジェンド」の意味とは?使い方から英語までわかりやすく解説)を見て、納得しました。伝説もグラフの凡例や見出しも「読んでおくべきもの」として通底するものがあるというわけですね。
まとめられるほどの勉強はしていないので、今回はメモ代わり。本文にも
本章は、ディープラーニングの下準備のページです。
とある通り、まったく本論に入っていないのにちょいちょい気付きがあって、この先スムーズに学びが進むのかなあととても心配になったエイプリルフールなのでした(本記事の内容はまったくうそ偽りはございません)。