有人認為SVM是最好的現成的分類器,“現成”指的是分類器不加修改即可直接使用,意味著直接應用SVM可以取得較低的錯誤率,對訓練集之外的數據點做出很好的分類決策。 SVM有許多實現,這里介紹其中一種最流行的實現,即序列最小優化(SMO)算法,然后添加kernel函數將SVM拓展到更多數據集。 SVM是基于最大間隔分隔數據,若所給數據是二維的,則分隔線為一條直線,若數據為三維的,則分割線為一個平面,依次類推,隨著數據維數的增加,分隔面就變成了超平面。而最大間隔,是讓離分隔面最近的點,確保他們離分隔面盡可能遠。SVM本身是一個二類分類器,若要解決多類問題,需要修改SVM。
一、尋找最大間隔 SVM中為了找到劃分數據集的最佳分隔,確保最近的點到分隔的垂線最短,因此轉化為了一個優化問題。這里分隔面可以定義為:
二、SMO高效優化算法 John Platt所提出的SMO算法用于訓練SVM,將最大優化問題分解為多個小優化問題,求解的結果是完全一致的,且SMO算法求解的時間短很多。 為了得到分隔的超平面,就需要得到最優的alpha值,上面所提到的最優化式子可化為下式:
下面進入簡化版的SMO,偽代碼大致如下: 創建一個alpha向量并將其初始化為0向量 當迭代次數小于最大迭代次數(外循環) 對數據集中每個數據向量(內循環): 如果該數據向量可以被優化: 隨機選擇另外一個數據向量,同時優化這個向量 如果兩個向量都不能被優化,退出內循環 如果所有向量都未被優化,增加迭代數,進入下次循環。
新聞熱點
疑難解答