วิธีการเขียน SVM บน matlab แบบง่ายมากๆ
สมมุติว่าเรามี data ที่ต้องการจะ classify แบบ 2 classes
\begin{equation*} (x_i,y_i), \quad x \in R^d, y \in \{-1,1\}. \end{equation*}
คำตอบของเราคือ g(x),
\begin{equation} g(x) = \text{sign}(w \cdot \phi(x) + b), \end{equation}
The SVM optimization is
\begin{align} w^* = \arg \min_{w} \frac{1}{2} ||w||^2 + \frac{C}{n}\sum_{i=1}^l \xi_i, \\ \text{such that} \quad y_i (w \cdot \phi(x_i) + b) \ge 1 + \xi_i. \end{align}
\begin{equation*} (x_i,y_i), \quad x \in R^d, y \in \{-1,1\}. \end{equation*}
คำตอบของเราคือ g(x),
\begin{equation} g(x) = \text{sign}(w \cdot \phi(x) + b), \end{equation}
The SVM optimization is
\begin{align} w^* = \arg \min_{w} \frac{1}{2} ||w||^2 + \frac{C}{n}\sum_{i=1}^l \xi_i, \\ \text{such that} \quad y_i (w \cdot \phi(x_i) + b) \ge 1 + \xi_i. \end{align}
//matlab .m file /*data preparation*/ [X y] = DataGen(2,[400,400]',[1 8;8 1]); [n d] = size(X); ntrain = n/2; ntest = n/2; /*data preparation for svm*/ X=[X ones(n,1)]; %so that w.x+b = [x 1].[w;b] d = d+1; Xtrain = X(1:ntrain,:); ytrain = y(1:ntrain); Xtest = X(ntrain+1:n,:); ytest = y(ntrain+1:n); iter=1000; C=1; tol=0.001; Xtrainy=repmat(ytrain',1,3).*Xtrain; /*svm training */ cvx_setup cvx_begin variables w(d) xi(ntrain) minimize 1/2*sum(w.*w) + C/n*sum(xi) Xtrainy*w >= ones(ntrain,1) - xi; xi >= 0; cvx_end
ง่ายๆแค่นี้เอง
ผลถูกต้อง สีเขียวคือ data ที่เป็น class บวก สีแดงคือ class ลบ
ตัว Classifier ของเราสามารถหาตำแหน่งแบ่งแยกได้อย่างถูกต้อง
ความคิดเห็น
แสดงความคิดเห็น