1. 程式人生 > >SVM的matlab實現——CVX工具箱應用

SVM的matlab實現——CVX工具箱應用

機器學習經典演算法SVM,網上有各種部落格介紹,以及各種語言的原始碼。 這裡提供SVM幾種版本的matlab實現,主要目的是熟悉利用CVX來求解凸優化問題。

  • basic SVM

    推導什麼的就不說了,直接搬最後的公式:

    minw,b2w22
    s.t.yi(wTxi+b)1,i=1,...,Lx_i+b)\ge1,i=1,…,L

然後是程式碼:`

function [ w,b ] = svm_prim_sep( data,labels )
%UNTITLED2 此處顯示有關此函式的摘要
%   Input:
%   data:   num-by-dim matrix .mun is
the number of data points, % dim is the the dimension of a point % labels: num-by-1 vector, specifying the class that each point belongs % to +1 or -1 % output: % w: dim-by -1 vector ,the mormal dimension of hyperpalne % b: a scalar, the bias [num,dim]=size(data); cvx_begin variables w(dim) b; minimize (norm(w)); subject to
labels.*(data*w+b)>=1; cvx_end end

然後隨便隨機生成了10個2維樣本,執行結果如下:
這裡寫圖片描述

  • Soft Margin SVM

Soft Margin SVM
線性不可分的時候,通過引入罰函式(penalty function)來解決,使得分類誤差最小。公式如下:

minw,b,ξi12w22+Ci=1Lξi
s.t.yi(wTxi+b)1ξi,i=1,...,L
ξi0,i=1,...,L

程式碼依然很簡單:

function [ w,b ] = svm_prim_sep( data,labels )
%UNTITLED2 此處顯示有關此函式的摘要
%   Input:
%   data:   num-by
-dim matrix .mun is the number of data points, % dim is the the dimension of a point % labels: num-by-1 vector, specifying the class that each point belongs % to +1 or -1 % output: % w: dim-by -1 vector ,the mormal dimension of hyperpalne % b: a scalar, the bias [num,dim]=size(data); cvx_begin variables w(dim) b,xi(num); minimize (sum(w.^2)/2+C * sum(xi.^2)); subject to labels.* (data * w+b)>=1-xi; xi>=0; cvx_end end

是不是很簡單?例子以後再給吧。(公式亂碼,請嘗試其它瀏覽器)
未完待續,