5. Ôn tập đại số tuyến tính (2/3)
17 Nov 2021Ma trận hiểu đơn giản nó sẽ ghép nhiều vector để thành một ma trận. Việc một vector chỉ lưu trữ được một biến phụ thuộc, nhưng ma trận sẽ lưu trữ được nhiều biến hơn. Kí hiệu: $\mathbf{A} \in R^{m \times n}$ - tức ma trận A gồm $m$ hàng và $n$ cột.
\[\begin{split}\mathbf{A}=\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \\ \end{bmatrix}\end{split}\]Trong numpy, ma trận sẽ là một mảng 2 chiều. Vì vậy để truy xuất một phần tử, ta sử dụng $\mathbf{A_{ij}}$ trong đó $i$ chỉ vị trí hàng, $j$ chỉ vị trí cột. Để lấy toàn bộ hàng $i$, sử dụng: $\mathbf{A_{i:}}$ và lấy toàn bộ cột $j$, sử dụng: $\mathbf{A_{:j}}$.
Thao tác với numpy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[-1,0,1]])
# Chiều của ma trận A
print("Shape of A: ", A.shape)
>>> Shape of A: (4, 3)
# Truy xuất phần tử hàng 2, cột 3
# Trong numpy, vị trí hàng và cột bắt đầu từ 0
print("A[2][3] = ", A[1][2])
>>> A[2][3] = 6
# Lấy toàn bộ hàng 1
print("Hàng 1: ", A[:1,:])
>>> Hàng 1: [[1, 2, 3]]
# Lấy toàn bộ cột 2
print("Cột 2: ", A[:,1:2])
>>> Cột 2: [[2], [5], [8],[0]]
Hai ma trận có cùng kích thước chúng ta có thể thực hiện các phép cộng, trừ tương tự như vector.
Nhưng với phép nhân ma trận, có 2 phép tính cần cần lưu ý:
Tính chất đối với phép nhân thông thường:
Thao tác với python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
A = np.array([[1, 2, 3],
[3, 2, 1]])
B = np.array([[2, 1, 2],
[1, 3, 0]])
# Element-wise multiplication
print("Element-wise multiplication: ",A*B)
>>> Element-wise: [[2 2 6]
[3 6 0]]
X = np.array([[1, 2, 3],
[3, 2, 1]])
Y = np.array([[2, 1],
[1, 3],
[1, 1]])
# Dot multiplication
print("Dot multiplication: ",X.dot(Y))
>>> Dot multiplication: [[ 7 10]
[ 9 10]]
Ma trận vuông (square matrix): Ma trận vuông là ma trận có số hàng bằng số cột. Cho $\mathbf{A} \in \mathbb{R}^{m \times n}$ thì $m = n$.
Ma trận đơn vị (identity matrix): là ma trận vuông và có các phần tử nằm trên đường chéo chính bằng 1 và các phần tử còn lại bằng 0. Kí hiệu: $\mathbf{I_n} \in \mathbb{R}^{n \times n}$, ví dụ $\mathbf{I_3}$:
Thao tác với numpy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
A = np.array([[1, 2, 3],
[0, 2, 1],
[4, 5, 6]])
# Ma trận chuyển vị
print("Tranpose of A: ",A.T)
>>> Tranpose of A: [[1 0 4]
[2 2 5]
[3 1 6]]
# Ma trận đơn vị
identity_matrix = np.identity(3)
print("Identity matrix: ",identity_matrix)
>>> Identity matrix: [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
# Ma trận nghịch đảo
A_inv = np.linalg.inv(A)
print("Inverse of A: ",A_inv)
>>> Inverse of A: [[-0.77777778 -0.33333333 0.44444444]
[-0.44444444 0.66666667 0.11111111]
[ 0.88888889 -0.33333333 -0.22222222]]
Định thức (determinant) của một ma trận $\mathbf{A} \in \mathbb{R}^{n \times n}$ vuông cấp $n$
\[\mathbf{A}=\begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \dots & \dots & \ddots & \dots \\ a_{n1} & a_{n2} & \dots & a_{nn} \\ \end{bmatrix}\]Với $n = 1$, $\det(\mathbf{A})$ bằng chính phần tử đó.
Với $n > 1$, ta có công thức sau:
\[\det(\mathbf{A})= \sum_{i=1}^{m} (-1)^{i+j} a_{ij} \det(\mathbf{A_{ij}})\]trong đó $\mathbf{A_{ij}}$ là ma trận thu được bằng cách xóa hàng $i$ và cột $j$ của ma trận $\mathbf{A}$ hay còn gọi là phần bù đại số của $\mathbf{A}$ ứng với phần tử ở hàng $i$, cột $j$. Thông qua định thức, chúng ta có thể biết được hệ các véc tơ dòng (hoặc cột) của một ma trận là độc lập tuyến tính hay phụ thuộc tuyến tính. (Công thức tính định thức trên không phải là công thức tính theo định nghĩa, công thức tính định thức theo định nghĩa dựa trên số hoán vị từ $1 - n$. Tuy nhiên công thức này khá khó diễn đạt và triển khai ở những ma trận to).
Một số tính chất quan trọng:
Thác tác với numpy
1
2
3
4
5
6
7
A = np.array([[1, 2],
[3, 4]])
det_A = np.linalg.det(A)
print(det_A)
>>> -2.0000000000000004
Cho ma trận $\mathbf{A} \in \mathbb{R}^{m \times n}$ và vector $\mathbf{x} \in \mathbb{R}^n$, ta có:
\[\mathbf{y} = \mathbf{Ax} = \begin{bmatrix} \mathbf{a}^\top_{1} \\ \mathbf{a}^\top_{2} \\ \vdots \\ \mathbf{a}^\top_m \\ \end{bmatrix} \mathbf{x} = \begin{bmatrix} \mathbf{a}^\top_{1} \mathbf{x} \\ \mathbf{a}^\top_{2} \mathbf{x} \\ \vdots \\ \mathbf{a}^\top_m \mathbf{x} \\ \end{bmatrix} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_m \end{bmatrix} \in \mathbb{R}^m\]Một trong những phép tính được sử dụng rất nhiều đó là dot product của ma trận và vector. Phép tính này thường được áp dụng vào những layer cuối của mạng nơ-ron và có tên gọi là fully connected nhằm giảm chiều giữ liệu. Bản chất của phép tính này là một phép biến hình của vector ban đầu sang một hệ không gian mới. Các phép xoay ảnh cũng biến đổi toạ độ các điểm sang không gian mới bằng cách nhân véc tơ toạ độ của chúng với ma trận xoay.
Tổ hợp tuyến tính (linear combination) được định nghĩa như sau. Cho các vector khác 0: $\mathbf{a_1},\mathbf{a_2},…\mathbf{a_m} \in \mathbb{R}^n$ và các số thực $x_1,x_2,…x_m$. Khi đó vector:
\[\mathbf{b} = x_1\mathbf{a_1} + x_2\mathbf{a_2} + ... x_m\mathbf{a_m}\]được gọi là một tổ hợp tuyến tính của $\mathbf{a_1},\mathbf{a_2},…\mathbf{a_m} \in \mathbb{R}^n$ và các số thực $x_1,x_2,…x_m$ được gọi là các hệ số (coefficients).
Xét ma trận $\mathbf{A} = [\mathbf{a_1},\mathbf{a_2}…\mathbf{a_m}] \in \mathbb{R}^{m \times n}$ và vector $\mathbf{x} = [x_1,x_2…x_n]^T$, ta có thể viết lại:
\[\mathbf{b} = \mathbf{Ax}\]và $\mathbf{b}$ là một tổ hợp tuyến tính các cột của $\mathbf{A}$. Hơn nữa $\mathbf{b}$ không là duy nhất, có thể tồn tại nhiều vector $\mathbf{x}$ để thỏa mãn phương trình trên.
Tập hợp tất cả các vector $\mathbf{b}$ có thể biểu diễn được như trên là một tổ hợp tuyến tính của các vector khác 0 $\mathbf{a_1},\mathbf{a_2},…\mathbf{a_m} \in \mathbb{R}^n$ được gọi là không gian sinh (span space), kí hiệu: $span(\mathbf{a_1},\mathbf{a_2},…\mathbf{a_m})$
Lưu ý: Tổ hợp tuyến tính của vector đơn vị (unit vector). Vector $\mathbf{x} \in \mathbb{R}^n$ là tổ hợp tuyến tính của các vector đơn vị tạo nên $\mathbf{x}$
\[\mathbf{x} = x_1\mathbf{e_1} + x_2\mathbf{e_2} + ... + x_n\mathbf{e_n}\]Ví dụ: \(\mathbf{x} = \begin{bmatrix} 1 \\ -1 \\ 2 \end{bmatrix} = 1 \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} + (-1) \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} + 2 \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}\)
Cho hệ vector {$\mathbf{a_1},\mathbf{a_2},…\mathbf{a_m}$} là các vector khác 0 và các hệ số tương ứng $k_1,k_2,..k_m$, với phương trình:
\[k_1\mathbf{a_1} + k_2\mathbf{a_2} + ... + k_m\mathbf{a_m} = 0\]nếu tồn tại duy nhất nghiệm $k_1 = k_2 = … = k_m = 0$ thỏa mãn phương trình trên thì ta gọi hệ vector trên là độc lập tuyến tính (linear independent). Hay nói cách khác, tồn tại duy nhất một tổ hợp tuyến tính với vector hệ số (coefficients) là 0 của vector 0.
ngược lại, nếu tồn tại một nghiệm $k_j \neq 0$ thì ta gọi hệ vector trên là phụ thuộc tuyến tính (linear dependent). Thật vậy, lúc này ta chỉ cần chuyển vế với vector $\mathbf{a_j}$ tương ứng với hệ số (coefficients) $k_j$ sẽ thu được một tổ hợp tuyến tính:
Một hệ các véc tơ {${\mathbf{a}_1, \mathbf{a}_2, \dots, \mathbf{a}_n}$} trong không gian véc tơ $m$ chiều, kí hiệu là $V = \mathbb{R}^{m}$ được gọi là một cơ sở (basis) nếu như điều kiện kiện sau được thoả mãn:
$V \equiv \text{span}(\mathbf{a}_1, \dots, \mathbf{a}_n)$
${\mathbf{a}_1, \mathbf{a}_2, \dots, \mathbf{a}_n}$ là một hệ véc tơ độc lập tuyến tính.
Mỗi một vector $\mathbf{b} \in V$ đều có một biểu diễn duy nhất dưới dạng một tổ hợp tuyển tính của những véc tơ của các $\mathbf{a}_i$.
Trong không gian $n$ chiều, mọi vector có thể biểu diễn thông qua hệ vector đơn vị (unit vector) ($\mathbf{e_1},\mathbf{e_2}…\mathbf{e_n} $). Hơn nữa, việc nhân ma trận với vector được đề cập bên trên cũng sẽ chuyển dịch hệ cơ sở gốc sang một hệ cơ sở mới. Giả sử ma trận $\mathbf{A} \in \mathbb{R}^{m \times n}$ nhân với vector $\mathbf{x} \in \mathbb{R}^n$
\[\mathbf{Ax} = \mathbf{a}^{(1)} x_1 + \mathbf{a}^{(2)} x_2 + ... + \mathbf{a}^{(n)} x_n = \mathbf{y}\]trong đó $\mathbf{a}^{(i)}$ là vector cột $i$. Ta có thể xem như véc tơ $\mathbf{y}$ được biểu diễn thông qua các véc tơ cơ sở cột mà toạ độ tương ứng với mỗi chiều trong hệ cơ sở là các $x_i$.
Xét một ma trận $\mathbf{A} ∈ \mathbb{R}^{m×n}$ . Hạng (rank) của ma trận của ma trận được ký hiệu là $\text{rank}(\mathbf{A})$, được định nghĩa là số lượng lớn nhất các cột (hoặc dòng) của nó tạo thành một hệ độc lập tuyến tính.
Một số tính chất quan trọng:
Thao tác với numpy
1
2
3
4
x = np.array([[1,2,3],
[4,5,6]])
print(np.linalg.matrix_rank(x))
>>> 2
Với một ma trận $\mathbf{A} \in \mathbb{R}^{m \times n}$, norm được dùng nhiều nhất là Frobenius, kí hiệu \(\|\mathbf{X}\|_F\) là căn bậc 2 của tổng bình phương các phần tử trong ma trận.
\[||\mathbf{A}||_F = \sqrt{\sum_{i = 1}^m \sum_{j = 1}^n a_{ij}^2}\]Vết của một ma trận vuông là tổng tất cả các phần tử trên đường chéo chính của nó, được ký hiệu là trace($\mathbf{A}$).
Một số tính chất quan trọng:
trace($\mathbf{A}$) = trace($\mathbf{A^T}$)
trace($\mathbf{AB}$) = trace($\mathbf{BA}$)
\(\|\mathbf{A}\|_F\) = trace($\mathbf{A^TA}$) = trace($\mathbf{AA^T}$) với $\mathbf{A}$ là ma trận bất kì
Cho $\mathbf{A}, \mathbf{B}, \mathbf{C}$ là ba ma trận có kích thước lần lượt là $m \times n$, $n \times p$ và $p \times q$.
Chứng minh: $\mathbf{ABC} = (\mathbf{A}\mathbf{B})\mathbf{C} = \mathbf{A}(\mathbf{B}\mathbf{C})$
Chứng minh: \((\mathbf{A}\mathbf{B})^{\intercal} = \mathbf{B}^{\intercal}\mathbf{A}^{\intercal}\)
Chứng minh cách tương tự câu trên, ta có:
\[((\mathbf{A}\mathbf{B})^{\intercal})_{ij} = (\mathbf{A}\mathbf{B})_{ji} = \sum_{k = 1}^n \mathbf{A}_{jk} \mathbf{B}_{ki} = \sum_{k = 1}^n \mathbf{B}_{ki} \mathbf{A}_{jk} = (\mathbf{B}^{\intercal} \mathbf{A}^{\intercal})_{ij}\]Chứng minh: $\mathbf{A(B+C)} = \mathbf{AB} + \mathbf{BC}$ (lưu ý: phần này ma trận $\mathbf{B}$ và $\mathbf{C}$ có cùng chiều $n \times p$)
\[(\mathbf{A(B+C)})_{ij} = \sum_{k=1}^p \mathbf{A}_{ik} \mathbf{(B+C)}_{kj} = \sum_{k=1}^p (\mathbf{A}_{ik}\mathbf{B}_{kj} + \mathbf{A}_{ik}\mathbf{C}_{kj}) = (\mathbf{AB} + \mathbf{BC})_{ij}\]