Pythonで学ぶ線形代数

【Pythonで学ぶ線形代数】講座の概要

科学技術計算に Python を活用する場合、解くべき問題は可能な限り行列(より一般的にはテンソル)で表現し、コンピュータに配列処理を実行させます。なぜなら、科学技術計算用パッケージ NumPy は、大規模な配列演算を高速処理するように設計されており、Python エンジニアはその処理速度を減速させないコードを書くことが求められるからです。
 
配列演算の基盤となる数学は 線形代数(linear algebra)です。NumPy および、NumPy をベースに構築された SciPy は、linalg というモジュールに線形代数演算用の関数をまとめています。
 
Pythonで学ぶ線形代数』では、テーマごとに行列やベクトル演算のコードを実装しながら、線形代数の数理構造を解説します。このシリーズの記事を読み進めることによって、配列を用いたプログラミングと線形代数の知識を同時進行で習得できる構成になっています。当講座は「プログラミングを活用しながら線形代数に登場する式や定理の意味を読み解く」という方針で執筆しています。純粋数学としての線形代数を講義する内容ではないので、難解な証明などは端折ってしまうところもあります(Web で長い証明を読みたいと思う人はあまりいないでしょう)。厳密な形式に拘りたい人は、基礎数学シリーズの『線形代数入門』で学ぶことをおすすめします(線形代数について網羅された古典的名著です)。

Pythonの線形代数演算ライブラリ

本講座に掲載するコードを実行するためには、Python 本体に加えて以下の4 つの拡張パッケージが必要となります。

 ・NumPy
 ・Scipy
 ・SymPy
 ・Matplotlib
 
足りないものがあったらインストールしておいてください(Anaconda にはすべて含まれています)。このうち NumPy については、必要最低限の知識 (基本演算、ブロードキャスト、numpy.sum()関数の使い方など) は身につけておいてください。SciPy や NumPy の関数を使うときには、その都度説明します。

numpy.linalg

NumPy の linalg モジュールは線形代数演算機能を網羅的に提供します。これらの関数は BLAS(Basic Linear Algebra Subprograms)およびその上位パッケージである LAPACK(Linear Algebra Package)に依存します。

scipy.linalg

scipy.linalg は numpy.linalg に含まれるすべての関数がパッケージされていると同時に、さらに高度な数値線形代数関数が含まれます。たとえば、LU 分解を実行する scipy.linalg.lu() や行列指数関数を計算する scipy.linalg.expm() などです。scipy.linalg は常時 BLAS / LAPACK サポートでコンパイルされます。一方で、numpy.linalg では、BLAS / LAPACK サポートはオプションです。したがって、NumPy のインストールの方法によっては、scipy.linalg のほうが numpy.linalg よりも高速の場合があります。

BLAS

BLAS(Basic Linear Algebra Subprograms)はベクトルや行列の基本演算アルゴリズムを梱包した数値線形代数ライブラリです。Level 1 BLAS はスカラーとベクトル、あるいはベクトル同士の演算アルゴリズムを提供します。Level 2 BLAS は行列とベクトルの演算を、Level 3 BLAS は行列同士の演算アルゴリズムを提供します。

LAPACK

LAPACK(Linear Algebra Package)は BLAS の上位パッケージです。Fortran 90 で記述され、線形方程式の求解、固有値問題、行列分解(LU 分解、QR 分解、コレスキー分解、特異値分解)などの高度なアルゴリズムを実装しています。

当講座で学ぶための前提知識

線形代数は大学の初年度に履修する学問なので、高校数学までの基本的知識は必要となります(教科書をひと通り読んで簡単な練習問題を解けるというレベルで十分です)。忙しくて教科書を全部読み直す時間がないという人は、文字式の変形、因数分解、一次方程式、連立方程式、ベクトルの計算、三角関数あたりを重点的に復習しておいてください。