關鍵字(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