Support Vector Machine (SVM) là một thuật toán học máy được sử dụng chủ yếu cho các bài toán phân loại và hồi quy. Mục tiêu của SVM là tìm một siêu phẳng (hyperplane) tốt nhất để phân chia không gian đặc trưng thành các lớp khác nhau sao cho khoảng cách từ các điểm dữ liệu đến siêu phẳng này là lớn nhất. SVM được sử dụng đặc biệt hiệu quả trong các không gian đặc trưng có số chiều cao.
Để mô tả chi tiết hơn mô hình toán học của Support Vector Machine (SVM), hãy xem xét bài toán phân loại nhị phân trong không gian hai chiều. Mục tiêu của SVM là tìm một siêu phẳng (hyperplane) phân chia hai lớp dữ liệu sao cho tổng khoảng cách từ các điểm dữ liệu đến siêu phẳng này là lớn nhất.
[imath][/imath]
Để cung cấp một ví dụ chi tiết hơn với OpenCV C++, chúng ta sẽ tạo một ứng dụng đơn giản để nhận dạng chữ số viết tay từ tập dữ liệu MNIST bằng SVM. Trước hết, bạn cần cài đặt OpenCV và tải tập dữ liệu MNIST. Dưới đây là một phiên bản đơn giản để bắt đầu:
Trong ví dụ này, chúng ta giả định rằng bạn đã đọc dữ liệu từ tập dữ liệu MNIST và lưu trữ ảnh trong ma trận images. Mỗi ảnh được chuyển đổi thành một vector hàng và sau đó được chuyển đổi sang kiểu dữ liệu CV_32F. Nhãn được gán cho các mẫu, và sau đó, mô hình SVM được huấn luyện bằng cách sử dụng các tham số đã thiết lập. Mô hình được lưu và sau đó có thể được load để dự đoán nhãn cho mẫu mới.
Để đọc dữ liệu từ tập dữ liệu MNIST, bạn cần sử dụng thư viện phổ biến như OpenCV để làm cho quá trình này trở nên thuận tiện. Tập dữ liệu MNIST thường được lưu trữ dưới dạng các tệp IDX, bao gồm tệp ảnh và tệp nhãn. Dưới đây là một mô tả chi tiết hơn về cách đọc dữ liệu từ các tệp IDX sử dụng OpenCV C++:
Để mô tả chi tiết hơn mô hình toán học của Support Vector Machine (SVM), hãy xem xét bài toán phân loại nhị phân trong không gian hai chiều. Mục tiêu của SVM là tìm một siêu phẳng (hyperplane) phân chia hai lớp dữ liệu sao cho tổng khoảng cách từ các điểm dữ liệu đến siêu phẳng này là lớn nhất.
[imath][/imath]
Bài toán tối ưu hóa SVM:
Cho dữ liệu huấn luyện [imath]\{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} [/imath] với [imath]x_i [/imath] là vector đặc trưng của mẫu thứ i và [imath] y_i[/imath] là nhãn của mẫu đó ([imath]y_i = -1 [/imath] hoặc [imath]y_i = 1 [/imath]) mô hình SVM tìm kiếm một vector trọng số w và một hệ số điều chỉnh b sao cho siêu phẳng được định nghĩa bởi [imath]w \cdot x + b = 0[/imath] phân chia dữ liệu và đồng thời tối đa hóa khoảng cách từ mọi điểm đến siêu phẳng.Đặc điểm chính của SVM:
- Hàm quyết định (Decision Function):
Hàm quyết định của SVM được định nghĩa là [imath]f(x) = w \cdot x + b [/imath]. Nếu [imath]f(x) > 0 [/imath], mẫu xđược dự đoán thuộc lớp 1; nếu [imath]f(x) < 0 [/imath] mẫu [imath]x [/imath]được dự đoán thuộc lớp -1. - Khoảng cách từ điểm đến siêu phẳng:
Đối với mẫu thuộc lớp 1 ([imath] y_i = 1[/imath]) , khoảng cách từ mẫu đến siêu phẳng được tính bằng [imath]d_1 = \frac{f(x_i)}{||w||} [/imath], và đối với mẫu thuộc lớp -1 ([imath] y_i = -1[/imath]) , khoảng cách được tính bằng [imath]d_{-1} = \frac{-f(x_i)}{||w||} [/imath] , với [imath] ||w||[/imath] là độ dài của vector trọng số w. - Tối ưu hóa khoảng cách:
Mục tiêu của SVM là tối đa hóa khoảng cách nhỏ nhất từ bất kỳ điểm dữ liệu nào đến siêu phẳng, tức là tối đa hóa [imath]d = \min(d_1, d_{-1})[/imath]. Điều này có thể được chuyển thành bài toán tối ưu hóa như sau:
[imath]\max_{w, b} \frac{1}{||w||} \text{ sao cho } y_i(w \cdot x_i + b) \geq 1, \text{ với } i = 1, 2, ..., n[/imath]
Bài toán tối ưu hóa trên tìm kiếm siêu phẳng sao cho tối đa khoảng cách và đồng thời đảm bảo mọi điểm dữ liệu đều nằm đúng phía của siêu phẳng tương ứng với lớp của chúng. - Bài toán Dual:
Bài toán tối ưu hóa có thể chuyển đổi thành dạng dual để dễ giải quyết hơn. Bài toán dual giúp giảm độ phức tạp tính toán và thường được giải bằng các phương pháp như SMO (Sequential Minimal Optimization). - Hạnh phúc giữa tối ưu hóa và dự đoán:
Mô hình SVM là hạnh phúc giữa việc tối ưu hóa khoảng cách và việc dự đoán. Điều này giúp mô hình tổng quát tốt và giảm nguy cơ quá mức (overfitting).
Để cung cấp một ví dụ chi tiết hơn với OpenCV C++, chúng ta sẽ tạo một ứng dụng đơn giản để nhận dạng chữ số viết tay từ tập dữ liệu MNIST bằng SVM. Trước hết, bạn cần cài đặt OpenCV và tải tập dữ liệu MNIST. Dưới đây là một phiên bản đơn giản để bắt đầu:
Trong ví dụ này, chúng ta giả định rằng bạn đã đọc dữ liệu từ tập dữ liệu MNIST và lưu trữ ảnh trong ma trận images. Mỗi ảnh được chuyển đổi thành một vector hàng và sau đó được chuyển đổi sang kiểu dữ liệu CV_32F. Nhãn được gán cho các mẫu, và sau đó, mô hình SVM được huấn luyện bằng cách sử dụng các tham số đã thiết lập. Mô hình được lưu và sau đó có thể được load để dự đoán nhãn cho mẫu mới.
Để đọc dữ liệu từ tập dữ liệu MNIST, bạn cần sử dụng thư viện phổ biến như OpenCV để làm cho quá trình này trở nên thuận tiện. Tập dữ liệu MNIST thường được lưu trữ dưới dạng các tệp IDX, bao gồm tệp ảnh và tệp nhãn. Dưới đây là một mô tả chi tiết hơn về cách đọc dữ liệu từ các tệp IDX sử dụng OpenCV C++:
- Tải và giải nén dữ liệu MNIST: Trước hết, bạn cần tải và giải nén tập dữ liệu MNIST. Bạn có thể tìm thấy tập dữ liệu này tại trang web chính thức của MNIST: http://yann.lecun.com/exdb/mnist/
- Cài đặt và include OpenCV: Đảm bảo rằng bạn đã cài đặt OpenCV và thêm các thư viện cần thiết vào dự án của mình. Điều này thường bao gồm các bước cài đặt và chỉ định các đường dẫn bao gồm và thư viện.
- Đọc dữ liệu từ tệp IDX: MNIST có hai tệp IDX quan trọng: một tệp chứa ảnh (ví dụ: train-images-idx3-ubyte) và một tệp chứa nhãn (ví dụ: train-labels-idx1-ubyte). Dưới đây là một đoạn mã mẫu để đọc dữ liệu từ tệp IDX bằng OpenCV:
- Xử lý dữ liệu và huấn luyện mô hình SVM:
Sau khi có được dữ liệu từ tệp IDX, bạn có thể tiếp tục xử lý dữ liệu (chẳng hạn như chia thành tập huấn luyện và tập kiểm tra) và huấn luyện mô hình SVM như đã mô tả trong các ví dụ trước đó.
Sửa lần cuối: