線形代数プログラミングの解説書。数学的概念を実装するプログラムで実際に問題を解決しながら、その応用法を探求します。具体的には、図形変換、顔検出、画像圧縮、画像補正、ページランク、機械学習、暗号と秘密共有などの例を使い、ベクトルと行列、それらを動かすアルゴリズムについて学びます。対象は、プログラマーおよび具体計算を通じて線形代数を学びたい学生。厳密な証明が目的ではないので数学に詳しくなくてもかまいません。Python 3プログラムを用いることで図やグラフからベクトルと線形変換を視覚的にとらえることができるため読者はイメージをつかみやすいでしょう。章末の問題を解くことで自分がその章で何を学んだのか、また自分の理解度を確認できます。
https://www.ohmsha.co.jp/book/9784873117775/
正誤表やDLデータ等がある場合はこちらに掲載しています
訳者前書き
はじめに
0章 関数(とその他の数学とコンピュータに関する予備知識)
0.1 集合に関する用語と記法
0.2 デカルト積
0.3 関数
0.3.1 関数 vs プロシージャ vs 計算問題
0.3.2 関数に関連する2つの計算問題
0.3.3 特定の定義域と余定義域を持つ関数の集合に関する記法
0.3.4 恒等関数
0.3.5 関数の合成
0.3.6 関数の合成の結合則
0.3.7 逆関数
0.3.8 可逆関数の合成関数についての可逆性
0.4 確率
0.4.1 確率分布
0.4.2 事象及び確率の和
0.4.3 関数への無作為な入力
0.4.4 完全秘匿
0.4.5 完全秘匿で可逆な関数
0.5 ラボ:Python入門..集合、リスト、辞書、内包表記
0.5.1 簡単な式
0.5.2 代入文
0.5.3 条件式
0.5.4 集合
0.5.5 リスト
0.5.6 タプル
0.5.7 その他の繰り返し処理について
0.5.8 辞書
0.5.9 1行プロシージャを定義する
0.6 ラボ:Pythonと逆インデックス..モジュールと制御構造
0.6.1 既存のモジュールの利用
0.6.2 モジュールの作成
0.6.3 ループと条件文
0.6.4 字下げによるPythonのグループ化機能
0.6.5 ループからの脱出
0.6.6 ファイルからの読み込み
0.6.7 ミニ検索エンジン
0.7 確認用の質問
0.8 問題
1章 体
1.1 複素数入門
1.2 Pythonにおける複素数
1.3 体への抽象化
1.4 Cと遊ぼう
1.4.1 複素数の絶対値
1.4.2 複素数を足すこと
1.4.3 複素数に正の実数を掛けること
1.4.4 複素数に負の実数を掛けること:180度の回転
1.4.5 iを掛けること:90度の回転
1.4.6 複素平面上の単位円:偏角と角度
1.4.7 オイラーの公式
1.4.8 複素数の極表示
1.4.9 指数の第1法則
1.4.10 ラジアンの回転
1.4.11 変換の合成
1.4.12 2次元を越えて
1.5 GF(2)で遊ぼう
1.5.1 完全秘匿な暗号化システム、再訪
1.5.2 ワンタイムパッド
1.5.3 ネットワークコーディング
1.6 確認用の質問
1.7 問題
2章 ベクトル
2.1 ベクトルとは何か?
2.2 ベクトルは関数
2.2.1 Pythonの辞書を用いたベクトルの表現
2.2.2 スパース性
2.3 ベクトルで何が表現できるか?
2.4 ベクトルの加法
2.4.1 平行移動とベクトルの加法
2.4.2 ベクトルの加法の結合則と可換則
2.4.3 矢印としてのベクトル
2.5 スカラーとベクトルの積
2.5.1 矢印のスケーリング
2.5.2 スカラーとベクトルの積の結合則
2.5.3 原点を通る線分
2.5.4 原点を通る直線
2.6 ベクトルの和とスカラーとの積の組み合わせ
2.6.1 原点を通らない線分と直線
2.6.2 スカラーとベクトルの積とベクトルの和に対する分配則
2.6.3 はじめての凸結合
2.6.4 はじめてのアフィン結合
2.7 辞書によるベクトルの表現
2.7.1 セッターとゲッター
2.7.2 スカラーとベクトルの積
2.7.3 加法
2.7.4 ベクトルの反転、ベクトルの和、差の可逆性
2.8 GF(2)上のベクトル
2.8.1 完全秘匿性、再再訪
2.8.2 GF(2)を用いた1か0の秘密共有
2.8.3 ライツアウト
2.9 ドット積
2.9.1 総費用と利益
2.9.2 線形方程式
2.9.3 類似性の測定
2.9.4 GF(2)上のベクトルのドット積
2.9.5 パリティビット
2.9.6 簡単な認証方式
2.9.7 この簡単な認証方式への攻撃
2.9.8 ドット積の代数的性質
2.9.9 簡単な認証方式への攻撃、再訪
2.10 Vecの実装
2.10.1 Vecを扱う構文
2.10.2 実装
2.10.3 Vecの利用
2.10.4 Vecの表示
2.10.5 Vecのコピー
2.10.6 リストからVecへ
2.11 上三角線形方程式系を解く
2.11.1 上三角線形方程式系
2.11.2 後退代入
2.11.3 後退代入の最初の実装
2.11.4 このアルゴリズムはどのような場合に役に立つか?
2.11.5 任意の定義域のベクトルを用いた後退代入
2.12 ラボ:ドット積を用いた投票記録の比較
2.12.1 動機
2.12.2 ファイルから読み込む
2.12.3 ドット積を用いてベクトルを比較する2つの方法
2.12.4 ポリシーの比較
2.12.5 平均的でない民主党員
2.12.6 宿敵
2.12.7 更なる課題
2.13 確認用の質問
2.14 問題
3章 ベクトル空間
3.1 線形結合
3.1.1 線形結合の定義
3.1.2 線形結合の利用
3.1.3 係数から線形結合へ
3.1.4 線形結合から係数へ
3.2 線形包
3.2.1 線形包の定義
3.2.2 他の方程式を含む線形方程式系
3.2.3 生成子
3.2.4 線形結合の線形結合
3.2.5 標準生成子
3.3 ベクトルの集合の幾何学
3.3.1 R上のベクトルの線形包の幾何学
3.3.2 同次線形系の解集合の幾何学
3.3.3 原点を含むフラットの2通りの表現
3.4 ベクトル空間
3.4.1 2つの表現に共通するものは何か?
3.4.2 ベクトル空間の定義と例
3.4.3 部分空間
3.4.4 *抽象ベクトル空間
3.5 アフィン空間
3.5.1 原点を通らないフラット
3.5.2 アフィン結合
3.5.3 アフィン空間
3.5.4 線形系の解集合によるアフィン空間の表現
3.5.5 2通りの表現について、再訪
3.6 同次線形系とその他の線形系
3.6.1 同次線形系と対応する一般の線形系
3.6.2 解の個数、再訪
3.6.3 平面と直線の交差について
3.6.4 チェックサム関数
3.7 確認用の質問
3.8 問題
4章 行列
4.1 行列とは何か?
4.1.1 伝統的な行列
4.1.2 行列の正体
4.1.3 行、列、要素
4.1.4 Pythonにおける行列の実装
4.1.5 単位行列
4.1.6 行列の表現間の変換
4.1.7 matutil.py
4.2 列ベクトル空間と行ベクトル空間
4.3 ベクトルとしての行列
4.4 転置
4.5 線形結合による行列とベクトルの積及びベクトルと行列の積の表現
4.5.1 線形結合による行列とベクトルの積の表現
4.5.2 線形結合によるベクトルと行列の積の表現
4.5.3 ベクトルの線形結合による表現の行列とベクトルの方程式による定式化
4.5.4 行列とベクトルの方程式を解く
4.6 ドット積による行列とベクトルの積の表現
4.6.1 定義
4.6.2 応用例
4.6.3 線形方程式の行列とベクトルの方程式としての定式化
4.6.4 三角系と三角行列
4.6.5 行列とベクトルの積の代数的性質
4.7 ヌル空間
4.7.1 同次線形系と行列の方程式
4.7.2 行列とベクトルの方程式の解空間
4.7.3 はじめてのエラー訂正コード
4.7.4 線形符号
4.7.5 ハミングコード
4.8 スパース行列とベクトルの積の計算
4.9行列と関数
4.9.1 行列から関数へ
4.9.2 関数から行列へ
4.9.3 行列の導出例
4.10 線形関数
4.10.1 行列とベクトルの積で表現できる関数
4.10.2 定義と簡単な例
4.10.3 線形関数とゼロベクトル
4.10.4 線形関数による直線の変換
4.10.5 単射な線形関数
4.10.6 全射な線形関数
4.10.7 FCからFRへの線形関数の行列による表現
4.10.8 対角行列
4.11 行列と行列の積
4.11.1 行列と行列の積の行列とベクトルの積及びベクトルと行列の積による表現
4.11.2 グラフ、隣接行列、そして道の数え上げ
4.11.3 行列と行列の積と関数の合成
4.11.4 行列と行列の積の転置
4.11.5 列ベクトルと行ベクトル
4.11.6 全てのベクトルは列ベクトルと解釈される
4.11.7 線形結合の線形結合、再訪
4.12 内積と外積
4.12.1 内積
4.12.2 外積
4.13 逆関数から逆行列へ
4.13.1 線形関数の逆関数も線形である
4.13.2 逆行列
4.13.3 逆行列の利用
4.13.4 可逆行列の積は可逆行列である
4.13.5 逆行列についての補足
4.14 ラボ:エラー訂正コード
4.14.1 チェック行列
4.14.2 生成子行列
4.14.3 ハミングコード
4.14.4 復号化
4.14.5 エラーシンドローム
4.14.6 エラーの検出
4.14.7 全てをまとめる
4.15 ラボ:2次元幾何学における座標変換
4.15.1 平面上の点の表現
4.15.2 座標変換
4.15.3 画像表現
4.15.4 画像の読み込みと表示
4.15.5 線形変換
4.15.6 平行移動
4.15.7 スケーリング
4.15.8 回転
4.15.9 原点以外の点を中心とした回転
4.15.10 反転
4.15.11 色の変換
4.15.12 より一般的な反転
4.16 確認用の質問
4.17 問題
5章 基底
5.1 座標系
5.1.1 ルネ・デカルトのアイデア
5.1.2 座標表現
5.1.3 座標表現及び行列とベクトルの積
5.2 はじめての非可逆圧縮
5.2.1 方法1:最も近いスパースベクトルに置き換える
5.2.2 方法2:画像ベクトルを座標で表現する
5.2.3 方法3:複合的な方法
5.3 生成子を探す2つの欲張りなアルゴリズム
5.3.1 グローアルゴリズム
5.3.2 シュリンクアルゴリズム
5.3.3 欲張って失敗する場合
5.4 最小全域森とGF(2)
5.4.1 定義
5.4.2 最小全域森に対するグローアルゴリズムとシュリンクアルゴリズム
5.4.3 線形代数での最小全域森
5.5 線形従属性
5.5.1 余分なベクトルの補題
5.5.2 線形従属性の定義
5.5.3 最小全域森における線形従属性
5.5.4 線形従属、線形独立の性質
5.5.5 グローアルゴリズムの考察
5.5.6 シュリンクアルゴリズムの考察
5.6 基底
5.6.1 基底の定義
5.6.2 FDの標準基底
5.6.3 全てのベクトル空間が基底を持つことの証明への準備
5.6.4 ベクトルの有限集合は全てその線形包の基底を含むということ
5.6.5 Vの任意の線形独立なベクトルの部分集合はVの基底の形にすることができるか?
5.7 一意的な表現
5.7.1 基底による座標表現の一意性
5.8 はじめての基底の変換
5.8.1 表現からベクトルへの関数
5.8.2 ある表現から別の表現へ
5.9 遠近法によるレンダリング
5.9.1 3次元空間内の点
5.9.2 カメラと画像平面
5.9.3 カメラ座標系
5.9.4 3次元空間内のある点のカメラ座標から対応する画像平面上の点のカメラ座標へ
5.9.5 3次元空間内の座標からカメラ座標へ
5.9.6 ピクセル座標系へ
5.10 基底を求める計算問題
5.11 交換の補題
5.11.1 交換の補題
5.11.2 最小全域森に対するグローアルゴリズムの正当性の証明
5.12 ラボ:透視補正
5.12.1 カメラ基底
5.12.2 ホワイトボード基底
5.12.3 ピクセルからホワイトボード上の点への写像
5.12.4 ホワイトボード上にない点から対応するホワイトボードの上の点への写像
5.12.5 基底の変換行列
5.12.6 基底の変換行列の計算
5.12.7 画像表現
5.12.8 透視補正した画像の生成
5.13 確認用の質問
5.14 問題
6章 次元
6.1 基底ベクトルの個数
6.1.1 モーフィングの補題とその結果
6.1.2 モーフィングの補題の証明
6.2 次元とランク
6.2.1 定義と例
6.2.2 幾何学
6.2.3 グラフの次元とランク
6.2.4 GF(2)上のベクトル空間の濃度
6.2.5 Vに属する任意の線形独立なベクトルの集合からVの基底への拡張
6.2.6 次元原理
6.2.7 グローアルゴリズムの終了
6.2.8 ランク定理
6.2.9 簡単な認証、再訪
6.3 直和
6.3.1 定義
6.3.2 直和の生成子
6.3.3 直和の基底
6.3.4 ベクトルの分解の一意性
6.3.5 補空間
6.4 次元と線形関数
6.4.1 線形関数の可逆性
6.4.2 可逆な最大部分関数
6.4.3 次元定理
6.4.4 線形関数の可逆性、再訪
6.4.5 ランクと退化次数の定理
6.4.6 チェックサム問題、再訪
6.4.7 行列の可逆性
6.4.8 行列の可逆性と基底の変換
6.5 アニヒレーター
6.5.1 表現の間の変換
6.5.2 ベクトル空間のアニヒレーター
6.5.3 アニヒレーター次元定理
6.5.4 Vの生成子からVoの生成子へ、及びその逆
6.5.5 アニヒレーター定理
6.6 確認用の質問
6.7 問題
7章 ガウスの掃き出し法
7.1 階段形式
7.1.1 階段形式から行ベクトル空間の基底へ
7.1.2 階段形式における行ベクトルのリスト
7.1.3 行を0でない要素がはじめて現れる位置でソートする
7.1.4 行基本変形
7.1.5 行基本行列を掛ける
7.1.6 行基本変形による行ベクトル空間の保存
7.1.7 ガウスの掃き出し法を通じた基底、ランク、そして線形独立性
7.1.8 ガウスの掃き出し法が失敗する場合
7.1.9 ピボット化と数値解析
7.1.10 GF(2)上におけるガウスの掃き出し法
7.2 ガウスの掃き出し法の他の応用
7.2.1 逆行列を持つ行列MでMAが階段形式になるものが存在すること
7.2.2 行列の積を用いずにMを計算する
7.3 ガウスの掃き出し法による行列とベクトルの方程式の解法
7.3.1 行列が階段形式の場合の行列とベクトルの方程式の解法..逆行列を持つ場合
7.3.2 ゼロ行を処理する
7.3.3 無関係な列を処理する
7.3.4 単純な認証方式への攻撃とその改善
7.4 ヌル空間の基底を見つける
7.5 整数の素因数分解
7.5.1 素因数分解へのはじめての試み
7.6 ラボ:閾値シークレットシェアリング
7.6.1 最初の試み
7.6.2 うまくいく方法
7.6.3 本手法の実装
7.6.4 uの生成
7.6.5 条件を満たすベクトルの探索
7.6.6 文字列の共有
7.7 ラボ:整数の素因数分解
7.7.1 平方根を用いた最初の試み
7.7.2 最大公約数を求めるためのユークリッドの互除法
7.7.3 平方根を用いた試み、再訪
7.8 確認用の質問
7.9 問題
8章 内積
8.1 消防車問題
8.1.1 距離、長さ、ノルム、内積
8.2 実数上のベクトルの内積
8.2.1 実数上のベクトルのノルム
8.3 直交性
8.3.1 直交性が満たす性質
8.3.2 ベクトルbの平行成分と直交成分への分解
8.3.3 直交性が持つ性質と消防車問題の解
8.3.4 射影と最も近い点の探索
8.3.5 消防車問題の解
8.3.6 *外積と射影
8.3.7 高次元版の問題の解法に向けて
8.4 ラボ:機械学習
8.4.1 データ
8.4.2 教師あり学習
8.4.3 仮説クラス
8.4.4 訓練データにおける誤差を最小化する分類器の選択
8.4.5 ヒルクライミングによる非線形最適化
8.4.6 勾配
8.4.7 最急降下法
8.5 確認用の質問
8.6 問題
9章 直交化
9.1 複数のベクトルに直交する射影
9.1.1 ベクトルの集合に対する直交性
9.1.2 ベクトル空間への射影とそれに直交する射影
9.1.3 ベクトルのリストに直交する射影の第一歩
9.2 互いに直交するベクトルに直交する射影
9.2.1 project_orthogonalが正しいことの証明
9.2.2 project_orthogonalの拡張
9.3 直交する生成子の集合の作成
9.3.1 プロシージャorthogonalize
9.3.2 orthogonalizeが正しいことの証明
9.4 計算問題「ベクトルの線形包の中で最も近い点」を解く
9.5 直交化の他の問題への応用
9.5.1 基底の計算
9.5.2 部分集合から成る基底の計算
9.5.3 aug_orthogonalize
9.5.4 丸め誤差がある場合のアルゴリズム
9.6 直交補空間
9.6.1 直交補空間の定義
9.6.2 直交補空間と直和
9.6.3 線形包またはアフィン包で与えられたR3における平面に対する法ベクトル
9.6.4 直交補空間、ヌル空間、アニヒレーター
9.6.5 方程式で与えられたR3の中の平面に対する法ベクトル
9.6.6 直交補空間の計算
9.7 QR分解
9.7.1 直交行列と列直交行列
9.7.2 列直交行列の積はノルムを保存する
9.7.3 行列のQR分解の定義
9.7.4 Aが線形独立な列ベクトルを持つための条件
9.8 QR分解による行列の方程式Ax = bの解法
9.8.1 正方行列の場合
9.8.2 正方行列の場合の正しさ
9.8.3 最小二乗問題
9.8.4 列直交行列の列ベクトルによる座標表現
9.8.5 Aの行が列より長い場合のQR_solveの使用
9.9 最小二乗法の応用
9.9.1 線形回帰(直線へのフィッティング)
9.9.2 放物線へのフィッティング
9.9.3 2変数の放物線へのフィッティング
9.9.4 産業スパイ問題の近似値への応用
9.9.5 センサーノード問題の近似値への応用
9.9.6 機械学習の問題への最小二乗法の利用
9.10 確認用の質問
9.11 問題
10章 特別な基底
10.1 最も近いkスパースベクトル
10.2 与えられた基底に対する表現がkスパースであるような最も近いベクトル
10.2.1 正規直交基底による座標表現を求める
10.3 ウェーブレット
10.3.1 解像度の異なる1次元「画像」
10.3.2 Vnの直和への分解
10.3.3 ハールウェーブレット基底
10.3.4 V1の基底
10.3.5 一般のnについて
10.3.6 ウェーブレット変換の最初のステップ
10.3.7 ウェーブレット分解の以降のステップ
10.3.8 正規化
10.3.9 逆変換
10.3.10 実装
10.4 多項式の評価と補間
10.5 フーリエ変換
10.6 離散フーリエ変換
10.6.1 指数法則
10.6.2 n個のストップウォッチ
10.6.3 離散フーリエ空間:基底関数のサンプリング
10.6.4 フーリエ行列の逆行列
10.6.5 高速フーリエ変換(FFT)アルゴリズム
10.6.6 FFTの導出
10.6.7 FFTのコーディング
10.7 複素数上のベクトルの内積
10.8 巡回行列
10.8.1 巡回行列とフーリエ行列の列の積
10.8.2 巡回行列と基底の変換
10.9 ラボ:ウェーブレットを用いた圧縮
10.9.1 正規化されていない順変換
10.9.2 順変換の正規化
10.9.3 抑制による圧縮
10.9.4 非正規化
10.9.5 正規化されていない逆変換
10.9.6 逆変換
10.10 2次元画像の処理
10.10.1 補助プロシージャ
10.10.2 2次元ウェーブレット変換
10.10.3 2次元順変換
10.10.4 いくつかの補助プロシージャ
10.10.5 2次元逆変換
10.10.6 画像圧縮の実験
10.11 確認用の質問
10.12 問題
11章 特異値分解
11.1 低ランク行列による行列の近似
11.1.1 低ランク行列の利点
11.1.2 行列のノルム
11.2 路面電車の路線配置問題
11.2.1 路面電車の路線配置問題の解
11.2.2 行列のランク1近似
11.2.3 最適なランク1近似
11.2.4 最適なランク1近似の表現
11.2.5 最も近い1次元アフィン空間
11.3 最も近いk次元ベクトル空間
11.3.1 特異値と特異ベクトルを求めるための「思考実験的」アルゴリズム
11.3.2 特異値と右特異ベクトルの性質
11.3.3 特異値分解
11.3.4 右特異ベクトルを用いた最も近いk次元空間の求め方
11.3.5 Aの最適なランクk近似
11.3.6 最適なランクk近似の行列による表現
11.3.7 0でない特異値の数とrank Aとの一致
11.3.8 数値的なランク
11.3.9 最も近いk次元アフィン空間
11.3.10 Uが列直交であることの証明
11.4 特異値分解の利用
11.4.1 特異値分解の最小二乗問題への応用
11.5 主成分分析
11.6 ラボ:固有顔
11.7 確認用の質問 55211.8問題
12章 固有ベクトル
12.1 離散力学過程のモデル化
12.1.1 2つの利息付きの口座
12.1.2 フィボナッチ数
12.2 フィボナッチ行列の対角化
12.3 固有値と固有ベクトル
12.3.1 相似と対角化可能性
12.4 固有ベクトルによる座標表現
12.5 インターネットワーム
12.6 固有値の存在
12.6.1 正定値行列と準正定値行列
12.6.2 異なる固有値を持つ行列
12.6.3 対称行列
12.6.4 上三角行列
12.6.5 一般の正方行列
12.7 冪乗法
12.8 マルコフ連鎖
12.8.1 人口動態のモデル化
12.8.2 ランディのモデル化
12.8.3 マルコフ連鎖の定義
12.8.4 メモリの取り出しにおける空間の局所性のモデル化
12.8.5 文書のモデル化:不思議の国のハムレット
12.8.6 それ以外のもののモデル化
12.8.7 マルコフ連鎖の定常分布
12.8.8 定常分布が存在するための十分条件
12.9 ウェブサーファーのモデル化:ページランク
12.10 *行列式
12.10.1 平行四辺形の面積
12.10.2 超平行体の体積
12.10.3 平行四辺形を用いた多角形面積の表現
12.10.4 行列式
12.10.5 行列式関数を用いた固有値の特性化
12.11 *いくつかの固有定理の証明
12.11.1 固有値の存在
12.11.2 対称行列の対角化
12.11.3 三角化
12.12 ラボ:ページランク
12.12.1 概念の導入
12.12.2 大きなデータセットの使用
12.12.3 冪乗法を用いたページランクの実装
12.12.4 データセット
12.12.5 検索の処理
12.12.6 ページランクの偏り
12.12.7 おまけ:複数単語検索の処理
12.13 確認用の質問
12.14 問題
13章 線形計画法
13.1 規定食の問題
13.2 規定食の問題を線形計画としてとらえる
13.3 線形計画法の起源
13.3.1 用語
13.3.2 線形計画法の異なる形式
13.3.3 整数による線形計画法
13.4 線形計画法の幾何学:多面体と頂点
13.5 多面体の頂点であるような最適解の存在
13.6 線形計画法の列挙アルゴリズム
13.7 線形計画法における双対性入門
13.8 シンプレックスアルゴリズム
13.8.1 アルゴリズムの終了方法
13.8.2 現在の解を表現する
13.8.3 ピボットステップ
13.8.4 単純な例
13.9 頂点を見つける
13.10 ゲーム理論
13.10.1 線形計画としての定式化
13.10.2 ノンゼロサムゲーム
13.11 ラボ:線形計画法を用いた学習
13.11.1 訓練データの読み込み
13.11.2 線形計画の準備
13.11.3 主制約条件
13.11.4 非負制約条件
13.11.5 行列A
13.11.6 右辺のベクトルb
13.11.7 目的関数ベクトルc
13.11.8 これまでの作業の統合
13.11.9 頂点の探索
13.11.10 線形計画を解く
13.11.11 結果の利用
13.12 圧縮センシング
13.12.1 より高速にMRI画像を得る
13.12.2 少年を救うための計算
13.12.3 前進
13.13 確認用の質問
13.14 問題
索引