SVM算法實現(一)


關鍵字(keywords):SVM 支持向量機 SMO算法 實現 機器學習    

 

      假設對SVM原理不是非常懂的,能夠先看一下入門的視頻,對幫助理解非常實用的,然后再深入一點能夠看看這幾篇入門文章,作者寫得挺具體,看完以后SVM的基礎就了解得差點兒相同了,再然后買本《支持向量機導論》作者是Nello Cristianini 和 John Shawe-Taylor,電子工業出版社的。然后把書本后面的那個SMO算法實現就基本上弄懂了SVM是怎么一回事,最后再編寫一個SVM庫出來,比方說像libsvm等工具使用,呵呵,差點兒相同就這樣。這些是我學習SVM的整個過程,也算是經驗吧。

      以下是SVM的簡化版SMO算法,我將結合Java代碼來解釋一下整個SVM的學習訓練過程,即所謂的train訓練過程。那么什么是SMO算法呢?

 SMO算法的目的無非是找出一個函數f(x),這個函數能讓我們把輸入的數據x進行分類。既然是分類肯定須要一個評判的標准,比方分出來有兩種情況A和B,那么怎么樣才干說x是屬於A類的,或不是B類的呢?就是須要有個邊界,就好像兩個國家一樣有邊界,假設邊界越明顯,則就越easy區分,因此,我們的目標是最大化邊界的寬度,使得很easy的區分是A類還是B類。

 在SVM中,要最大化邊界則須要最小化這個數值:

 

 

w:是參量,值越大邊界越明顯
C代表懲處系數,即假設某個x是屬於某一類,可是它偏離了該類,跑到邊界上后者其它類的地方去了,C越大表明越不想放棄這個點,邊界就會縮小
代表:松散變量
但問題似乎還不好解,又由於SVM是一個凸二次規划問題,凸二次規划問題有最優解,於是問題轉換成下列形式(KKT條件):

 …………(1)

這里的ai是拉格朗日乘子(問題通過拉格朗日乘法數來求解)
對於(a)的情況,表明ai是正常分類,在邊界內部(我們知道正確分類的點yi*f(xi)>=0)
對於(b)的情況,表明了ai是支持向量,在邊界上
對於(c)的情況,表明了ai是在兩條邊界之間
而最優解須要滿足KKT條件,即滿足(a)(b)(c)條件都滿足
下面幾種情況出現將會出現不滿足:

yiui<=1可是ai<C則是不滿足的,而原本ai=C
yiui>=1可是ai>0則是不滿足的而原本ai=0
yiui=1可是ai=0或者ai=C則表明不滿足的,而原本應該是0<ai<C
所以要找出不滿足KKT的這些ai,並更新這些ai,但這些ai又受到另外一個約束,即

 

 

因此,我們通過還有一個方法,即同一時候更新ai和aj,滿足下面等式

 

就能保證和為0的約束。

 

利用yiai+yjaj=常數,消去ai,可得到一個關於單變量aj的一個凸二次規划問題,不考慮其約束0<=aj<=C,能夠得其解為:

 

 ………………………………………(2)

這里………………(3)

表示舊值,然后考慮約束0<=aj<=C可得到a的解析解為:

…………(4)

對於

那么怎樣求得ai和aj呢?

對於ai,即第一個乘子,能夠通過剛剛說的那幾種不滿足KKT的條件來找,第二個乘子aj能夠找滿足條件 

 

…………………………………………………………………………(5)

b的更新:

在滿足條件:下更新b。……………(6)

 

最后更新全部ai,y和b,這樣模型就出來了,然后通過函數:

 ……………………………………………………(7)

輸入是x,是一個數組,組中每個值表示一個特征。

輸出是A類還是B類。(正類還是負類)

 

下面是基本的代碼段:

 

執行后的結果還算能夠吧,測試數據主要是用了libsvm的heart_scale的數據。

預測的正確率達到73%以上。

假設我把核函數從線性的改為基於RBF將會更好點。

最后,說到SVM算法實現包,應該有非常多,包含svm light,libsvm,有matlab本身自帶的svm工具包等。

 

 

 

另外,完整的代碼,我將上傳到CSDN下載地址上提供下載。

點擊這里下載

 

如理解有誤敬請指正!謝謝!

我的郵箱:chen-hongqin@163.com

我的其它博客:

百度:http://hi.baidu.com/futrueboy/home

javaeye:http://futrueboy.javaeye.com/

CSDN: http://blog.csdn.net/techq

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM