Pythonでしっかり学ぶ線形代数 行列の基礎から特異値分解まで
線形代数はほぼすべての大学理工学部1年の必須の履修科目となっている。にも拘わらず、ほぼ並行して学ぶ微積分学に比べてその意味(有用性)が分かりにくいのも事実である。微分や積分は工学や物理学の必須のツールであることが多い。高校でも学ぶ運動方程式は微分方程式であるし、大学で学ぶ電磁気学では微分や積分を多用する。それに比べて「線形代数を何に使いましたか?」と問われてパッと答えられる人は案外少ないのではないか。
線形代数はどちらかというとすぐに使う、というより後で使うことが多いように思う。1年で学ぶ線形代数は行列の対角化、固有値、固有ベクトルくらいまで行って終わることが多いが実際にこういうことが問題になるのは、学部での授業というより、もっと上の卒研や修士課程での研究でのことが多いだろう。結果、実際に研究で使う段になっても内容をすっかり忘れてしまっているということが多い。
線形代数が学びにくいもう1つの問題として、演習問題をやりにくいという欠点がある。手で解ける例題をたくさん出せる微分や積分と違って、線形代数の場合、ちょっと複雑な演算をやらせようとすると目が回るような計算になってしまう。N次元の行列の行列式を余行列で書けますと言われても実際にNが4以上の場合に書き下すようなことは複雑でやっていられないのが常だ。
そして、実際、研究で使う時には計算機で計算することが多い。勢い、Pythonで線形代数、みたいな本は、線形代数の原理を説明した後、いきなりブラックボックスのライブラリを読んで計算しておしまい、みたいなことになりがちである。しかし、それでは理解に繋がりにくいだろう。
本書ではこのような問題をさけるために、Pythonで線形代数の問題を解くことを最初に線形代数を学ぶ学生がやる演習の一部として埋め込んでいる。このおかげで、この本で線形代数を学んだ学生は実際に自分で線形代数の計算ができるようになるわけだ。素晴らしい!一度中身が解ってしまえば、あとは、上述のブラックボックスのライブラリの計算になってしまっても問題はないだろう。
Pythonで線形代数が出来るようになる、というと今まではまず線形代数を学び、それからPythonを学んで、最後にPythonで線形代数をやる方法を学ぶという立て付けだった。だが、この本は、Pythonを学びながら、その過程で線形代数も学ぶという1粒で二度おいしいという構造なのでそこが素晴らしいと思う。
この様な方法をとったおかげで、特異値分解まで教えてしまえるようになったのは特筆に値する。特異値分解は、行列の対角化(あるいは固有値固有関数)までできればあと一歩で、そこまでいくと応用範囲もぐっと広がるのだが、手計算で実例をやるのは難しかった。3×3の行列を特異値分解しても意義を理解するのは難しいだろうから(特異値分解の威力は高次元データを低次元で表現、あるいは、近似できることにこそあるのだから)。だが、この本では特異値分解が力を発揮する高次元データの解析を実際に学ぶことができる。これは手計算に頼らないで線形代数を学んだことの余得だろう。
僕自身、特異値分解のさらに高次元版のテンソル分解を研究で使っているのだが、特異値分解が線形代数の基礎から除かれているため理解してもらうことに困難を覚えることが多く、もし、この本で学ぶことが標準的になったらそういう問題も一気に解決するだろうと期待している(もっというとテンソル分解までこの本で説明してほしかったところですが)。
惜しむらくはやっぱりそれでもPythonを全く知らない初学者がこれだけで勉強するのは難しいだろうということだ。そこを踏まえて本書では(ある意味開き直って)サンプルコード(*)を動かすだけでいいよとも書いてある。確かに現状ではこれが限界だし、僕に何かいい案があるわけではないのだが、本当はPythonを知らない人が一冊の本だけでPythonと線形代数が同時に学べたら素晴らしいのになあ、とは思う。
これからますますデータサイエンス的な物が理工系の常識になっていく流れの中でPythonを使って「手」を動かしながら線形代数を学んだ学生が輩出されることを祈ってこの書評の筆を置きたい。
(*)2023年2月7日付でサンプルコードのデータがダウンロードできるようになったことを付記します。
https://www.kspub.co.jp/download/9784065303757_1.zip
この記事が気に入ったらサポートをしてみませんか?