機器學習技法--學習筆記04--Soft SVM

背景 html

以前所討論的SVM都是很是嚴格的hard版本,必需要求每一個點都被正確的區分開。可是,實際狀況時不多出現這種狀況的,由於噪聲數據時沒法避免的。因此,須要在hard SVM上添加容錯機制,使得能夠容忍少許噪聲數據。 git

 

"軟"化問題 web

軟化SVM的思路有點相似正規化,在目標函數添加錯誤累加項,而後加一個係數,控制對錯誤的容忍度,而且在約束中添加錯誤容忍度的約束,形式以下: app

 

如今問題就變成了(d+1+N)個變量和2N個約束。ξ用來描述錯誤的容忍度。C是常量,用來控制容忍度。C越大,因爲min的做用,ξ錯誤就會變小,也就是對錯誤的容忍度變小,約束變苛刻,邊界變窄;反之,容忍度越大,約束變寬鬆,邊界變寬。 函數

 

遇到老熟人 學習

如今,將上面軟化後的SVM問題進行對偶轉化和簡化,獲得的結果和以前hard版本十分相似,好像遇到了老熟人。 spa

區別部分用紅色高亮了,你會發現只多了N個約束。 設計

 

α的妙用 htm

α仍然可使用QP方法計算獲得,b的求解也是經過complementary slackness,可是在求解b的過程,能夠將向量分爲三類,頗有參考意義,可用於數據分析。 blog

首先看看complementary slackness條件,

當時,向量在邊界上或遠離邊界;

當時,,向量在邊界上,稱之爲free支持向量;

當時,向量在邊界上()或者破壞約束()。

 

具體能夠參考下圖,

 

SVM實戰

以前4篇學習筆記,公式理論推導了一大串,感受有點飄,那麼接下來就實戰SVM,這樣才踏實。使用的libsvm,可是在R中調用,須要'e1071'擴展(install.package('e1071'))。試驗數據見這裏。直接來代碼:

library(e1071)

load('data/train.RData')

train$digit <- sapply(old_train_digit, function(digit) ifelse(digit == '0','0','non-0') )

train$digit <- factor(train$digit)

 

m_svm <- svm(digit~., data = train, scale = FALSE, kernel = 'radial', cost = 1, gamma = 100)

summary(m_svm)

attributes(m_svm)

上面使用了RBF kernel,取C = 1。獲得的結果中,有個屬性是coefs,以前對這個屬性很不瞭解,可是查看幫助,原文"The corresponding coefficients times the training labels",發現原來就是下面的值,

因此,若是使用線性kernel(也就是不用kernel),能夠根據w的公式(以下)很方便的計算出w,

若是想實踐QP,推薦使用R擴展包kernlab中的ipop函數。

 

最後,要感謝臺灣大學林軒田老師設計出這麼好的課程和做業,加深了我對SVM的理解,但願後面能夠靈活的應用到實際工做中!

相關文章
相關標籤/搜索