Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Thuật toán Naive Bayes trong Python
Trong bài viết này, mình sẽ triển khai thuật toán Naive Bayes sử dụng chỉ các module tích hợp sẵn của Python và thư viện numpy. Đồng thời, bài viết sẽ giải thích khái niệm và toán học phía sau thuật toán này.

Naive Bayes là gì?
.jpg)
Thuật toán Naive Bayes là một mô hình phân loại dựa trên Định Lý Bayes. Nó thường được sử dụng trong các bài toán phân loại như lọc thư rác, phân tích cảm xúc, hoặc nhận diện văn bản.
Đặc trưng quan trọng của Naive Bayes là:
- "Naive" (ngây thơ): Giả định các đặc trưng (features) độc lập với nhau.
- Bayes: Dựa trên Định Lý Bayes, tính toán xác suất hậu nghiệm dựa trên dữ liệu đã biết.
Công thức toán học
Định Lý Bayes:
Bài viết này được đăng tại [free tuts .net]
Trong đó:
- : Xác suất của nhãn cho tập dữ liệu .
- : Xác suất của tập dữ liệu thuộc nhãn .
- : Xác suất tiên nghiệm của nhãn .
- : Xác suất tổng của tập dữ liệu .
Naive Bayes phân loại dựa vào nhãn có xác suất hậu nghiệm lớn nhất:
Triển khai Naive Bayes trong Python
Khởi tạo và huấn luyện mô hình
Mô hình tính các thông số cần thiết cho mỗi nhãn (class):
- Mean: Trung bình của mỗi đặc trưng.
- Variance: Phương sai của mỗi đặc trưng.
- Prior: Xác suất tiên nghiệm ().
import numpy as np
class NaiveBayes:
def fit(self, X, y):
"""
Huấn luyện mô hình Naive Bayes với tập dữ liệu X và nhãn y.
"""
n_samples, n_features = X.shape
self._classes = np.unique(y) # Tất cả các nhãn
n_classes = len(self._classes)
# Khởi tạo các tham số
self._mean = np.zeros((n_classes, n_features), dtype=np.float64)
self._var = np.zeros((n_classes, n_features), dtype=np.float64)
self._priors = np.zeros(n_classes, dtype=np.float64)
for idx, c in enumerate(self._classes):
X_c = X[y == c] # Lọc các mẫu thuộc nhãn `c`
self._mean[idx, :] = X_c.mean(axis=0)
self._var[idx, :] = X_c.var(axis=0)
self._priors[idx] = X_c.shape[0] / float(n_samples) # Tính P(C)
Dự đoán (Prediction)
Dự đoán nhãn của dữ liệu đầu vào dựa trên:
- Tính toán xác suất hậu nghiệm ().
- Trả về nhãn với xác suất cao nhất.
def predict(self, X):
"""
Dự đoán nhãn cho tập dữ liệu X.
"""
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
"""
Dự đoán nhãn cho từng mẫu x.
"""
posteriors = []
# Tính xác suất hậu nghiệm cho mỗi nhãn
for idx, c in enumerate(self._classes):
prior = np.log(self._priors[idx]) # log(P(C))
posterior = np.sum(np.log(self._pdf(idx, x))) # log(P(X|C))
posterior = prior + posterior
posteriors.append(posterior)
# Nhãn có xác suất cao nhất
return self._classes[np.argmax(posteriors)]

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng