Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Hồi quy tuyến tính (Linear Regression) trong Python
Trong bài hướng dẫn này, mình sẽ triển khai thuật toán Hồi Quy Tuyến Tính (Linear Regression) chỉ với các module có sẵn của Python và thư viện numpy. Đồng thời, bạn sẽ hiểu rõ khái niệm và toán học đằng sau thuật toán phổ biến này trong Machine Learning.

Hồi Quy Tuyến Tính là gì?
.jpg)
Hồi Quy Tuyến Tính là một thuật toán Machine Learning có giám sát, sử dụng để dự đoán giá trị số dựa trên các mối quan hệ tuyến tính giữa biến độc lập (đặc trưng đầu vào ) và biến phụ thuộc (đầu ra ).
Phương trình của Hồi Quy Tuyến Tính được biểu diễn dưới dạng:
Bài viết này được đăng tại [free tuts .net]
Trong đó:
- : trọng số hoặc hệ số (weights).
 - : ma trận các đặc trưng (feature matrix).
 - : hệ số chặn (bias/intercept).
 - : đầu ra dự đoán.
 
Mục tiêu là tối ưu các tham số và sao cho hàm dự đoán "hợp lý nhất" với dữ liệu.
Ý tưởng cốt lõi của Linear Regression
Hàm mất mát: Chúng ta sử dụng hàm lỗi bình phương trung bình (MSE) để đo lường mức độ sai số giữa dự đoán và thực tế:
Gradient Descent: Đây là một phương pháp tối ưu hoá dùng để cập nhật các tham số và sao cho hàm mất mát được giảm dần theo mỗi bước:
Trong đó là tốc độ học (learning rate).
- Cập nhật trọng số:
 - Cập nhật bias:
 
Triển khai Linear Regression từ đầu trong Python
Dưới đây là đoạn mã Python đầy đủ để triển khai Linear Regression:
import numpy as np  # Thư viện xử lý ma trận
class LinearRegression:
    def __init__(self, learning_rate=0.001, n_iters=1000):
        """
        Khởi tạo mô hình với tốc độ học và số lần lặp.
        """
        self.lr = learning_rate  # Tốc độ học
        self.n_iters = n_iters  # Số lần lặp
        self.weights = None  # Trọng số (weights)
        self.bias = None  # Bias (hệ số chặn)
    def fit(self, X, y):
        """
        Huấn luyện mô hình trên tập dữ liệu.
        """
        n_samples, n_features = X.shape  # Số mẫu và số đặc trưng
        self.weights = np.zeros(n_features)  # Khởi tạo trọng số bằng 0
        self.bias = 0  # Khởi tạo bias bằng 0
        # Thuật toán Gradient Descent
        for _ in range(self.n_iters):
            # Tính đầu ra dự đoán
            y_predicted = np.dot(X, self.weights) + self.bias
            # Tính gradient của trọng số và bias
            dw = (1 / n_samples) * np.dot(X.T, (y_predicted - y))  # Gradient của weights
            db = (1 / n_samples) * np.sum(y_predicted - y)  # Gradient của bias
            # Cập nhật trọng số và bias
            self.weights -= self.lr * dw
            self.bias -= self.lr * db
    def predict(self, X):
        """
        Dự đoán đầu ra cho dữ liệu mới.
        """
        y_approximated = np.dot(X, self.weights) + self.bias
        return y_approximated
Giải thích mã:
Lớp LinearRegression:
__init__: Xác định tốc độ học () và số lần lặp ().fit: Huấn luyện mô hình trên tập dữ liệu:- Khởi tạo và bằng giá trị 0.
 - Lặp lần để tính gradient và cập nhật tham số.
 
predict: Dự đoán giá trị cho dữ liệu đầu vào .
Phương pháp Gradient Descent:
- : Tính gradient của hàm mất mát theo trọng số .
 - : Tính gradient của hàm mất mát theo bias .
 - Cập nhật và để giảm giá trị hàm mất mát.
 
Tốc độ học (Learning Rate): Quyết định kích thước bước nhảy trong mỗi lần cập nhật. Giá trị nhỏ hơn sẽ học chậm nhưng ổn định, trong khi giá trị lớn hơn sẽ tăng tốc độ nhưng có thể gây dao động hoặc không hội tụ.
Ưu điểm và hạn chế của Linear Regression trong Python
Ưu điểm:
- Dễ hiểu và dễ triển khai.
 - Hiệu quả với dữ liệu tuyến tính.
 - Giải thích mối quan hệ giữa đặc trưng và kết quả.
 
Hạn chế:
- Không phù hợp với dữ liệu phi tuyến tính.
 - Nhạy cảm với outlier trong dữ liệu.
 - Hiệu suất kém khi số lượng đặc trưng lớn.
 
Kết bài
Hồi Quy Tuyến Tính là một thuật toán cơ bản nhưng rất quan trọng trong Machine Learning. Việc xây dựng từ đầu giúp bạn hiểu sâu hơn về nguyên lý hoạt động của nó, đồng thời cung cấp nền tảng để học các thuật toán phức tạp hơn.
Chúc bạn học vui!

            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