第 2 章 線形代数¶
まえがき — ベクトルが世界を動かす¶
3D ゲームのキャラクターはなぜ滑らかに回転できるの? Google はなぜ世界中のページに「重要度」のスコアをつけられるの? Netflix のおすすめはなぜ「あなたの好みを予測」できるの?
これらの裏側でいつも働いているのが 線形代数 です。
線形代数とは「たくさんの数を並べて、まとめて操作する数学」。バラバラの数字 1 個 1 個を相手にする代わりに、並んだ数のかたまり(ベクトル・行列)を 1 つの「モノ」として扱います。これが、現代の AI・グラフィックス・検索・暗号・量子計算の中核技術になっています。
🎯 章の目標
- ベクトルと行列の意味を、数値計算と幾何の両方で理解する
- 連立 1 次方程式・固有値・SVD のように、線形代数の代表的な計算ができる
- 機械学習・3D グラフィックス・検索アルゴリズムが、なぜ線形代数を必要とするか説明できる
- \(\mathbb{R}^n\) や \(\mathbb{R}^{m \times n}\) の記号を見ても怖くなくなる
中学の連立方程式と高校の三角関数があれば、ここまで一気に到達できます。怖がらず、図を描きながら進めてください。
2.1 なぜ線形代数か — モチベーション¶
2.1.1 「並んだ数」の世界¶
身の回りには「数の並び」が溢れています。
| 例 | 数の並び |
|---|---|
| 気温の 1 週間ぶんの記録 | \((20, 21, 19, 22, 23, 25, 24)\) |
| 画像の 1 ピクセル (RGB) | \((255, 100, 50)\) |
| 商品 A の値段・重さ・在庫 | \((1980, 0.5, 12)\) |
| ゲームキャラの位置 | \((x, y, z)\) |
| 文章を表現するベクトル (NLP) | \((0.12, -0.45, 0.88, \ldots)\) |
これら「数の並び」のことを ベクトル (vector) と呼びます。線形代数は、ベクトル同士の足し算・距離・角度・回転をまとめて扱える共通言語です。
2.1.2 線形代数で動く現代技術¶
線形代数なしでは存在しない技術はたくさんあります。
mindmap
root((線形代数))
3D ゲーム/VR
座標変換
回転・拡大
検索 (Google)
PageRank
固有ベクトル
画像認識
CNN たたみ込み
画像 = 行列
LLM (ChatGPT)
Transformer
Attention
レコメンド
Netflix
SVD 分解
画像圧縮
JPEG
基底変換
量子計算
ユニタリ行列
複素ベクトル
- 3D ゲーム / VR: キャラの座標を回転・拡大するのは行列計算
- Google 検索 (PageRank): Web の巨大行列の固有ベクトルを計算
- 画像認識 (CNN): 画像 = 行列、フィルタ = 別の行列、たたみ込み = 行列演算
- ChatGPT (Transformer): 単語ベクトルを行列で何度も変換
- Netflix のおすすめ: ユーザー × 映画の評価行列を低ランク近似 (SVD)
- JPEG 圧縮: 画像を周波数成分に分解 (これも基底変換 = 線形代数)
- 量子コンピュータ: 量子状態 = 複素ベクトル、ゲート = ユニタリ行列
つまり線形代数は、現代テクノロジーの「裏方の主役」。一度マスターすると、CS のあらゆる分野で「あ、また出てきた」と感じます。
2.2 ベクトル — 矢印にも数の並びにも見える¶
2.2.1 ベクトルとは¶
順序のある数の組: $\(\mathbf{v} = (v_1, v_2, \ldots, v_n) \in \mathbb{R}^n\)$
縦に書くこともあります(列ベクトル): $\(\mathbf{v} = \begin{pmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{pmatrix}\)$
物理だと「矢印」、データサイエンスだと「特徴量の並び」、グラフィックスだと「点や方向」。同じものが視点で違う顔を見せます。
2 次元ベクトルのイメージ:
ベクトル \(\mathbf{v}\) は 原点から (2, 3) へ伸びる矢印 だと思えます。
2.2.2 ベクトルの足し算¶
「2 つの矢印を継ぎ足す」操作です。
例: \((1, 2) + (3, 1) = (4, 3)\)
これが「歩いて 1 歩前進したあと、2 歩横に移動する」と「3 歩前進 + 1 歩横」を合わせた結果になります。物理の力の合成、ロボットの移動計画、すべて同じ仕組み。
2.2.3 スカラー倍¶
ベクトルを 数倍 する操作。
例: \(2 \cdot (3, 4) = (6, 8)\)
幾何的には「矢印を 2 倍に伸ばす」。負の数を掛ければ向きが反対になります。
2.2.4 内積 — 似ている度を測る¶
内積 (dot product / inner product) は、2 つのベクトルから 1 つの数を作ります。
例: \((1, 2, 3) \cdot (4, 5, 6) = 1 \cdot 4 + 2 \cdot 5 + 3 \cdot 6 = 4 + 10 + 18 = 32\)
幾何の式: $\(\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}|\,|\mathbf{b}|\cos\theta\)$
「長さ × 長さ × 向きの近さ」と読めます。
内積の使い道¶
- 方向が同じ: 内積が大きい正の値
- 垂直: 内積はちょうど 0
- 逆向き: 大きな負の値
これを使って ベクトルの似ている度合い を測れます。
実務での応用: - 検索エンジン: クエリベクトルと文書ベクトルの内積で関連度を順位付け - レコメンド: ユーザーベクトルと商品ベクトルの内積で「好きそう度」を計算 - 画像認識: 入力画像と「テンプレート」の内積で「テンプレートとの類似度」を計算
🧠 ここで考えてみよう \(\mathbf{a} = (1, 0)\), \(\mathbf{b} = (0, 1)\) の内積を計算してください。
答え: \(1 \cdot 0 + 0 \cdot 1 = 0\)。垂直なベクトルなので内積は 0。直感どおり。
2.2.5 ノルム(長さ・距離)¶
ベクトルの「長さ」を ノルム (norm) と呼びます。
\(L^2\) ノルム(ユークリッド距離): $\(\|\mathbf{v}\|_2 = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2}\)$
これが普通の「直線距離」です。
\(L^1\) ノルム(マンハッタン距離): $\(\|\mathbf{v}\|_1 = |v_1| + |v_2| + \cdots + |v_n|\)$
「碁盤の目の街でタクシーが進む距離」と思えば OK。
\(L^\infty\) ノルム: $\(\|\mathbf{v}\|_\infty = \max_i |v_i|\)$
機械学習では: - \(L^2\) 正則化(Ridge 回帰): 重みを小さく抑える - \(L^1\) 正則化(Lasso 回帰): 重みを スパース にする(0 にする)
2.2.6 単位ベクトル¶
長さ 1 のベクトル。\(\mathbf{v} / \|\mathbf{v}\|\) で得られる。「方向だけ」を取り出すときに使います。
2.3 行列 — 数を長方形に並べる¶
2.3.1 行列の表記¶
\(m\) 行 \(n\) 列の行列: $\(A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{pmatrix}\)$
例 (\(2 \times 3\)): $\(A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix}\)$
身近な例: - スプレッドシートの数値部分 - 画像(縦 × 横の画素値) - 重み行列(ニューラルネットの層) - 関係データ(ユーザー × 映画の評価)
2.3.2 行列の和とスカラー倍¶
要素ごと。
2.3.3 行列の積 — 線形代数の心臓¶
これが線形代数の最重要演算。最初は機械的に覚え、後で意味を考えるのが定石。
\(C = AB\) のとき: $\(C_{ij} = \sum_k A_{ik} B_{kj}\)$
つまり「\(A\) の 第 \(i\) 行 と \(B\) の 第 \(j\) 列 の内積」。
計算例: $\(\begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix} = \begin{pmatrix} 1 \cdot 5 + 2 \cdot 7 & 1 \cdot 6 + 2 \cdot 8 \\ 3 \cdot 5 + 4 \cdot 7 & 3 \cdot 6 + 4 \cdot 8 \end{pmatrix} = \begin{pmatrix} 19 & 22 \\ 43 & 50 \end{pmatrix}\)$
A の第 1 行 [1, 2] と B の第 1 列 [5, 7] の内積 → C[1,1] = 19
A の第 1 行 [1, 2] と B の第 2 列 [6, 8] の内積 → C[1,2] = 22
A の第 2 行 [3, 4] と B の第 1 列 [5, 7] の内積 → C[2,1] = 43
A の第 2 行 [3, 4] と B の第 2 列 [6, 8] の内積 → C[2,2] = 50
サイズの整合性¶
\(A\) が \(m \times k\)、\(B\) が \(k \times n\) のとき、積 \(AB\) は \(m \times n\)。\(A\) の列数と \(B\) の行数が一致 する必要があります。
重要な性質¶
- 結合律: \((AB)C = A(BC)\)
- 分配律: \(A(B + C) = AB + AC\)
- 非可換: \(AB \neq BA\) が一般(順序が大事!)
- 単位行列 \(I\)(対角 1、他 0)について \(AI = IA = A\)
2.3.4 行列を「写像」として見る¶
行列の本当の意味はここにあります。\(\mathbf{y} = A\mathbf{x}\) は「ベクトル \(\mathbf{x}\) を行列 \(A\) で別のベクトルに変換する」操作。
行列 = 「線形写像」。ベクトル空間 \(\mathbb{R}^n\) から \(\mathbb{R}^m\) への、ある特殊な変換です。
2.3.5 例: 2D 回転行列¶
平面のベクトルを角度 \(\theta\) だけ回転させる行列: $\(R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}\)$
例 (90 度回転): \(\theta = 90°\) で \(\cos = 0\), \(\sin = 1\): $\(R(90°) = \begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix}\)$
ベクトル \((1, 0)\) にかけると: $\(\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \end{pmatrix}\)$
\(x\) 軸方向の単位ベクトルが、\(y\) 軸方向に変わりました。回転が行列の掛け算でできる――これが 3D ゲーム、ロボティクス、CG のすべての基礎です。
\(x\) 軸方向の単位ベクトル \((1, 0)\) が、\(y\) 軸方向 \((0, 1)\) に 90° 反時計回りに回転 しました。これが回転行列の効果。
2.3.6 行列で表せる変換いろいろ¶
| 行列 | 効果 |
|---|---|
| \(\begin{pmatrix} 2 & 0 \\ 0 & 2 \end{pmatrix}\) | 全方向 2 倍に拡大 |
| \(\begin{pmatrix} -1 & 0 \\ 0 & 1 \end{pmatrix}\) | \(y\) 軸についての反転(鏡映) |
| \(\begin{pmatrix} 1 & k \\ 0 & 1 \end{pmatrix}\) | 剪断(せんだん、平行四辺形に歪める) |
| \(R(\theta)\) | 回転 |
これらを組み合わせれば、ほとんどあらゆる「まっすぐな変換」が作れます。3D ゲーム / CG ではキャラの動きを 4×4 行列で表現し、ボタン 1 回押すごとに行列の積で姿勢を更新します。
2.3.7 転置・逆行列¶
転置 (transpose): 行と列を入れ替えた行列。\(A^T\) と書く。 $\(\begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix}^T = \begin{pmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{pmatrix}\)$
性質: \((AB)^T = B^T A^T\)(順番が逆になる)。
逆行列 (inverse): \(AA^{-1} = A^{-1}A = I\) となる行列。 - 正方行列で \(\det A \neq 0\) のとき存在。 - 「写像 \(A\) を巻き戻す」操作。 - 連立方程式 \(A\mathbf{x} = \mathbf{b}\) の解は \(\mathbf{x} = A^{-1}\mathbf{b}\)(理論的には)。
ただし、数値計算で「逆行列を陽に求める」のは効率も精度も悪い手段です。実務では LU 分解や QR 分解、共役勾配法を使います。
2.4 連立 1 次方程式 — ガウスの消去法¶
2.4.1 連立方程式 = 行列方程式¶
中学で習った $\(\begin{cases} 2x + y = 5 \\ x - y = 1 \end{cases}\)$ は、行列形式で $\(\begin{pmatrix} 2 & 1 \\ 1 & -1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 5 \\ 1 \end{pmatrix}\)$ $\(\Leftrightarrow A\mathbf{x} = \mathbf{b}\)$
つまり「行列を使えば、何変数の連立方程式も同じ枠組みで扱える」。
2.4.2 ガウスの消去法¶
行を足し引きして「上三角」にする手続き。
例: $\(\begin{cases} 2x + y + z = 8 \\ x + 3y + 2z = 13 \\ 3x + y - z = 4 \end{cases}\)$
拡大係数行列: $\(\left(\begin{array}{ccc|c} 2 & 1 & 1 & 8 \\ 1 & 3 & 2 & 13 \\ 3 & 1 & -1 & 4 \end{array}\right)\)$
第 1 行を使って、他の行の \(x\) を消去(割り算してから引く): $\(\left(\begin{array}{ccc|c} 2 & 1 & 1 & 8 \\ 0 & 5/2 & 3/2 & 9 \\ 0 & -1/2 & -5/2 & -8 \end{array}\right)\)$
第 2 行で \(y\) を消去: $\(\left(\begin{array}{ccc|c} 2 & 1 & 1 & 8 \\ 0 & 5/2 & 3/2 & 9 \\ 0 & 0 & -2.2 & -6.2 \end{array}\right)\)$
下から代入していけば \(z, y, x\) の順に解が出ます。
計算量: \(O(n^3)\)。これがあらゆる線形ソルバの基礎です。
2.4.3 解の状況は 3 通り¶
- ただ 1 つ: \(A\) が正則(フルランク)
- 無限個: \(A\) が「足りない」、自由度が残る
- 解なし: \(\mathbf{b}\) が \(A\) の表現できる範囲の外
幾何的には:
2.5 ベクトル空間と部分空間¶
2.5.1 ベクトル空間とは¶
「足し算」と「スカラー倍」について 閉じている 集合。\(\mathbb{R}^n\) が代表ですが、もっと広く:
- 多項式の集合 (\(x^2 + 3x + 1\) など)
- 関数の集合
- 行列の集合
これらすべてベクトル空間です。「ベクトル」は単なる数の並びを超えた抽象概念です。
2.5.2 行列に付随する空間¶
行列 \(A\) について、いくつか重要な部分空間があります。
- 列空間 \(\operatorname{Col}(A)\): \(A\) の列が張る空間。\(A\mathbf{x}\) で表せる出力の集まり。
- 零空間 \(\operatorname{Null}(A)\): \(A\mathbf{x} = \mathbf{0}\) となる \(\mathbf{x}\) 全体。
次元定理 (Rank-Nullity Theorem): $\(\dim \operatorname{Col}(A) + \dim \operatorname{Null}(A) = n\)$
「情報を保つ次元 + 失う次元 = 入力次元」と読めます。データ圧縮や次元削減の理論的根拠。
2.6 線形独立・基底・次元¶
2.6.1 線形独立¶
ベクトル \(\mathbf{v}_1, \ldots, \mathbf{v}_k\) が 線形独立 とは: $\(c_1 \mathbf{v}_1 + \cdots + c_k \mathbf{v}_k = \mathbf{0} \;\Longleftrightarrow\; c_1 = \cdots = c_k = 0\)$
「お互いを線形結合で表せない」という意味。
例: - \(\mathbf{e}_1 = (1, 0)\) と \(\mathbf{e}_2 = (0, 1)\) は線形独立。 - \((1, 2)\) と \((2, 4)\) は線形従属(後者は前者の 2 倍)。
2.6.2 基底¶
ベクトル空間を張る、線形独立なベクトル集合。
\(\mathbb{R}^3\) の標準基底: \(\mathbf{e}_1 = (1,0,0)\), \(\mathbf{e}_2 = (0,1,0)\), \(\mathbf{e}_3 = (0,0,1)\)。
重要事実: 任意のベクトルは基底の線形結合で 一意に 表せる。これが「座標」の正体。
2.6.3 次元¶
基底の要素数。\(\mathbb{R}^n\) の次元は \(n\)。これは表現に必要な「自由度」の数。
身近な例: - 平面 (\(\mathbb{R}^2\)): 2 次元 ← 緯度・経度 - 空間 (\(\mathbb{R}^3\)): 3 次元 ← x, y, z - 動画の 1 フレーム (HD): 約 200 万次元 ← 画素数 - ChatGPT の単語埋め込み: 768 次元など
2.7 行列式¶
行列式 (determinant) \(\det(A)\) は正方行列に付随する 1 つの数。
2 × 2: $\(\det\begin{pmatrix} a & b \\ c & d \end{pmatrix} = ad - bc\)$
3 × 3 はサラスの公式。一般には余因子展開で \(O(n!)\) かかるが、LU 分解で \(O(n^3)\)。
意味¶
- \(\det(A) = 0\) ⇔ \(A\) は特異(逆行列なし)
- 幾何的には「\(A\) で写像したとき、図形の体積が何倍になるか」(符号付き)。
- 符号は「向きが反転したか」を示す。
性質¶
- \(\det(AB) = \det(A) \det(B)\)
- \(\det(A^T) = \det(A)\)
- 1 つの行に他の行の定数倍を足しても変わらない
- 行を入れ替えると符号が反転
2.8 固有値・固有ベクトル — 「変わらない方向」¶
2.8.1 定義¶
正方行列 \(A\) について、\(\mathbf{v} \neq \mathbf{0}\) で $\(A\mathbf{v} = \lambda \mathbf{v}\)$ となる \(\lambda\) を 固有値、\(\mathbf{v}\) を 固有ベクトル という。
「\(A\) をかけても向きが変わらない方向」と「その方向の伸縮率」。
2.8.2 求め方¶
特性方程式 \(\det(A - \lambda I) = 0\) を解いて固有値を求め、各 \(\lambda\) について \((A - \lambda I)\mathbf{v} = 0\) を解いて固有ベクトル。
例: \(A = \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix}\) $\(\det(A - \lambda I) = (2-\lambda)^2 - 1 = \lambda^2 - 4\lambda + 3 = 0\)$ $\(\lambda = 1, 3\)$
それぞれに対し固有ベクトル: - \(\lambda = 1\): \(\mathbf{v} = (1, -1)\) - \(\lambda = 3\): \(\mathbf{v} = (1, 1)\)
2.8.3 対角化¶
\(n\) 個の独立な固有ベクトルがあれば、\(P = [\mathbf{v}_1, \ldots, \mathbf{v}_n]\) と \(D = \operatorname{diag}(\lambda_1, \ldots, \lambda_n)\) で $\(A = PDP^{-1}\)$
これにより \(A^k = PD^kP^{-1}\) が一気に速く計算できる (\(D^k\) は対角を \(k\) 乗するだけ)。マルコフ連鎖の長期挙動、漸化式の閉じた解、微分方程式の解析に必須。
2.8.4 PageRank — 固有ベクトルの大ヒット応用¶
Google 創業時のアルゴリズム。Web 全体を 1 つの巨大な行列 \(M\)(誰が誰へリンクしているか)で表し、定常状態のベクトル \(\pi\) (\(M\pi = \pi\)) を 固有値 1 の固有ベクトル として求める。
これが各ページの「重要度スコア」。インターネットを線形代数で順序付ける――1998 年、ラリー・ペイジとセルゲイ・ブリンが Stanford で発表した論文が世界を変えました。
2.8.5 PCA — データの主軸を見つける¶
主成分分析 (PCA) は、データの分散が最大の方向を見つける手法。
数学的には「共分散行列の固有ベクトル」。固有値の大きい順に主軸が決まります。
応用: - 画像圧縮 - 顔認識(Eigenfaces) - 高次元データの可視化(768 次元 → 2 次元の散布図) - 異常検知
2.8.6 スペクトル定理¶
対称行列の固有値はすべて実数で、固有ベクトルは互いに直交する。
これは PCA、量子力学、最適化、統計の基礎定理です。
2.9 直交性と直交行列¶
2.9.1 直交¶
2 つのベクトルが直交 ⇔ 内積が 0。
「正規直交基底」は、互いに直交し長さが 1 の基底。\(\mathbb{R}^n\) の標準基底はこれの代表。
2.9.2 直交行列¶
\(Q^T Q = I\) を満たす行列。性質: - 列が正規直交 - 写像として 長さと角度を保つ - 回転と鏡映を表す - \(\det(Q) = \pm 1\)
3D グラフィックスの「カメラ姿勢」、ロボットアームの回転、座標変換。
2.9.3 グラム-シュミット法¶
任意の基底から正規直交基底を作る手順。「射影 → 残りを取る → 正規化」を繰り返す。
これが QR 分解の基礎で、最小二乗法の数値解法に使われます。
2.10 特異値分解 (SVD) — 線形代数の最終兵器¶
任意の \(m \times n\) 行列 \(A\) に対し $\(A = U \Sigma V^T\)$ と分解できる。 - \(U\): \(m \times m\) 直交行列 - \(\Sigma\): \(m \times n\) 対角行列(対角に「特異値」) - \(V\): \(n \times n\) 直交行列
特異値 \(\sigma_i\) は非負の実数で、大きい順に並ぶのが慣例。
2.10.1 直感¶
任意の線形写像は「回転 → 伸縮 → 回転」に分解できる。これが SVD の幾何的意味。
2.10.2 応用¶
低ランク近似¶
大きい特異値のいくつかだけ残し、小さいのは捨てる: $\(A \approx U_k \Sigma_k V_k^T\)$
これが「情報を保ったままサイズを縮める」最適な方法(Eckart-Young の定理)。
応用: - 画像圧縮(特異値の大きい数十個で十分) - レコメンドシステム(Netflix Prize の優勝アルゴリズム) - 自然言語処理の潜在意味解析 (LSA) - データのノイズ除去
疑似逆行列・最小二乗法¶
逆行列がない(正方でない、特異)行列でも「最良の逆」を SVD から構築できる。これが線形回帰の数値的に安定な解法です。
PCA との関係¶
データ行列 \(X\) の特異値分解から、主成分が直接得られます。SVD と PCA はほぼ同じ計算。
2.10.3 SVD 1 つ覚えれば、線形代数の応用の半分が分かる¶
主成分分析、潜在意味解析、レコメンド、画像圧縮、データ圧縮、最小二乗、ノイズ除去、次元削減――SVD は 「データの本質的な軸を取り出す」万能ツール です。
2.11 内積空間と射影¶
2.11.1 射影¶
ベクトル \(\mathbf{b}\) をベクトル \(\mathbf{a}\) の方向に「影を落とす」操作: $\(\operatorname{proj}_{\mathbf{a}} \mathbf{b} = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a} \cdot \mathbf{a}} \mathbf{a}\)$
部分空間への射影に拡張すると、最小二乗法 になります:
「観測 \(\mathbf{b}\) と \(A\mathbf{x}\) が完全には合わないとき、距離が最も小さい \(\mathbf{x}\) を求める」
正規方程式: \(A^T A \mathbf{x} = A^T \mathbf{b}\)
これが線形回帰の閉じた解。機械学習の最も基本的な学習ルール。
2.12 二次形式と半正定値性¶
\(Q(\mathbf{x}) = \mathbf{x}^T A \mathbf{x}\)(\(A\) は対称)の形を 二次形式 という。
- \(A\) の固有値がすべて正 → 正定値、お椀型
- 0 以上 → 半正定値
機械学習でカーネル関数として使われる行列は半正定値。最適化のヘッセ行列の正定値性が「極小であるかどうか」を決めます(第 3 章)。
2.13 数値計算上の注意¶
線形代数を「手」で計算するのと、「コンピュータ」で計算するのは別物です。
2.13.1 浮動小数点と桁落ち¶
\(10^{16}\) のオーダーの数と 1 の足し算は、double では誤差で 1 が消えます。ガウス消去のピボット選択 が誤差を最小化する技法。
2.13.2 条件数¶
行列が「ほぼ特異」だと、解が入力の小さな誤差に過剰反応する。条件数が大きい行列を扱うときは注意。
2.13.3 NumPy で試す¶
import numpy as np
A = np.array([[2, 1], [1, 2]])
b = np.array([5, 4])
x = np.linalg.solve(A, b) # 連立方程式を解く
print(x) # [2. 1.]
w, v = np.linalg.eig(A) # 固有値・固有ベクトル
print(w) # [3. 1.]
print(v) # 固有ベクトルが列に
U, s, Vt = np.linalg.svd(A) # SVD
print(s) # [3. 1.]
線形代数の計算は NumPy・SciPy の関数を呼ぶ のが標準。手で計算するのは中身を理解するため。実装は専門ライブラリに任せましょう(数値安定性が圧倒的に違います)。
2.14 演習問題¶
- \(\mathbf{a} = (1, 2, 2)\)、\(\mathbf{b} = (2, 0, 1)\) の内積、ノルム、なす角の余弦を求めよ。
- \(\mathbf{a}\) への \(\mathbf{b}\) の射影を計算せよ。
- \(A = \begin{pmatrix}2 & 1 \\ 1 & 2\end{pmatrix}\) の固有値・固有ベクトルを求め、対角化せよ。
- \(A = \begin{pmatrix}1 & 2 \\ 3 & 4\end{pmatrix}\) の逆行列と行列式を求めよ。
- 連立方程式 \(x + 2y = 5\), \(3x + y = 10\) を行列を用いて解け。
- 2D で 30° 回転して \(x\) 軸方向に 2 倍する変換を、行列の積で表せ。
- ベクトル \((1,1,0), (1,0,1), (0,1,1)\) が線形独立か判定せよ。
- SVD が低ランク近似を最適にする理由を、\(\Sigma\) の小さい特異値を切り捨てる議論で説明せよ。
- NumPy で 2024 × 2024 の乱数行列を作り、特異値分解を実行し、上位 10 個の特異値だけを残した低ランク近似と元行列の差のフロベニウスノルムを計算するスクリプトを書け。
- 100 人 × 1000 商品の評価行列があるとき、SVD で 10 次元に圧縮するとサイズはどれだけ縮むか計算せよ。
2.15 この章のまとめ¶
線形代数は「ベクトル空間 + 線形写像 = 行列」という枠組みでデータを操作する数学。
| 概念 | 役割 |
|---|---|
| ベクトル | 数の並び、矢印、特徴量 |
| 行列 | 線形写像、変換 |
| 連立方程式 | \(A\mathbf{x} = \mathbf{b}\) で統一 |
| 固有値 | 「変わらない方向」と「伸縮率」 |
| SVD | 任意行列を「回転 → 伸縮 → 回転」に分解 |
| 直交 | 垂直、独立、座標系の基準 |
3D グラフィックス、機械学習、検索、量子計算、信号処理――すべてベクトルと行列の演算で動いています。「データを並べて、まとめて変換する」発想を身につけた瞬間、CS の風景が一変 します。
2.16 次に読むもの¶
- 動画: 3Blue1Brown『Essence of Linear Algebra』(YouTube、必見)
- 教科書:
- Strang, Introduction to Linear Algebra / MIT 18.06 講義
- Axler, Linear Algebra Done Right — 行列式を後回しにする数学的アプローチ
- エンジニア向け:
- 平岡和幸・堀玄『プログラミングのための線形代数』
- 応用:
- Boyd & Vandenberghe, Convex Optimization
- Murphy, Probabilistic Machine Learning
🌟 メッセージ 線形代数は、最初は計算の繰り返しに見えるかもしれません。でも「矢印・回転・伸縮」という幾何の直感をベースに置くと、急に絵として見えてきます。3Blue1Brown の動画を 1 周見るだけで、世界が変わります。