Support Vector Regression là gì

Bài viết giới thiệu tổng quan về mô hình SVM và ví dụ về SVM trong OpenCV.

SVM là gì?

SVM [Support Vector Machine] là 1 thuật toán học máy thuộc nhóm Supervised Learning [học có giám sát] được sử dụng trong các bài toán phân lớp dữ liệu [classification] hay hồi qui [Regression].

SVM là 1thuật toán phân loại nhị phân, SVM nhận dữ liệu vào và phân loại chúng vào hai lớp khác nhau. Với 1 bộ các ví dụ luyện tập thuộc hai thể loại cho trước, thuật toán luyện tập SVM xây dựng 1 mô hình SVM để phân loại các ví dụ khác vào hai thể loại đó.

Ví dụ vềSVM tuyến tính

Có 1 không gian có nhiều điểm và các kíhiệu như sau:

  • yi: là các lớp [bản lề] chứa các điểm dữ liệu xi, ví dụ này mang giá trị 1 và -1.
  • xi: là 1 vector thực nhiều chiều [p chiều].
  • Nhiệm vụ là cần phải tìm 1 siêu phẳng [Optimal hyperplane] có lề lớn nhất chia tách các điểm dữ liệu có ban đầu để huấn luyện và các điểm sau này. Mỗi siêu phẳng [Optimal hyperplane] đều có thể được viết dưới dạng 1 tập các điểm thỏa mãn w.x-b = 0
  • w: là 1 vector pháp tuyến của siêu phẳng [optimal hyperplane].
  • b/||w||: xác định khoảng cách giữa gốc tọa độ và siêu phẳng theo hướng vectơ pháp tuyến w.
  • Giả sử có tới 3 siêu phẳng [Optimal hyperplane] là H1 [Xanh dương], H2 [Đỏ], H3 [Xanh lá]. H3 sẽ bị loại đầu tiên vì không thể phân loại các điểm huấn luyện cho trước. H1 bị loại vì khoảng cách từ các điểm Support Vector đến siêu phẳng [Optimal hyperplane] chưa phải là cực đại. H2 là siêu phẳng cần tìm. Lúc này các siêu phẳng đó được xác định: w.x - b = 1 và w.x - b = -1
  • Các điểm dữ liệu cho trước nằm trên các siêu phẳng song song được gọi là Support Vector.

Tổng quan:

  • SVM là mô hìnhxây dựng 1siêu phẳnghoặc 1 tập hợp các siêu phẳng trong 1 không gian nhiều chiều hoặc vô hạn chiều, có thể được sử dụng cho phân loại, hồi quy, hoặc các nhiệm vụ khác. Để phân loại tốt nhất thì phải xác địnhsiêu phẳng [Optimal hyperplane]nằm ở càng xa các điểm dữ liệu của tất cả các lớp [Hàm lề] càng tốt, vì nói chung lề càng lớn thìsai số tổng quát hóacủa thuật toán phân loại càng bé.
  • Muốn các điểm dữ liệu có thể được chia tách 1 cách tuyến tính, thì bạn phải cần chọn hai siêu phẳng của lề sao cho không có điểm nào ở giữa chúng và khoảng cách giữa chúng là tối đa.
  • Trong nhiều trường hợp, không thể phân chia các lớp dữ liệu 1 cách tuyến tính trong 1 không gian ban đầu được dùng để mô tả 1 vấn đề. Vì vậy, nhiều khi cần phảiánh xạcác điểm dữ liệu trong không gian ban đầu vào 1 không gian mới nhiều chiều hơn, để việc phân tách chúng trở nên dễ dàng hơn trong không gian mới.

Với các điểm tổng quan ở trên thì nhiệm vụ chính là phân loại thống kê.

  1. Thuật toán đượccho trước 1 số điểm dữ liệu cùng với nhãn của chúng thuộc cáclớp cho trước [Huấn luyện].
  2. Mục tiêu của thuật toánlà xác định xem 1 điểm dữ liệumớisẽ được thuộc về lớp nào [Phân loại].

SVM trong OpenCV

Source code

#include #include #include "opencv2/imgcodecs.hpp" #include #include using namespace cv; using namespace cv::ml; int main[int, char**] { int width = 512, height = 512; Mat image = Mat::zeros[height, width, CV_8UC3]; int labels[4] = { 1, 1, 1, -1 }; Mat labelsMat[4, 1, CV_32SC1, labels]; float trainingData[4][2] = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } }; Mat trainingDataMat[4, 2, CV_32FC1, trainingData]; Ptr svm = ml::SVM::create[]; svm->setType[ml::SVM::C_SVC]; svm->setKernel[ml::SVM::LINEAR]; svm->setTermCriteria[cv::TermCriteria[CV_TERMCRIT_ITER, 100, 1e-6]]; svm->train[trainingDataMat, ml::ROW_SAMPLE, labelsMat]; Vec3b green[0, 255, 0], blue[255, 0, 0]; for [int i = 0; i < image.rows; ++i] for [int j = 0; j < image.cols; ++j] { Mat sampleMat = [Mat_[1, 2] predict[sampleMat]; if [response == 1] image.at[i, j] = green; else if [response == -1] image.at[i, j] = blue; } int thickness = -1; int lineType = 8; circle[image, Point[501, 10], 5, Scalar[0, 0, 0], thickness, lineType]; // black circle[image, Point[255, 10], 5, Scalar[255, 255, 255], thickness, lineType]; // white circle[image, Point[501, 255], 5, Scalar[0, 0, 255], thickness, lineType]; // red circle[image, Point[10, 501], 5, Scalar[0, 255, 0], thickness, lineType]; // green imshow["SVM Simple Example", image]; waitKey[0]; }

Phân tích

Thiết lập dữ liệu huấn luyện

float labels[4] = {1.0, -1.0, -1.0, -1.0}; float trainingData[4][2] = {{501, 10}, {255, 10}, {501, 255}, {10, 501}};

Video liên quan

Chủ Đề