線性代數 (Linear Algebra)

當初在學線性代數的時候沒學好, 希望未來有機會可以理解它 … QQ

核心問題

  • 線性系統

  • 最小平方法

  • 特徵值與特徵向量

  • 奇異值分解

線性系統

核心問題:

線性系統

重要觀念:
  • 線性方程式(Linear Equation)

  • 矩陣代數

  • 向量空間(Vector Space)

應用:
  • 解 N 元一次方程式

NumPy:

numpy.linalg.solve

SymPy:

Matrix.solve

給定一 m x n 階的矩陣 Am 維的常數向量 b , 求 n 維的向量 x , 使得 A x = b

m 個點,每個點維度為 n, 解方程式 (最少需要 n 個點)。

NumPy 使用範例-linalg.solve

>>> import numpy as np
>>> A = np.matrix('1 2 3; 1 3 8; 3 5 7')
>>> b = np.array([14, 31, 34])
>>> x = np.linalg.solve(A, b)
>>> x
array([ 1.,  2.,  3.])

SymPy 使用範例-Matrix.solve

>>> import sympy
>>> sympy.init_printing(use_unicode=True)
>>> A = sympy.Matrix([[1, 2, 3], [1, 3, 8], [3, 5, 7]])
>>> b = sympy.Matrix([14, 31, 34])
>>> A
⎡1  2  3⎤
⎢       ⎥
⎢1  3  8⎥
⎢       ⎥
⎣3  5  7⎦
>>> b
⎡14⎤
⎢  ⎥
⎢31⎥
⎢  ⎥
⎣34⎦
>>> A.solve(b)
⎡1⎤
⎢ ⎥
⎢2⎥
⎢ ⎥
⎣3⎦

最小平方法

核心問題:

最小平方法

重要觀念:
  • 線性變換

  • 內積空間

應用:
  • 線性回歸

NumPy:

numpy.linalg.lstsq

SymPy:

Matrix.solve_least_squares

給定一 m x n 階的矩陣 Am 維的常數向量 b , 求 n 維的向量 x-hat , 使得 b - A x-hat ∥² 有最小值。

m 個點,每個點維度為 n, 解線性回歸。

NumPy 使用範例-linalg.lstsq

>>> import numpy as np
>>> A = np.matrix('1 2 3; 4 5 6; 7 8 9')
>>> b = np.array([1, 2, 3])
>>> np.linalg.solve(A, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/venv/lib/python3.5/site-packages/numpy/linalg/linalg.py", line 384, in solve
    r = gufunc(a, b, signature=signature, extobj=extobj)
  File "/home/user/venv/lib/python3.5/site-packages/numpy/linalg/linalg.py", line 90, in _raise_linalgerror_singular
    raise LinAlgError("Singular matrix")
numpy.linalg.linalg.LinAlgError: Singular matrix
>>> x = np.linalg.lstsq(A, b)
>>> x
(array([-0.05555556,  0.11111111,  0.27777778]),
 array([], dtype=float64),
 2,
 array([  1.68481034e+01,   1.06836951e+00,   4.41842475e-16]))

SymPy 使用範例-Matrix.solve_least_squares

>>> import sympy
>>> sympy.init_printing(use_unicode=True)
>>> A = sympy.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> b = sympy.Matrix([1, 2, 3])
>>> A
⎡1  2  3⎤
⎢       ⎥
⎢4  5  6⎥
⎢       ⎥
⎣7  8  9⎦
>>> b
⎡1⎤
⎢ ⎥
⎢2⎥
⎢ ⎥
⎣3⎦
>>> A.solve_least_squares(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/venv/lib/python3.5/site-packages/sympy/matrices/matrices.py", line 991, in solve_least_squares
    return self.cholesky_solve(rhs)
  File "/home/user/venv/lib/python3.5/site-packages/sympy/matrices/matrices.py", line 861, in cholesky_solve
    Y = L._lower_triangular_solve(rhs)
  File "/home/user/venv/lib/python3.5/site-packages/sympy/matrices/dense.py", line 420, in _lower_triangular_solve
    raise TypeError("Matrix must be non-singular.")
TypeError: Matrix must be non-singular.

# TODO !

特徵值與特徵向量(Eigenvalues & Eigenvectors)

核心問題:

特徵值與特徵向量

重要觀念:
  • 行列式

  • 特徵分析

  • 典型形式

應用:

NumPy:

numpy.linalg.eig

SymPy:

Matrix.eigenvals, Matrix.eigenvects

Markov Matrices

NumPy 使用範例-linalg.eig

>>> import numpy as np
>>> A = np.matrix('1 2 3; 4 5 6; 7 8 9')
>>> (eigenvalues, eigenvectors) = np.linalg.eig(A)
>>> eigenvalues
array([  1.61168440e+01,  -1.11684397e+00,  -1.30367773e-15]
>>> eigenvectors
matrix([[-0.23197069, -0.78583024,  0.40824829],
        [-0.52532209, -0.08675134, -0.81649658],
        [-0.8186735 ,  0.61232756,  0.40824829]])

SymPy 使用範例-Matrix.eigenvals、Matrix.eigenvects

>>> import sympy
>>> sympy.init_printing(use_unicode=True)
>>> A = sympy.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> A
⎡1  2  3⎤
⎢       ⎥
⎢4  5  6⎥
⎢       ⎥
⎣7  8  9⎦
>>> eigenvalues = A.eigenvals()
>>> eigenvalues
⎧      15   3⋅√33       3⋅√33   15   ⎫
⎨0: 1, ── + ─────: 1, - ───── + ──: 1⎬
⎩      2      2           2     2    ⎭
>>> eigenvectors = A.eigenvects(simplify=True)
>>> eigenvectors
⎡                ⎛               ⎡⎡      ⎛    4         ⎞                ⎤⎤⎞
⎢                ⎜               ⎢⎢   64⋅⎜────────── + 1⎟                ⎥⎥⎟
⎢                ⎜15   3⋅√33     ⎢⎢      ⎝13 + 3⋅√33    ⎠          6     ⎥⎥⎟
⎢⎛0, 1, ⎡⎡1 ⎤⎤⎞, ⎜── + ─────, 1, ⎢⎢───────────────────────── + ──────────⎥⎥⎟,
⎢⎜      ⎢⎢  ⎥⎥⎟  ⎜2      2       ⎢⎢(11 + 3⋅√33)⋅(13 + 3⋅√33)   13 + 3⋅√33⎥⎥⎟
⎢⎜      ⎢⎢-2⎥⎥⎟  ⎜               ⎢⎢                                      ⎥⎥⎟
⎢⎜      ⎢⎢  ⎥⎥⎟  ⎜               ⎢⎢            ⎛    4         ⎞          ⎥⎥⎟
⎢⎝      ⎣⎣1 ⎦⎦⎠  ⎜               ⎢⎢         16⋅⎜────────── + 1⎟          ⎥⎥⎟
⎢                ⎜               ⎢⎢            ⎝13 + 3⋅√33    ⎠          ⎥⎥⎟
⎢                ⎜               ⎢⎢         ───────────────────          ⎥⎥⎟
⎢                ⎜               ⎢⎢              11 + 3⋅√33              ⎥⎥⎟
⎢                ⎜               ⎢⎢                                      ⎥⎥⎟
⎣                ⎝               ⎣⎣                  1                   ⎦⎦⎠

⎛                 ⎡⎡                     ⎛     4         ⎞   ⎤⎤⎞⎤
⎜                 ⎢⎢                  64⋅⎜─────────── + 1⎟   ⎥⎥⎟⎥
⎜  3⋅√33   15     ⎢⎢     6               ⎝-3⋅√33 + 13    ⎠   ⎥⎥⎟⎥
⎜- ───── + ──, 1, ⎢⎢─────────── + ───────────────────────────⎥⎥⎟⎥
⎜    2     2      ⎢⎢-3⋅√33 + 13   (-3⋅√33 + 11)⋅(-3⋅√33 + 13)⎥⎥⎟⎥
⎜                 ⎢⎢                                         ⎥⎥⎟⎥
⎜                 ⎢⎢             ⎛     4         ⎞           ⎥⎥⎟⎥
⎜                 ⎢⎢          16⋅⎜─────────── + 1⎟           ⎥⎥⎟⎥
⎜                 ⎢⎢             ⎝-3⋅√33 + 13    ⎠           ⎥⎥⎟⎥
⎜                 ⎢⎢          ────────────────────           ⎥⎥⎟⎥
⎜                 ⎢⎢              -3⋅√33 + 11                ⎥⎥⎟⎥
⎜                 ⎢⎢                                         ⎥⎥⎟⎥
⎝                 ⎣⎣                    1                    ⎦⎦⎠⎦

奇異值分解

核心問題:

奇異值分解

重要觀念:
  • 二次型

應用:

NumPy:

numpy.linalg.svd

SymPy:

Matrix.singular_values

NumPy 使用範例-linalg.svd

>>> import numpy as np
>>> A = np.matrix('1 2 3; 4 5 6; 7 8 9')
>>> (U, S, V) = np.linalg.svd(A)
>>> U
matrix([[-0.21483724,  0.88723069,  0.40824829],
        [-0.52058739,  0.24964395, -0.81649658],
        [-0.82633754, -0.38794278,  0.40824829]])
>>> S
array([  1.68481034e+01,   1.06836951e+00,   4.41842475e-16])
>>> V
matrix([[-0.47967118, -0.57236779, -0.66506441],
        [-0.77669099, -0.07568647,  0.62531805],
        [-0.40824829,  0.81649658, -0.40824829]])

SymPy 使用範例-Matrix.singular_values

>>> import sympy
>>> sympy.init_printing(use_unicode=True)
>>> A = sympy.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> A
⎡1  2  3⎤
⎢       ⎥
⎢4  5  6⎥
⎢       ⎥
⎣7  8  9⎦
>>> S = A.singular_values()
>>> S
⎡    _______________      _________________   ⎤
⎢   ╱ 3⋅√8881   285      ╱   3⋅√8881   285    ⎥
⎢  ╱  ─────── + ─── ,   ╱  - ─────── + ─── , 0⎥
⎣╲╱      2       2    ╲╱        2       2     ⎦

參考

Visualization

Implementation