1.引言?
隨著網絡技術的飛速發展和普及,進入了信息大爆炸的時代。信息無處不在,給我們的學習生活帶來了諸多便捷,由于堪稱海量的信息量,我們從中獲取有用的信息變得困難,解決這一難題就是要對這些大量的信息進行分類。SVM就是一種很好的信息分類方法。SVM技術在解決小樣本、非線性及高維度的模式識別問題中表現出許多優勢,在許多領域,如文本分類、圖像識別、生物信息學等領域中得到了成功的應用。?
2.SVM的發展?
SVM,是基于模式識別方法和統計學習理論的一種全新的非常有潛力的分類技術,主要用于模式識別領域。1963年,ATE-T Bell實驗室研究小組在Vanpik的領導下,首次提出了支持向量機(SVM)理論方法。這種方法是從樣本集中選擇一組樣本,對整個樣本集的劃分可以等同于對這組樣本的劃分,這組樣本子集就被形象地稱之為支持向量(SV)。但在當時,SVM在數學上不能明晰地表示,人們對模式識別問題的研究很不完善,因此SVM的研究沒有得到進一步的發展與重視。?
1971年,Kimeldorf提出了使用線性不等約束重新構造SV的核空間,使一部分線性不可分的問題得到了解決。?
20世紀90年代,一個比較完善的理論體系——統計學習理論(Statistical Learning Theory,SLT)形成了,此時一些新興的機器學習方法(如神經網絡等)的研究遇到了一些重大的困難,比如欠學習與過學習問題、如何確定網絡結構的問題、局部極小點問題等,這兩方面的因素使得SVM迅速發展和完善,并在很多問題的解決中表現出許多特有優勢,而且能夠推廣應用到函數擬合等其他機器學習問題中,從此迅速發展了起來,目前已經成功地在許多領域里得到了成功應用。?
3.SVM的應用?
SVM的主要思想可以概括為如下兩點:?
(1)它是針對線性可分的情況進行分析的。對于線性不可分的情況,通過使用非線性映射算法將低維輸入空間線性不可分的樣本轉化為高維特征空間,使其線性可分,從而使得在高維特征空間中采用線性算法對樣本的非線性特征進行線性分析成為可能。(2)它基于結構風險最小化理論,在特征空間中構建最優分類面,使得學習器能夠得到全局最優化,并且使整個樣本空間的期望風險以某個概率滿足一定上界。?
從上面的兩點基本思想來看,SVM沒有使用傳統的推導過程,簡化了通常的分類和回歸等問題;少數的支持向量確定了SVM 的最終決策函數,計算的復雜性取決于支持向量,而不是整個樣本空間,這就可以避免“維數災難”。少數支持向量決定了最終結果,這不但可以幫助我們抓住關鍵樣本,而且注定了該方法不但算法簡單,而且具有較好的“魯棒”性。?
3.1人臉檢測、驗證和識別?
Osuna最早將SVM應用于人臉檢測,取得了較好的效果。其方法是直接訓練非線性SVM分類器完成人臉與非人臉的分類。由于SVM的訓練需要大量的存儲空間,并且非線性SVM分類器需要較多的支持向量,速度很慢,因此,他提出了一種層次性結構的SVM分類器,它由一個線性SVM的組合和一個非線性SVM組成。檢測時,由前者快速排除掉圖像中絕大部分背景窗日,而后者只需對少量的候選區域做出確認。?
3.2說話人/語音識別?
說話人識別屬于連續輸入信號的分類問題,SVM是一個很好的分類器,但不適合連續輸入樣本。為此,引入了隱式馬爾可夫模型HMM,建立了SVM和HMM的混合模型。HMM適合處理連續信號,而SVM適合分類問題;HMM的結果反映了同類樣本的相似度,而SVM的輸出結果則體現了異類樣本間的差異。為了方便與HMM組成混合模型,需要首先將SVM的輸出形式改為概率輸出。?
3.3文字/手寫體識別?
貝爾實驗室對美國郵政手寫數字庫進行的實驗中,人工識別平均錯誤率為2.500,專門針對該特定問題設計的5層神經網絡錯誤率為5.100(其中利用了大量先驗知識),而用3種SVM方法(采用3種核函數)得到的錯誤率分別為2.000、2.1%和2.200,且SVM是直接采用16X 16的字符點陣作為輸入的,表明了SVM的優越性能。?
3.4圖像處理?
3.4.1圖像過濾。一般的針對互聯網色情圖像的過濾軟件主要采用網址庫的形式封鎖色情網址或采用人工智能方法對接收到的中、英文信息進行分析甄別。學者們提出了一種多層次特定類型圖像過濾法,即綜合膚色模型檢驗、支持向量機分類和最近鄰方法校驗的多層系圖像處理框架,此方法能夠達到85%以上的準確率。?
3.4.2視頻字幕提取。視頻字幕蘊含了豐富的語義,可用于對相應視頻流進行高級語義標注。研究人員提出并實踐了基于SVM的視頻字幕自動定位和提取的方法,該方法首先將原始圖像的幀分割為NXN的子塊,提取每個子塊的灰度特征,然后使用預先訓練好的SVM分類機進行字幕子塊和非字幕子塊的分類,最后結合金字塔模型和后期處理,實現視頻圖像字幕區域的自動定位提取。?
3.4.3圖像分類和檢索。由于計算機自動抽取的圖像特征和人所理解的語義間存在巨大差異,圖像檢索的結果難以令人滿意。近年來出現了相關反饋方法,以SVM為分類器,在每次反饋中對用戶標記的正例和反例樣本進行學習,并根據學習所得的模型進行檢索。相關研究人員使用了由9918幅圖像組成的圖像庫進行了實驗,結果表明,這種方法在訓練樣本有限的情況下具有良好的泛化功能。?
3.5其他方面的應用?
SVM除了在上述領域中得到了成功的應用外,在其他領域,如汽輪發電機組的故障診斷,金融工程,生物醫藥信號處理,生物信息,自適應信號處理,手寫體相似字識別,巖爆預測的支持向量機,缺陷識別等領域都有成功的應用。?
4.結語?
目前,國際上關于SVM理論的討論和深入的研究在逐漸廣泛發展,我國國內在此領域的研究尚處在萌芽狀態,需要及時學習掌握有關的理論知識,開展有效的研究工作,使國內在這個具有重要意義的領域中盡快趕上國際水平,跟上國際發展步伐。?
SVM分類算法的基本理論問題,它分類的基本思想是利用最大間隔進行分類,處理非線性問題是通過核函數將特征向量映射到高維空間,從而變成線性可分的,但是運算卻是在低維空間運行的。考慮到數據中可能存在噪音,還引入了松弛變量。?
理論是抽象的,問題是具體的。站在岸上學不會游泳,光看著梨子不可能知道梨子的滋味。本篇博客就是用SVM分類算法解決一個經典的 機器學習 問題–手寫數字識別。體會一下SVM算法的具體過程,理理它的一般性的思路。問題的提出
人類視覺系統是世界上眾多的奇跡之一。看看下面的手寫數字序列:?
?
大多數人毫不費力就能夠認出這些數字為504192。如果嘗試讓計算機程序來識別諸如上面的數字,就會明顯感受到視覺模式識別的困難。關于我們識別形狀——–“9頂上有一個圈,右下方則是一條豎線”這樣的簡單直覺,實際上算法很難輕易表達出來。?
?
SVM分類算法以另一個角度來考慮問題。其思路是獲取大量的手寫數字,常稱作訓練樣本,然后開發出一個可以從這些訓練樣本中進行學習的系統。換言之,SVM使用樣本來自動推斷出識別手寫數字的規則。隨著樣本數量的增加,算法可以學到更多關于手寫數字的知識,這樣就能夠提升自身的準確性。?
本文采用的數據集就是著名的“MNIST數據集”。這個數據集有60000個訓練樣本數據集和10000個測試用例。直接調用scikit-learn庫中的SVM,使用默認的參數,1000張手寫數字圖片,判斷準確的圖片就高達9435張。
SVM的算法過程
通常,對于分類問題。我們會將數據集分成三部分,訓練集、測試集、交叉驗證集。用訓練集訓練生成模型,用測試集和交叉驗證集進行驗證模型的準確性。?
加載數據的代碼如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
SVM算法進行訓練和預測的代碼如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
以上代碼沒有用驗證集進行驗證。這是因為本例中,用測試集和驗證集要判斷的是一個東西,沒有必要刻意用驗證集再來驗證一遍。事實上,我的確用驗證集也試了一下,和測試集的結果基本一樣。呵呵
直接運行代碼,結果如下:
- 1
- 2
- 3

- 1
- 2
- 3
在我的ubuntu上,運行11分鐘左右就可以完成訓練,并預測測試集的結果。?
需要說明的是,svm.SVC()函數的幾個重要參數。直接用help命令查看一下文檔,這里我稍微翻譯了一下:?
C : 浮點型,可選 (默認=1.0)。誤差項的懲罰參數C?
kernel : 字符型, 可選 (默認=’rbf’)。指定核函數類型。只能是’linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 或者自定義的。如果沒有指定,默認使用’rbf’。如果使用自定義的核函數,需要預先計算核矩陣。?
degree : 整形, 可選 (默認=3)。用多項式核函數(‘poly’)時,多項式核函數的參數d,用其他核函數,這個參數可忽略?
gamma : 浮點型, 可選 (默認=0.0)。’rbf’, ‘poly’ and ‘sigmoid’核函數的系數。如果gamma是0,實際將使用特征維度的倒數值進行運算。也就是說,如果特征是100個維度,實際的gamma是1/100。?
coef0 : 浮點型, 可選 (默認=0.0)。核函數的獨立項,’poly’ 和’sigmoid’核時才有意義。?
可以適當調整一下SVM分類算法,看看不同參數的結果。當我的參數選擇為C=100.0, kernel=’rbf’, gamma=0.03時,預測的準確度就已經高達98.5%了。
SVM參數的調優初探
SVM分類算法需要調整的參數就只有幾個。那么這些參數如何選取,有沒有一些經驗性的規律呢?
- 核函數選擇
?
如上圖,線性核函數的分類邊界是線性的,非線性核函數分類邊界是很復雜的非線性邊界。所以當能直觀地觀察數據時,大致可以判斷分類邊界,從而有傾向性地選擇核函數。
- 參數gamma和C的選擇
機器學習大牛Andrew Ng說,關于SVM分類算法,他一直用的是高斯核函數,其它核函數他基本就沒用過。可見,這個核函數應用最廣。?
gamma參數,當使用高斯核進行映射時,如果選得很小的話,高次特征上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當于一個低維的子空間;反過來,如果gamma選得很大,則可以將任意的數據映射為線性可分——這樣容易導致非常嚴重的過擬合問題。?
C參數是尋找 margin 最大的超平面”和“保證數據點偏差量最小”)之間的權重。C越大,模型允許的偏差越小。?
下圖是一個簡單的二分類情況下,不同的gamma和C對分類結果的影響。?
?
相同的C,gamma越大,分類邊界離樣本越近。相同的gamma,C越大,分類越嚴格。?
下圖是不同C和gamma下分類器交叉驗證準確率的熱力圖?
?
由圖可知,模型對gamma參數是很敏感的。如果gamma太大,無論C取多大都不能阻止過擬合。當gamma很小,分類邊界很像線性的。取中間值時,好的模型的gamma和C大致分布在對角線位置。還應該注意到,當gamma取中間值時,C取值可以是很大的。?
在實際項目中,這幾個參數按一定的步長,多試幾次,一般就能得到比較好的分類效果了。
小結
回顧一下整個問題。我們進行了如下操作。對數據集分成了三部分,訓練集、測試集和交叉驗證集。用SVM分類模型進行訓練,依據測試集和驗證集的預測結果來優化參數。依靠sklearn這個強大的機器學習庫,我們也能解決手寫識別這么高大上的問題了。事實上,我們只用了幾行簡單代碼,就讓測試集的預測準確率高達98.5%。?
SVM算法也沒有想象的那么高不可攀嘛,呵呵!?
事實上,就算是一般性的機器學習問題,我們也是有一些一般性的思路的,如下:?