Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
SVM (Support Vector Machine) bằng Python
Trong bài viết này, mình sẽ tự tay triển khai thuật toán SVM (Support Vector Machine) chỉ với các module có sẵn trong Python và thư viện numpy. Chúng ta cũng sẽ tìm hiểu về khái niệm cũng như toán học phía sau thuật toán ML quan trọng này.
SVM là gì?
SVM là một thuật toán học có giám sát mạnh mẽ, thường được sử dụng để phân loại và hồi quy. Ý tưởng chính của SVM là tìm một siêu phẳng (hyperplane) để phân tách dữ liệu thuộc hai lớp sao cho khoảng cách từ dữ liệu đến siêu phẳng này là tối đa (Maximum Margin).
Các thành phần chính của SVM:
- Hyperplane: Siêu phẳng phân chia các lớp dữ liệu trong không gian đặc trưng.
- Support Vectors: Các điểm dữ liệu gần nhất với siêu phẳng, ảnh hưởng đến vị trí và hướng của nó.
- Margin: Khoảng cách giữa siêu phẳng và điểm dữ liệu gần nhất. Thuật toán cố gắng tối đa hóa khoảng cách này.
Công thức toán học phía sau SVM
Hàm mất mát (Hinge Loss):
Bài viết này được đăng tại [free tuts .net]
- : Thành phần điều chuẩn (Regularization).
- : Thành phần mất mát dựa trên điều kiện phân loại chính xác.
Cập nhật trọng số (Weight Update):
- Nếu : Chỉ cập nhật trọng số dựa trên thành phần điều chuẩn.
- Nếu : Cập nhật dựa trên dữ liệu vi phạm điều kiện biên .
Triển khai SVM trong Python
Định nghĩa lớp SVM
import numpy as np class SVM: def __init__(self, learning_rate=0.001, lambda_param=0.01, n_iters=1000): """ Khởi tạo SVM. Args: learning_rate (float): Tốc độ học (η). lambda_param (float): Hệ số điều chuẩn (λ). n_iters (int): Số lần lặp. """ self.lr = learning_rate self.lambda_param = lambda_param self.n_iters = n_iters self.w = None self.b = None
Huấn luyện mô hình
Trong hàm fit
, chúng ta:
- Chuẩn hóa nhãn thành và .
- Tối ưu hóa trọng số và bias thông qua gradient descent.
def fit(self, X, y): """ Huấn luyện SVM dựa trên dữ liệu đầu vào và nhãn. Args: X (ndarray): Dữ liệu đầu vào (n_samples, n_features). y (ndarray): Nhãn thực tế (n_samples). """ n_samples, n_features = X.shape y_ = np.where(y <= 0, -1, 1) # Chuyển nhãn về {-1, 1} self.w = np.zeros(n_features) # Khởi tạo trọng số bằng 0 self.b = 0 for _ in range(self.n_iters): for idx, x_i in enumerate(X): condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1 if condition: # Cập nhật chỉ với thành phần điều chuẩn self.w -= self.lr * (2 * self.lambda_param * self.w) else: # Cập nhật cả điều chuẩn và điều kiện mất mát self.w -= self.lr * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx])) self.b -= self.lr * y_[idx]
Dự đoán nhãn
Hàm predict
sử dụng siêu phẳng để xác định nhãn dự đoán.
def predict(self, X): """ Dự đoán nhãn cho tập dữ liệu đầu vào. Args: X (ndarray): Dữ liệu đầu vào (n_samples, n_features). Returns: ndarray: Nhãn dự đoán (n_samples). """ approx = np.dot(X, self.w) - self.b return np.sign(approx)
Cách sử dụng SVM trong Python
Tạo dữ liệu giả lập để kiểm tra:
from sklearn.datasets import make_blobs import matplotlib.pyplot as plt # Tạo dữ liệu X, y = make_blobs(n_samples=100, n_features=2, centers=2, cluster_std=1.05, random_state=42) y = np.where(y == 0, -1, 1) # Chuẩn hóa nhãn về {-1, 1} # Huấn luyện mô hình svm = SVM(learning_rate=0.001, lambda_param=0.01, n_iters=1000) svm.fit(X, y) # Dự đoán và biểu đồ predictions = svm.predict(X) # Vẽ dữ liệu và siêu phẳng def plot_hyperplane(X, y, svm): plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis') x0 = np.linspace(min(X[:, 0]), max(X[:, 0]), 100) x1 = - (svm.w[0] * x0 + svm.b) / svm.w[1] # Phương trình siêu phẳng plt.plot(x0, x1, "-r") plt.show() plot_hyperplane(X, y, svm)
Kết bài
SVM (Support Vector Machine) là một trong những thuật toán học máy mạnh mẽ và phổ biến, với khả năng phân loại hiệu quả và nguyên lý hoạt động dựa trên siêu phẳng tối ưu. Trong bài viết này, chúng ta đã tìm hiểu rõ về toán học phía sau thuật toán SVM, đồng thời triển khai từ đầu chỉ với Python và thư viện numpy.
Việc tự xây dựng các thuật toán từ đầu không chỉ giúp bạn hiểu sâu hơn về cơ chế hoạt động, mà còn là nền tảng vững chắc để tối ưu và mở rộng sang các bài toán phức tạp hơn, chẳng hạn như áp dụng kernel SVM để xử lý dữ liệu không tuyến tính.
Hãy thực hành thêm bằng cách thử nghiệm với các tập dữ liệu thực tế, điều chỉnh tham số hoặc áp dụng các kỹ thuật nâng cao khác. Điều này sẽ giúp bạn nâng cao kỹ năng lập trình cũng như kiến thức về học máy, sẵn sàng chinh phục các thách thức trong lĩnh vực công nghệ và dữ liệu.