🎯 Mục tiêu bài học
Sau bài học này, học viên sẽ:
✅ Hiểu tại sao toán học là nền tảng của Machine Learning
✅ Nắm vững Đại số tuyến tính: Vector, Ma trận, Eigenvalue/Eigenvector
✅ Thành thạo Giải tích: Đạo hàm, Gradient, Gradient Descent
✅ Hiểu Xác suất & Thống kê: Gaussian, Bayes, Covariance
✅ Thực hành NumPy với visualization
✅ Làm được quiz kiểm tra kiến thức
Thời gian: 4-5 giờ | Độ khó: Intermediate
📖 Bảng Thuật Ngữ Quan Trọng
| Thuật ngữ | Tiếng Việt | Giải thích đơn giản |
|---|---|---|
| Vector | Véc-tơ | Mảng 1 chiều chứa các số, biểu diễn features |
| Matrix | Ma trận | Mảng 2 chiều (hàng x cột) chứa dữ liệu |
| Gradient | Đạo hàm véc-tơ | Hướng thay đổi nhanh nhất của hàm số |
| Gradient Descent | Hạ gradient | Thuật toán tối ưu bằng cách đi theo hướng gradient giảm |
| Eigenvalue | Trị riêng | Giá trị cho biết mức độ "kéo giãn" của phép biến đổi |
| Covariance | Hiệp phương sai | Đo mức độ 2 biến thay đổi cùng nhau |
| Gaussian | Phân phối chuẩn | Phân phối hình chuông, phổ biến nhất trong thống kê |
| Loss Function | Hàm mất mát | Hàm đo sai số giữa dự đoán và thực tế |
Checkpoint
Bạn đã làm quen với các thuật ngữ? Hãy ghi nhớ chúng!
📐 Tại sao Toán học quan trọng?
Machine Learning = Toán học + Data + Code
Machine Learning về bản chất là tối ưu hóa:
- Đại số tuyến tính → Biểu diễn data dạng vector/ma trận
- Giải tích → Tìm cực trị (minimize loss function)
- Xác suất & Thống kê → Đánh giá độ chắc chắn
- NumPy → Tính toán nhanh với arrays
0.2 Ví dụ minh họa
| Bài toán ML | Toán học cần dùng | Ví dụ cụ thể |
|---|---|---|
| Linear Regression | Đại số tuyến tính + Giải tích | Tìm đường thẳng y = wx + b tối ưu bằng Gradient Descent |
| Neural Network | Ma trận + Đạo hàm chuỗi | Forward pass: nhân ma trận, Backprop: chain rule |
| K-Means Clustering | Khoảng cách Euclidean | Tính khoảng cách giữa các điểm |
| Naive Bayes | Xác suất có điều kiện | Áp dụng công thức Bayes |
| PCA | Eigenvalue/Eigenvector | Tìm trục chính giảm chiều data |
Lộ trình học Toán cho ML:
- Bước 1: Hiểu tại sao cần toán → ML = Tối ưu hóa toán học
- Bước 2: Đại số tuyến tính → Vector, Ma trận, Eigenvalue
- Bước 3: Giải tích → Đạo hàm, Gradient Descent
- Bước 4: Thống kê → Mean, Variance, Correlation
- Bước 5: Xác suất → Gaussian, Bayes
- Bước 6: NumPy thực hành → Code hóa lý thuyết
- Kết quả: Tự tin áp dụng ML → Hiểu sâu, debug tốt
Checkpoint
Bạn đã hiểu tại sao toán học quan trọng cho ML chưa?
📐 Đại số tuyến tính (Linear Algebra)
💡 Tại sao cần Đại số tuyến tính trong ML?
- Data representation: 1 ảnh 28×28 pixels = vector 784 chiều
- Model parameters: Neural network với 1000 neurons = ma trận weights
- Batch processing: Train với 100 samples cùng lúc = ma trận operations
- Efficiency: NumPy vectorization nhanh hơn Python loops 100x
1.1 Vector và Ma trận
Vector là mảng 1 chiều:
Ma trận là mảng 2 chiều:
💡 Ví dụ thực tế:
1# Vector: 1 sample với 3 features2student = [85, 90, 78] # [Math, Physics, Chemistry]34# Matrix: 4 students với 3 features5class_scores = [6 [85, 90, 78], # Student 17 [92, 88, 95], # Student 28 [78, 85, 82], # Student 39 [88, 92, 90] # Student 410]1.2 Các phép toán cơ bản
| Phép toán | Công thức | Điều kiện | Ví dụ |
|---|---|---|---|
| Cộng ma trận | Cùng kích thước | Ma trận 2x2 + Ma trận 2x2 | |
| Nhân scalar | - | 2 nhân với mỗi phần tử | |
| Nhân ma trận | A: , B: | (2x3) x (3x2) = (2x2) | |
| Transpose | Đổi hàng thành cột | Ma trận 2x3 → 3x2 | |
| Dot product | Cùng độ dài | [1,2,3] · [4,5,6] = 32 |
1.3 Thực hành NumPy
Mô tả: Thực hành các phép toán vector và ma trận với NumPy để nắm vững concept.
1import numpy as np23# Tạo vector4x = np.array([1, 2, 3])5print(f"Vector: {x}")6print(f"Shape: {x.shape}")78# Tạo ma trận9A = np.array([[1, 2, 3],10 [4, 5, 6]])11print(f"Ma trận:\n{A}")12print(f"Shape: {A.shape}")1314# Các phép toán15B = np.array([[7, 8, 9],16 [10, 11, 12]])1718# Cộng19print(f"A + B:\n{A + B}")2021# Nhân scalar22print(f"2 * A:\n{2 * A}")2324# Dot product25a = np.array([1, 2, 3])26b = np.array([4, 5, 6])27print(f"a dot b: {np.dot(a, b)}") # 1*4 + 2*5 + 3*6 = 322829# Nhân ma trận30C = np.array([[1, 2],31 [3, 4],32 [5, 6]])33print(f"A @ C:\n{A @ C}") # (2x3) @ (3x2) = (2x2)3435# Transpose36print(f"A transpose:\n{A.T}")Giải thích chi tiết:
np.array([1,2,3]): Tạo vector 1D (shape = (3,))np.array([[...]]): Tạo ma trận 2D (shape = (rows, cols))A + B: Element-wise addition - cộng từng phần tử tương ứng2 * A: Broadcasting - nhân mỗi phần tử với 2np.dot(a, b): Tích vô hướng = = 1×4 + 2×5 + 3×6 = 32A @ C: Nhân ma trận (operator@=np.matmul())- Quy tắc:
- Số cột A (3) phải bằng số hàng C (3)
A.T: Transpose - đổi hàng thành cột
💡 Mẹo: Luôn kiểm tra shape trước khi nhân ma trận để tránh lỗi dimension mismatch!
1.4 Eigenvalue và Eigenvector
Định nghĩa:
Cho ma trận vuông , nếu tồn tại vector và scalar sao cho:
Thì:
- gọi là Eigenvalue (giá trị riêng)
- gọi là Eigenvector (vector riêng)
Ý nghĩa:
- Eigenvector: Hướng không đổi khi nhân ma trận (chỉ bị co/giãn)
- Eigenvalue: Hệ số co/giãn theo hướng đó
- Ứng dụng: PCA (giảm chiều), Google PageRank, phân tích dao động
Tại sao quan trọng trong ML?
| Ứng dụng | Cách dùng Eigenvalue/Eigenvector |
|---|---|
| PCA (Principal Component Analysis) | Tìm eigenvectors của ma trận covariance để giảm chiều data |
| Spectral Clustering | Dùng eigenvectors của ma trận similarity để phân cụm |
| Stability Analysis | Eigenvalue lớn nhất quyết định tính ổn định của hệ thống |
1.5 Thực hành Eigenvalue/Eigenvector
Mô tả: Tính eigenvalue và eigenvector của ma trận, verify kết quả bằng công thức .
1import numpy as np23# Ma trận 2x24A = np.array([[4, 2],5 [1, 3]])67print("Ma trận A:")8print(A)910# Tính eigenvalues và eigenvectors11eigenvalues, eigenvectors = np.linalg.eig(A)1213print(f"\nEigenvalues: {eigenvalues}")14print(f"\nEigenvectors:\n{eigenvectors}")1516# Verify: A*v = lambda*v17for i in range(len(eigenvalues)):18 v = eigenvectors[:, i]19 lambda_val = eigenvalues[i]20 21 Av = A @ v22 lambda_v = lambda_val * v23 24 print(f"\nEigenvector {i+1}: {v}")25 print(f"A @ v = {Av}")26 print(f"λ × v = {lambda_v}")27 print(f"Equal? {np.allclose(Av, lambda_v)}")Giải thích chi tiết:
-
np.linalg.eig(A): Tính eigenvalues và eigenvectors của ma trận vuông A- Return:
(eigenvalues, eigenvectors)- tuple 2 phần tử eigenvalues: array 1D chứa các eigenvalueeigenvectors: ma trận 2D, mỗi cột là 1 eigenvector
- Return:
-
eigenvectors[:, i]: Lấy cột thứ i (eigenvector thứ i) -
Verify công thức :
- Vế trái:
A @ v- nhân ma trận với eigenvector - Vế phải:
lambda_val * v- nhân eigenvalue với eigenvector - Nếu đúng: 2 vế bằng nhau (check bằng
np.allclose())
- Vế trái:
Kết quả mong đợi:
- Ma trận 2×2 có 2 eigenvalues và 2 eigenvectors
- Công thức được verify thành công
- Eigenvectors chỉ ra các hướng đặc trưng của ma trận A
1.6 Matrix Inverse và Determinant
Determinant (Định thức):
Ý nghĩa:
- Determinant = 0 → Ma trận singular (không khả nghịch)
- Determinant ≠ 0 → Ma trận invertible (khả nghịch)
- Determinant đo "thể tích" biến đổi khi nhân ma trận
Matrix Inverse (Ma trận nghịch đảo):
Ý nghĩa:
- là ma trận "hoàn tác" phép biến đổi của A
- Chỉ tồn tại khi
- Ứng dụng: Giải hệ phương trình →
Mô tả: Tính determinant và inverse của ma trận, verify tính chất .
1import numpy as np23# Ma trận 3x34A = np.array([[1, 2, 3],5 [0, 1, 4],6 [5, 6, 0]])78print("Ma trận A:")9print(A)1011# Tính determinant12det_A = np.linalg.det(A)13print(f"\nDeterminant của A: {det_A:.2f}")1415# Kiểm tra khả nghịch16if det_A != 0:17 print("Ma trận khả nghịch (invertible)")18 19 # Tính inverse20 A_inv = np.linalg.inv(A)21 print(f"\nMa trận nghịch đảo A⁻¹:")22 print(A_inv)23 24 # Verify: A @ A_inv = I (identity matrix)25 I = A @ A_inv26 print(f"\nA @ A⁻¹:")27 print(I)28 print(f"\nĐây có phải ma trận đơn vị? {np.allclose(I, np.eye(3))}")29else:30 print("Ma trận singular (không khả nghịch)")Giải thích chi tiết:
-
np.linalg.det(A): Tính định thức của ma trận A- Ma trận 2×2: với
- Ma trận lớn hơn: dùng thuật toán LU decomposition
-
np.linalg.inv(A): Tính ma trận nghịch đảo- Chỉ hoạt động khi
det(A) ≠ 0 - Nếu
det(A) = 0: raiseLinAlgError(singular matrix)
- Chỉ hoạt động khi
-
Ma trận đơn vị : đường chéo = 1, phần còn lại = 0
np.eye(n): tạo ma trận đơn vị kích thước n×n
-
Verify tính chất :
- Nếu đúng: kết quả là ma trận đơn vị
- Dùng
np.allclose()để so sánh (tránh floating-point errors)
Kết quả mong đợi:
- Determinant khác 0 → ma trận khả nghịch
- cho ma trận đơn vị với 1 trên đường chéo, 0 ở ngoài
Checkpoint
Bạn đã nắm vững vector, ma trận và các phép toán cơ bản chưa?
📊 Thống kê cơ bản (Statistics)
2.1 Các độ đo tập trung (Measures of Central Tendency)
| Độ đo | Công thức | Ý nghĩa |
|---|---|---|
| Mean (Trung bình) | Giá trị trung bình cộng - tổng chia cho số phần tử | |
| Median (Trung vị) | Giá trị giữa | Không bị ảnh hưởng bởi outliers (giá trị ngoại lai) |
| Mode (Đỉnh) | Giá trị xuất hiện nhiều nhất | Phù hợp cho dữ liệu phân loại (categorical data) |
2.2 Các độ đo phân tán (Measures of Dispersion)
Variance (Phương sai):
Ý nghĩa: Phương sai đo lường mức độ phân tán của dữ liệu quanh giá trị trung bình. Phương sai lớn = dữ liệu phân tán rộng, nhỏ = dữ liệu tập trung.
Standard Deviation (Độ lệch chuẩn):
Ý nghĩa: Độ lệch chuẩn là căn bậc 2 của phương sai, cùng đơn vị với dữ liệu gốc (dễ hiểu và diễn giải hơn). Ví dụ: Nếu data là chiều cao (cm), độ lệch chuẩn cũng là cm.
💡 Phân biệt:
- Phương sai: Đơn vị bình phương (ví dụ: cm²) - khó diễn giải
- Độ lệch chuẩn: Cùng đơn vị với data (ví dụ: cm) - dễ hiểu hơn
2.3 Ví dụ tính toán step-by-step
Dữ liệu: [2, 4, 4, 4, 5, 5, 7, 9]
Tính Mean (Trung bình):
Tính Variance (Phương sai):
Tính Standard Deviation (Độ lệch chuẩn):
Giải thích:
- Mean = 5: Giá trị trung bình của dataset
- Variance = 4: Dữ liệu phân tán với phương sai 4
- Std = 2: Trung bình các giá trị lệch khoảng 2 đơn vị so với mean
2.4 Thực hành với NumPy
Mô tả: Tính các chỉ số thống kê mô tả (descriptive statistics) cho dataset.
1import numpy as np23data = np.array([2, 4, 4, 4, 5, 5, 7, 9])45print(f"Mean: {np.mean(data)}")6print(f"Median: {np.median(data)}")7print(f"Variance: {np.var(data)}")8print(f"Std: {np.std(data)}")9print(f"Min: {np.min(data)}")10print(f"Max: {np.max(data)}")11print(f"Percentile 25: {np.percentile(data, 25)}")12print(f"Percentile 75: {np.percentile(data, 75)}")Giải thích:
np.mean(): Trung bình cộng = = 5.0np.median(): Giá trị giữa khi sắp xếp tăng dần (không bị outliers ảnh hưởng) = 4.5np.var(): Phương sai = mức độ phân tán data = 4.0np.std(): Độ lệch chuẩn = (cùng đơn vị với data) = 2.0np.percentile(data, 25): Quartile 1 (Q1) - 25% data nhỏ hơn giá trị này = 4.0np.percentile(data, 75): Quartile 3 (Q3) - 75% data nhỏ hơn giá trị này = 5.5
💡 Ứng dụng: Feature engineering, outlier detection, data normalization
Checkpoint
Bạn đã hiểu rõ mean, variance, standard deviation và cách sử dụng chưa?
📈 Giải tích (Calculus) cho Machine Learning
3.1 Đạo hàm (Derivatives)
Định nghĩa:
Đạo hàm của hàm tại điểm là:
Ý nghĩa:
- Đạo hàm = tốc độ thay đổi của hàm số
- Ứng dụng ML: Tính gradient để tối ưu loss function
Các quy tắc đạo hàm cơ bản:
| Hàm số | Đạo hàm | Ví dụ |
|---|---|---|
| (hằng số) | ||
| Đạo hàm của là chính nó | ||
| Log tự nhiên | ||
| Hàm lượng giác |
Chain Rule (Quy tắc chuỗi):
Ứng dụng: Backpropagation trong Neural Networks
3.2 Gradient (Vector đạo hàm)
Định nghĩa:
Với hàm nhiều biến , gradient là vector các đạo hàm riêng:
Ý nghĩa:
- Gradient chỉ hướng tăng nhanh nhất của hàm số
- Negative gradient chỉ hướng giảm nhanh nhất
- Ứng dụng: Gradient Descent tối ưu model
Ví dụ: Hàm
Tại điểm : gradient = → hàm tăng nhanh nhất theo hướng này.
3.3 Gradient Descent
Ý tưởng:
Tìm minimum của hàm bằng cách di chuyển ngược hướng gradient:
Trong đó:
- : Learning rate (tốc độ học) - quyết định bước nhảy
- : Gradient tại điểm hiện tại
- Lặp đến khi hội tụ (gradient ≈ 0)
Tại sao hiệu quả?
- Gradient chỉ hướng tăng nhanh nhất
- Di chuyển ngược gradient (negative) → đi về minimum
⚠️ Lưu ý quan trọng về Learning Rate:
| Learning Rate | Vấn đề | Giải pháp |
|---|---|---|
| Quá lớn (α > 0.5) | Overshooting, không hội tụ | Giảm α xuống 0.01-0.1 |
| Quá nhỏ (α < 0.001) | Hội tụ chậm, cần nhiều iterations | Tăng α hoặc dùng adaptive learning rate |
| Phù hợp (α = 0.01-0.1) | Hội tụ ổn định | ✅ |
Ví dụ minh họa: Tìm minimum của
Bước 1: Tính đạo hàm:
Bước 2: Update rule:
Bước 3: Lặp:
- Start: , learning rate
- Iteration 1:
- Iteration 2:
- Iteration 3:
- ...
- Convergence: (minimum của )
3.4 Thực hành Gradient Descent
Mô tả: Implement Gradient Descent từ scratch để tìm minimum của .
1import numpy as np2import matplotlib.pyplot as plt34# Hàm số: f(x) = (x-3)^25def f(x):6 return (x - 3)**278# Đạo hàm: f'(x) = 2(x-3)9def df(x):10 return 2 * (x - 3)1112# Gradient Descent13x = 10 # Điểm bắt đầu14learning_rate = 0.115iterations = 201617history = [x] # Lưu lại quá trình1819for i in range(iterations):20 gradient = df(x)21 x = x - learning_rate * gradient22 history.append(x)23 print(f"Iteration {i+1}: x = {x:.4f}, f(x) = {f(x):.4f}, gradient = {gradient:.4f}")2425print(f"\nMinimum tìm được tại x = {x:.4f}")26print(f"Giá trị minimum: f({x:.4f}) = {f(x):.4f}")2728# Visualize29plt.figure(figsize=(12, 4))3031# Plot 1: Function curve32plt.subplot(1, 2, 1)33x_range = np.linspace(0, 10, 100)34plt.plot(x_range, f(x_range), 'b-', label='f(x) = (x-3)²')35plt.scatter(history, [f(h) for h in history], c='red', s=30, zorder=5)36plt.plot(history, [f(h) for h in history], 'r--', alpha=0.5)37plt.xlabel('x')38plt.ylabel('f(x)')39plt.title('Gradient Descent Path')40plt.legend()41plt.grid(True)4243# Plot 2: Convergence44plt.subplot(1, 2, 2)45plt.plot([f(h) for h in history], 'ro-')46plt.xlabel('Iteration')47plt.ylabel('f(x)')48plt.title('Loss Convergence')49plt.grid(True)5051plt.tight_layout()52plt.show()Giải thích chi tiết:
Thuật toán:
- Khởi tạo: (điểm bắt đầu tùy ý)
- Tính gradient: tại điểm hiện tại
- Update: với
- Lặp: Repeat cho đến khi hội tụ
Code breakdown:
df(x): Đạo hàm của hàm số - chỉ hướng tăngx - learning_rate * gradient: Di chuyển ngược gradient để giảmlearning_rate = 0.1: Bước nhảy mỗi iteration- Quá lớn: overshooting (vượt qua minimum)
- Quá nhỏ: hội tụ chậm
history: Lưu tất cả giá trị x qua các iterations để visualize
Visualization:
- Plot 1: Đường cong hàm số + path của Gradient Descent (điểm đỏ)
- Plot 2: Loss giảm dần theo iterations (convergence curve)
Kết quả mong đợi:
- Sau 20 iterations: (minimum thực tế của )
- Loss giảm từ về gần 0
💡 Tại sao quan trọng?
- Machine Learning: Tối ưu weights để minimize loss function
- Deep Learning: Backpropagation = Chain Rule + Gradient Descent
- Real-world: SGD, Adam, RMSprop đều dựa trên Gradient Descent
Checkpoint
Bạn đã hiểu Gradient Descent hoạt động như thế nào chưa?
🔗 Covariance và Correlation
3.1 Covariance (Hiệp phương sai)
Ý nghĩa: Covariance đo lường mối quan hệ tuyến tính giữa 2 biến số:
- : Tương quan thuận (X tăng → Y tăng)
- : Tương quan nghịch (X tăng → Y giảm)
- : Không tương quan tuyến tính
💡 Lưu ý: Covariance phụ thuộc vào scale của data (khó so sánh giữa các biến khác nhau).
3.2 Correlation (Hệ số tương quan Pearson)
Ý nghĩa: Correlation là chuẩn hóa Covariance về khoảng [-1, 1], không phụ thuộc scale.
| Giá trị r | Ý nghĩa |
|---|---|
| r = 1 | Tương quan thuận hoàn hảo (X và Y tăng cùng nhịp) |
| r = -1 | Tương quan nghịch hoàn hảo (X tăng, Y giảm) |
| r = 0 | Không tương quan tuyến tính |
| 0.7 < r < 1 | Tương quan mạnh |
| 0.3 < r < 0.7 | Tương quan vừa |
| r < 0.3 | Tương quan yếu |
💡 Phân biệt:
- Covariance: Đo hướng quan hệ (dương/âm), phụ thuộc scale
- Correlation: Chuẩn hóa về [-1, 1], dễ diễn giải và so sánh hơn
3.3 Thực hành
Mô tả: Đo lường mối quan hệ giữa 2 biến X và Y.
1import numpy as np23X = np.array([1, 2, 3, 4, 5])4Y = np.array([2, 4, 5, 4, 5])56# Covariance7cov_matrix = np.cov(X, Y)8print(f"Covariance Matrix:\n{cov_matrix}")910# Correlation11corr_matrix = np.corrcoef(X, Y)12print(f"Correlation Matrix:\n{corr_matrix}")13print(f"Correlation coefficient: {corr_matrix[0, 1]:.4f}")Giải thích:
np.cov(X, Y): Trả về ma trận covariance 2x2: [[Var(X), Cov(X,Y)], [Cov(Y,X), Var(Y)]]cov_matrix[0, 1]: Covariance giữa X và Y (phần tử off-diagonal)np.corrcoef(X, Y): Correlation matrix (chuẩn hóa covariance về [-1, 1])corr_matrix[0, 1]: Pearson correlation coefficient
Kết quả mong đợi:
- Covariance > 0 vì X và Y có xu hướng tăng cùng nhau
- Correlation gần 1 cho thấy mối quan hệ thuận mạnh
🎲 Phân phối Xác suất (Probability Distributions)
4.1 Normal Distribution (Phân phối chuẩn / Gaussian)
Trong đó:
- : Mean (trung bình) - vị trí trung tâm
- : Standard deviation (độ lệch chuẩn) - độ rộng phân phối
Đặc điểm:
- Hình chuông (bell curve), đối xứng quanh
- 68% data nằm trong
- 95% data nằm trong
- 99.7% data nằm trong (quy tắc 68-95-99.7)
Hình: Normal Distribution với các giá trị sigma khác nhau
💡 Ứng dụng trong ML:
- Gaussian Naive Bayes classifier
- Weight initialization trong Neural Networks
- Noise modeling (giả định nhiễu là Gaussian)
4.2 Bayes' Theorem (Định lý Bayes)
Công thức:
Trong đó:
- : Posterior - xác suất A xảy ra khi biết B đã xảy ra
- : Likelihood - xác suất B xảy ra khi biết A đã xảy ra
- : Prior - xác suất ban đầu của A
- : Evidence - xác suất B xảy ra (normalization constant)
Ý nghĩa: Bayes' Theorem cho phép cập nhật xác suất khi có thông tin mới (từ Prior → Posterior).
Ví dụ thực tế: Medical Test
Bài toán:
- Bệnh X xuất hiện ở 1% dân số:
- Test có độ chính xác 95%:
- False positive rate 5%:
Câu hỏi: Nếu test dương tính, xác suất thực sự bị bệnh là bao nhiêu?
Giải:
Tính (Law of Total Probability):
Thay vào Bayes:
Kết luận: Mặc dù test dương tính, xác suất thực sự bị bệnh chỉ 16.1% (không phải 95%!). Lý do: bệnh hiếm (prior thấp), nên false positives chiếm đa số.
💡 Bài học:
- Prior quan trọng - bệnh hiếm thì posterior cũng thấp dù test chính xác
- Đừng nhầm với (prosecutor's fallacy)
✅ Key Takeaways - Bayes' Theorem:
- Prior matters: Base rate ảnh hưởng lớn đến kết quả
- Update beliefs: Bayes cho phép cập nhật xác suất khi có info mới
- Real-world applications:
- Medical diagnosis (test dương tính ≠ bệnh)
- Spam filtering (từ "free" ≠ spam 100%)
- A/B testing (kết quả tốt ≠ version thắng chắc chắn)
4.3 Thực hành Bayes' Theorem
Mô tả: Simulate medical test với 10,000 người để verify công thức Bayes.
1import numpy as np2import matplotlib.pyplot as plt34# Parameters5n_people = 100006disease_rate = 0.017true_positive = 0.95 # P(Positive | Disease)8false_positive = 0.05 # P(Positive | No Disease)910# Simulate population11has_disease = np.random.rand(n_people) < disease_rate1213# Test results14test_result = np.zeros(n_people, dtype=bool)15for i in range(n_people):16 if has_disease[i]:17 test_result[i] = np.random.rand() < true_positive18 else:19 test_result[i] = np.random.rand() < false_positive2021# Calculate P(Disease | Positive)22positive_tests = test_result23positive_and_diseased = positive_tests & has_disease2425p_disease_given_positive = positive_and_diseased.sum() / positive_tests.sum()2627print(f"Tổng số người: {n_people}")28print(f"Số người bị bệnh: {has_disease.sum()} ({has_disease.mean()*100:.1f}%)")29print(f"Số test dương tính: {positive_tests.sum()}")30print(f"Số test dương tính VÀ bị bệnh: {positive_and_diseased.sum()}")31print(f"\nP(Disease | Positive) = {p_disease_given_positive:.4f} ({p_disease_given_positive*100:.1f}%)")3233# Theoretical value34p_positive = true_positive * disease_rate + false_positive * (1 - disease_rate)35p_disease_given_positive_theory = (true_positive * disease_rate) / p_positive36print(f"Theoretical P(Disease | Positive) = {p_disease_given_positive_theory:.4f} ({p_disease_given_positive_theory*100:.1f}%)")3738# Visualization39fig, axes = plt.subplots(1, 2, figsize=(12, 4))4041# Plot 1: Confusion Matrix42categories = ['True Negative', 'False Positive', 'False Negative', 'True Positive']43counts = [44 (~has_disease & ~test_result).sum(),45 (~has_disease & test_result).sum(),46 (has_disease & ~test_result).sum(),47 (has_disease & test_result).sum()48]49colors = ['green', 'orange', 'red', 'blue']50axes[0].bar(categories, counts, color=colors, alpha=0.7)51axes[0].set_ylabel('Count')52axes[0].set_title('Confusion Matrix')53axes[0].tick_params(axis='x', rotation=45)5455# Plot 2: Conditional Probabilities56probs = {57 'Prior\nP(Disease)': disease_rate,58 'Likelihood\nP(Pos|Disease)': true_positive,59 'Posterior\nP(Disease|Pos)': p_disease_given_positive60}61axes[1].bar(probs.keys(), probs.values(), color=['blue', 'green', 'red'], alpha=0.7)62axes[1].set_ylabel('Probability')63axes[1].set_title("Bayes' Theorem: Prior → Posterior")64axes[1].set_ylim(0, 1)6566plt.tight_layout()67plt.show()Giải thích chi tiết:
Simulation:
- Generate population: 10,000 người, 1% bị bệnh (100 người)
- Test sick people: 95% test dương tính (TP), 5% test âm tính (FN)
- Test healthy people: 5% test dương tính (FP), 95% test âm tính (TN)
- Calculate posterior: Trong tất cả test dương tính, bao nhiêu % thực sự bị bệnh?
Code breakdown:
has_disease: Boolean array - True nếu bị bệnhtest_result: Boolean array - True nếu test dương tínhpositive_and_diseased: Bitwise AND - True khi cả 2 điều kiện đúngpositive_and_diseased.sum() / positive_tests.sum():
Visualization:
- Plot 1: Confusion matrix - phân loại 4 trường hợp
- TP (True Positive): Bệnh + Test dương tính ✅
- TN (True Negative): Không bệnh + Test âm tính ✅
- FP (False Positive): Không bệnh + Test dương tính ❌
- FN (False Negative): Bệnh + Test âm tính ❌
- Plot 2: So sánh Prior (1%) → Posterior (16.1%)
Kết quả mong đợi:
- Simulated posterior ≈ 16.1% (khớp với theoretical value)
- Visualization cho thấy FP (false positive) nhiều hơn TP do bệnh hiếm
💡 Ứng dụng trong ML:
- Naive Bayes Classifier: Phân loại văn bản, spam detection
- Bayesian Optimization: Hyperparameter tuning
- A/B Testing: Cập nhật belief khi có data mới
4.4 Thực hành Normal Distribution
Mô tả: Sinh data từ phân phối Gaussian và visualize để hiểu đặc điểm.
1import numpy as np2import matplotlib.pyplot as plt3from scipy import stats45# Tạo data từ normal distribution6mu, sigma = 0, 17data = np.random.normal(mu, sigma, 1000)89# Visualize10plt.figure(figsize=(10, 4))11plt.hist(data, bins=30, density=True, alpha=0.7)12x = np.linspace(-4, 4, 100)13plt.plot(x, stats.norm.pdf(x, mu, sigma), 'r-', lw=2)14plt.title('Normal Distribution')15plt.xlabel('Value')16plt.ylabel('Density')17plt.show()Giải thích:
np.random.normal(mu, sigma, 1000): Sinh 1000 samples từbins=30: Chia histogram thành 30 binsdensity=True: Normalize histogram thành density (tổng diện tích = 1)stats.norm.pdf(x, mu, sigma): Tính giá trị hàm mật độ (PDF) tại mỗi x- Đường cong đỏ: Hàm mật độ lý thuyết của Normal Distribution
Kết quả mong đợi: Histogram khớp với đường cong lý thuyết (hình chuông)
Checkpoint
Bạn đã hiểu về Normal Distribution và cách sử dụng chưa?
⚖️ Feature Scaling (Chuẩn hóa Đặc trưng)
5.1 Tại sao cần Scaling?
| Vấn đề | Giải pháp |
|---|---|
| Features có scale khác nhau (ví dụ: tuổi 0-100, lương 0-100M) | Standardization |
| Gradient descent hội tụ chậm | Feature scaling |
| Distance-based models bị bias (KNN, K-Means) | Normalization |
💡 Ví dụ: Nếu feature "tuổi" (20-60) và "lương" (5M-50M), lương sẽ chi phối model vì giá trị lớn hơn nhiều.
5.2 Các phương pháp Scaling
Standardization (Z-score Normalization):
Ý nghĩa: Biến đổi data về phân phối chuẩn với mean = 0, std = 1. Giữ được hình dạng phân phối, không bị outliers ảnh hưởng nhiều.
Min-Max Normalization:
Ý nghĩa: Co giãn data về khoảng [0, 1]. Giữ nguyên khoảng cách tương đối, nhưng rất nhạy với outliers.
💡 Khi nào dùng gì:
- StandardScaler: Neural Networks, Logistic Regression, SVM
- MinMaxScaler: Image data (0-255 → 0-1), KNN, algorithms nhạy với range
- RobustScaler: Data có nhiều outliers (dùng median và IQR)
5.3 Thực hành
Mô tả: So sánh StandardScaler và MinMaxScaler trên data có scale khác biệt lớn.
1from sklearn.preprocessing import StandardScaler, MinMaxScaler2import numpy as np34# Data: feature 1 (1-4), feature 2 (200-800)5X = np.array([[1, 200],6 [2, 400],7 [3, 600],8 [4, 800]])910print("Original data:")11print(X)1213# StandardScaler14scaler_std = StandardScaler()15X_std = scaler_std.fit_transform(X)16print(f"\nStandardized (mean=0, std=1):")17print(X_std)18print(f"Mean: {X_std.mean(axis=0)}")19print(f"Std: {X_std.std(axis=0)}")2021# MinMaxScaler22scaler_mm = MinMaxScaler()23X_mm = scaler_mm.fit_transform(X)24print(f"\nMin-Max Normalized (range [0,1]):")25print(X_mm)26print(f"Min: {X_mm.min(axis=0)}")27print(f"Max: {X_mm.max(axis=0)}")Giải thích chi tiết:
StandardScaler:
fit(): Tính mean và std từ training datatransform(): Áp dụng công thức cho mỗi feature- Kết quả: Mỗi feature có mean=0, std=1
- Ưu điểm: Giữ hình dạng phân phối, ít bị outliers ảnh hưởng
MinMaxScaler:
fit(): Tìm và từ training datatransform(): Áp dụng- Kết quả: Mỗi feature trong khoảng [0, 1]
- Nhược điểm: Rất nhạy với outliers (outlier làm biến dạng toàn bộ data)
Kết quả mong đợi:
- StandardScaler: Mỗi cột có mean ≈ 0, std ≈ 1
- MinMaxScaler: Mỗi cột trong [0, 1], giá trị nhỏ nhất = 0, lớn nhất = 1
📝 Quiz: Kiểm tra kiến thức
Câu 1: Đạo hàm của là gì?
Đáp án:
Giải thích: Áp dụng quy tắc :
Câu 2: Ma trận nào sau đây là ma trận đơn vị (identity matrix)?
A)
B) ✅
C)
Đáp án: B - Đường chéo = 1, phần còn lại = 0
Câu 3: Nếu Correlation coefficient r = -0.9, điều này có nghĩa gì?
Đáp án: Tương quan nghịch mạnh - khi X tăng, Y giảm
Giải thích:
- : Tương quan thuận hoàn hảo
- : Tương quan nghịch hoàn hảo
- : Tương quan mạnh
- : Gần -1 → tương quan nghịch rất mạnh
Câu 4: Trong Gradient Descent, learning rate α quá lớn sẽ gây ra vấn đề gì?
Đáp án: Overshooting - vượt qua minimum, không hội tụ
Giải thích:
- α quá lớn → bước nhảy quá xa → vượt qua điểm tối ưu
- α quá nhỏ → hội tụ chậm, nhiều iterations
- Cần chọn α phù hợp (ví dụ: 0.01 - 0.1)
Câu 5: Determinant của ma trận là bao nhiêu?
Đáp án:
Giải thích: Công thức ma trận 2×2:
Câu 6: Variance của data [2, 4, 4, 4, 5, 5, 7, 9] là bao nhiêu?
Đáp án: 4
Giải thích:
- Mean:
- Variance:
Câu 7: Theo quy tắc 68-95-99.7 của Normal Distribution, bao nhiêu % data nằm trong khoảng ?
Đáp án: 95%
Giải thích:
- 68% trong
- 95% trong
- 99.7% trong
Câu 8: Trong Bayes' Theorem, Prior là gì?
Đáp án: Xác suất ban đầu (trước khi có evidence)
Giải thích:
- Prior : Xác suất ban đầu của A
- Likelihood : Xác suất B khi biết A
- Posterior : Xác suất A khi biết B (sau khi cập nhật)
Câu 9: StandardScaler biến đổi data về phân phối gì?
Đáp án: Mean = 0, Standard Deviation = 1
Giải thích: → Standardization về
Câu 10: Eigenvector của ma trận A thỏa mãn phương trình nào?
Đáp án:
Giải thích:
- : Eigenvector (hướng không đổi khi nhân ma trận)
- : Eigenvalue (hệ số co/giãn)
- Ứng dụng: PCA, Spectral Clustering
Ưu và nhược điểm các phương pháp Scaling
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| StandardScaler | Không bị ảnh hưởng bởi outliers nhiều | Giá trị không giới hạn (có thể âm hoặc rất lớn) |
| MinMaxScaler | Giá trị trong [0,1], dễ hiểu | Rất nhạy với outliers |
| RobustScaler | Không bị ảnh hưởng bởi outliers (Íng dụng median và IQR) | Ít phổ biến, tính toán chậm hơn |
📚 Tổng kết (Summary)
✅ Những gì đã học
1. Đại số tuyến tính:
- Vector & Ma trận: Biểu diễn data
- Phép toán: Cộng, nhân, transpose, dot product
- Eigenvalue/Eigenvector: PCA, dimensionality reduction
- Determinant & Inverse: Giải hệ phương trình, kiểm tra khả nghịch
2. Giải tích:
- Derivatives: Tốc độ thay đổi, quy tắc chuỗi
- Gradient: Vector đạo hàm riêng
- Gradient Descent: Thuật toán tối ưu quan trọng nhất ML
3. Thống kê:
- Central tendency: Mean, Median, Mode
- Dispersion: Variance, Standard Deviation
- Covariance & Correlation: Mối quan hệ giữa biến
4. Xác suất:
- Normal Distribution: Phân phối chuẩn, quy tắc 68-95-99.7
- Bayes' Theorem: Cập nhật xác suất với evidence mới
5. Feature Scaling:
- StandardScaler: Mean=0, Std=1
- MinMaxScaler: Range [0,1]
🎯 Ứng dụng trong ML
| Concept | Ứng dụng ML |
|---|---|
| Matrix operations | Neural network forward/backward pass |
| Eigenvalue/Eigenvector | PCA (giảm chiều data) |
| Gradient Descent | Training tất cả ML models |
| Normal Distribution | Gaussian Naive Bayes, weight initialization |
| Bayes' Theorem | Probabilistic models, spam filter |
| Feature Scaling | Improve convergence, distance-based models |
💡 Next Steps
- Làm quiz phía trên để kiểm tra hiểu biết
- Code lại tất cả examples trong NumPy/Python
- Đọc lesson tiếp theo: Linear Regression (áp dụng toán học vào thực tế)
🏋️ Bài tập tự luyện
Bài tập 1: Tính mean, variance, std của data: [10, 20, 30, 40, 50]
Hướng dẫn:
1import numpy as np2data = np.array([10, 20, 30, 40, 50])3print(f"Mean: {np.mean(data)}")4print(f"Variance: {np.var(data)}")5print(f"Std: {np.std(data)}")Kết quả:
- Mean = 30
- Variance = 200
- Std = 14.14
Bài tập 2: Tính correlation giữa X = [1,2,3,4,5] và Y = [5,4,3,2,1]
Hướng dẫn:
1import numpy as np2X = np.array([1, 2, 3, 4, 5])3Y = np.array([5, 4, 3, 2, 1])4corr = np.corrcoef(X, Y)[0, 1]5print(f"Correlation: {corr}")Kết quả: r = -1 (tương quan nghịch hoàn hảo)
Bài tập 3: Implement Gradient Descent để tìm minimum của f(x) = x² + 4x + 4
Hint:
- Đạo hàm: f'(x) = 2x + 4
- Update: x = x - α × (2x + 4)
- Minimum lý thuyết: x = -2, f(-2) = 0
Code template:
1def f(x):2 return x**2 + 4*x + 434def df(x):5 return 2*x + 467x = 10 # Start8alpha = 0.19for i in range(20):10 x = x - alpha * df(x)11 print(f"Iteration {i+1}: x = {x:.4f}, f(x) = {f(x):.4f}")Bài tập 4: Áp dụng StandardScaler và MinMaxScaler cho dataset
Dataset: Ages = [20, 25, 30, 35, 40]
Hướng dẫn:
1from sklearn.preprocessing import StandardScaler, MinMaxScaler2import numpy as np34ages = np.array([20, 25, 30, 35, 40]).reshape(-1, 1)56# StandardScaler7scaler_std = StandardScaler()8ages_std = scaler_std.fit_transform(ages)9print(f"Standardized: {ages_std.flatten()}")1011# MinMaxScaler12scaler_mm = MinMaxScaler()13ages_mm = scaler_mm.fit_transform(ages)14print(f"Min-Max: {ages_mm.flatten()}")Bài tập 5: Verify Bayes' Theorem với simulation
Scenario:
- Disease rate: 0.1% (hiếm hơn ví dụ trên)
- Test accuracy: 99%
- False positive: 2%
Question: Nếu test dương tính, xác suất bị bệnh?
Hint: Modify code ví dụ Bayes, thay đổi parameters
Checkpoint
Bạn đã hoàn thành các bài tập thực hành chưa?
📝 Tổng Kết
Key Takeaways:
- 📐 Đại số tuyến tính: Vector, Ma trận, Eigenvalue — nền tảng biểu diễn dữ liệu
- 📈 Giải tích: Đạo hàm, Gradient Descent — tối ưu hóa model
- 📊 Thống kê: Mean, Variance, Correlation — hiểu dữ liệu
- 🎲 Xác suất: Gaussian, Bayes — suy luận trong bất định
- 💻 NumPy: Code hóa tất cả lý thuyết trên
Tài liệu tham khảo
| Nguồn | Link |
|---|---|
| NumPy Documentation | numpy.org |
| Khan Academy - Statistics | khanacademy.org |
| 3Blue1Brown - Linear Algebra | 3blue1brown.com |
Câu hỏi tự kiểm tra
- Gradient Descent hoạt động như thế nào và learning rate ảnh hưởng gì đến quá trình hội tụ?
- Eigenvalue và Eigenvector có ý nghĩa gì trong Machine Learning (ví dụ: PCA)?
- Hãy giải thích Định lý Bayes và cho một ví dụ thực tế về ứng dụng của nó.
- Tại sao cần Feature Scaling (StandardScaler, MinMaxScaler) trước khi train model?
🎉 Tuyệt vời! Bạn đã hoàn thành bài học Nền tảng Toán học cho Machine Learning!
Tiếp theo: Cùng học cách Xử lý Dữ liệu với Pandas — bước quan trọng nhất trong ML pipeline!
Checkpoint
Bạn đã nắm vững nền tảng toán học? Sẵn sàng sang bài xử lý dữ liệu!
