วิธีการเขียน 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 ของเราสามารถหาตำแหน่งแบ่งแยกได้อย่างถูกต้อง
ความคิดเห็น
แสดงความคิดเห็น