支持向量機(SVM)是一種很重要的機器學習分類算法,自己是一種線性分類算法,可是因爲加入了核技巧,使得SVM也能夠進行非線性數據的分類;SVM原本是一種二分類分類器,可是能夠擴展到多分類,本篇不會進行對其推導一步一步羅列公式,由於當你真正照着書籍進行推導後你就會發現他其實沒那麼難,主要是動手。本篇主要集中與實現,即便用著名的序列最小最優化(SMO)算法進行求解,本篇實現的代碼主要參考了Platt J. Sequential minimal optimization: A fast algorithm for training support vector machines[J]. 1998.這是SMO的論文,論文中詳細解釋瞭如何使用SMO算法,還有僞代碼,個人C++程序就是根據僞代碼實現的(沒錯,SMO算法我推不出來)。代碼地址.c++
首先,《統計學習方法》中對於SVM的講解已經很好了,請務必跟着一步一步推導,這樣你就會發現整個SVM的推導過程無非就是如下幾步:git
1,2步都是須要推導的,惟獨涉及實現的地方是第3步,咱們實現的重點變成了如何快速的獲得最優解a(a但是有N個份量的,N爲訓練樣本數)。因而SMO算法就出現了。github
再者關於核函數,以前看博客,有人理解成核函數是一種映射,即將非線性問題映射爲線性問題,有人評論說這是不嚴謹的,核函數不是一種映射,當時很迷茫,可是如今看來,核函數是一種技巧,他讓咱們可使用目前空間的內積來表明某個目標空間的內積。算法
具體的關於SVM的推導和核技巧的理解查看書籍就能夠,本身推導一遍就都明白了。機器學習
《統計學習方法》上對於SMO算法的講解很清楚(跟原論文思路同樣),就是將待優化的n個參數選兩個做爲優化對象,其餘的固定,而後轉化爲二元最優化問題。道理我都懂,可是實現的時候遇到了不少麻煩,關鍵在於啓發式的變量選取,因而便找到原論文,沒想到Platt大神已經把僞代碼寫好了,因而,我就把他的僞代碼用c++實現了一遍。這部分我對一些推導仍是不明白,在這裏就不獻醜了,看代碼吧,首先給出論文中的僞代碼截圖。
函數
這部分主要列出僞代碼的takestep部分各變量的更新代碼。學習
int SVM::SMOTakeStep(int& i1, int& i2) { //變量名跟僞代碼中基本同樣,這裏用i1, i2表明數據點對應的的拉格朗日乘子,E每一個樣本點的預測輸出與真值的偏差 //存儲在vector中,避免重複計算 ... ... ... double a1 = alpha[i1] + s * (alpha[i2] - a2); double b1; //please notice that the update equation is from <<統計學習方法>>p130, not the equation in paper b1= -E[i1] - y1 * (a1 - alpha[i1]) * kernel(trainDataF[i1], trainDataF[i1]) - y2 * (a2 - alpha[i2]) * kernel(trainDataF[i1], trainDataF[i2]) + b; double b2; b2 = -E[i2] - y1 * (a1 - alpha[i1]) * kernel(trainDataF[i1], trainDataF[i2]) - y2 * (a2 - alpha[i2]) * kernel(trainDataF[i2], trainDataF[i2]) + b; double bNew = (b1 + b2) / 2; b = bNew; w = w + y1 * (a1 - alpha[i1]) * trainDataF[i1] + y2 * (a2 - alpha[i2]) * trainDataF[i2]; //this is the linear SVM case, this equation are from the paper equation 22 alpha[i1] = a1; alpha[i2] = a2; // vector<double> wtmp (indim); // for (int i=0; i<trainDataF.size();++i) // { // auto tmp = alpha[i]*trainDataF[i]*trainDataGT[i]; // wtmp = wtmp+tmp; // } // w = wtmp; E[i1] = computeE(i1); E[i2] = computeE(i2); return 1;
特別注意b的計算公式,這裏被坑了很久,原論文的計算b1 ,b2的公式全是正號,由於論文中svm的超平面公式是\(wx-b\),這與書上的公式不一樣,因此致使個人算法一直不收斂,最後從頭看論文才發現...優化
其餘的實現都在這裏,若是有問題歡迎交流。this