วิธีการเขียน 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}


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

ความคิดเห็น

บทความที่ได้รับความนิยม