SVM分類算法的基本理論問題

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的算法過程

通常,對于分類問題。我們會將數據集分成三部分,訓練集、測試集、交叉驗證集。用訓練集訓練生成模型,用測試集和交叉驗證集進行驗證模型的準確性。?
加載數據的代碼如下:

"""
mnist_loader
~~~~~~~~~~~~
一個加載模式識別圖片數據的庫。
"""#### Libraries
# Standard library
import cPickle
import gzip# Third-party libraries
import numpy as npdef load_data():"""返回包含訓練數據、驗證數據、測試數據的元組的模式識別數據訓練數據包含50,000張圖片,測試數據和驗證數據都只包含10,000張圖片"""f = gzip.open('../data/mnist.pkl.gz', 'rb')training_data, validation_data, test_data = cPickle.load(f)f.close()return (training_data, validation_data, test_data)
  • 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算法進行訓練和預測的代碼如下:

"""
mnist_svm
~~~~~~~~~
使用SVM分類器,從MNIST數據集中進行手寫數字識別的分類程序
"""#### Libraries
# My libraries
import mnist_loader # Third-party libraries
from sklearn import svm
import timedef svm_baseline():print time.strftime('%Y-%m-%d %H:%M:%S') training_data, validation_data, test_data = mnist_loader.load_data()# 傳遞訓練模型的參數,這里用默認的參數clf = svm.SVC()# clf = svm.SVC(C=8.0, kernel='rbf', gamma=0.00,cache_size=8000,probability=False)# 進行模型訓練clf.fit(training_data[0], training_data[1])# test# 測試集測試預測結果predictions = [int(a) for a in clf.predict(test_data[0])]num_correct = sum(int(a == y) for a, y in zip(predictions, test_data[1]))print "%s of %s test values correct." % (num_correct, len(test_data[1]))print time.strftime('%Y-%m-%d %H:%M:%S')if __name__ == "__main__":svm_baseline()
  • 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

以上代碼沒有用驗證集進行驗證。這是因為本例中,用測試集和驗證集要判斷的是一個東西,沒有必要刻意用驗證集再來驗證一遍。事實上,我的確用驗證集也試了一下,和測試集的結果基本一樣。呵呵

直接運行代碼,結果如下:

2016-01-02 14:01:46
9435 of 10000 test values correct.
2016-01-02 14:12:37
  • 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對分類結果的影響。?
gamma和C?
相同的C,gamma越大,分類邊界離樣本越近。相同的gamma,C越大,分類越嚴格。?
下圖是不同C和gamma下分類器交叉驗證準確率的熱力圖?
gamma和C?
由圖可知,模型對gamma參數是很敏感的。如果gamma太大,無論C取多大都不能阻止過擬合。當gamma很小,分類邊界很像線性的。取中間值時,好的模型的gamma和C大致分布在對角線位置。還應該注意到,當gamma取中間值時,C取值可以是很大的。?
在實際項目中,這幾個參數按一定的步長,多試幾次,一般就能得到比較好的分類效果了。

小結

回顧一下整個問題。我們進行了如下操作。對數據集分成了三部分,訓練集、測試集和交叉驗證集。用SVM分類模型進行訓練,依據測試集和驗證集的預測結果來優化參數。依靠sklearn這個強大的機器學習庫,我們也能解決手寫識別這么高大上的問題了。事實上,我們只用了幾行簡單代碼,就讓測試集的預測準確率高達98.5%。?
SVM算法也沒有想象的那么高不可攀嘛,呵呵!?
事實上,就算是一般性的機器學習問題,我們也是有一些一般性的思路的,如下:?
這里寫圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387365.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.5 斐波那契數

求第n項的斐波那契數。 1 1 2 3 5 8 ... 輸入樣例&#xff1a; 6 10 輸出樣例&#xff1a; 8 55 #include<iostream> #include<fstream> #include<cmath> using namespace std;int main() {ifstream cin("test.txt");//向OJ提交時&#xff…

決策樹案例理解

小王是一家著名高爾夫俱樂部的經理。但是他被雇員數量問題搞得心情十分不好。某些天好像所有人都來玩高爾夫&#xff0c;以至于所有員工都忙的團團轉還是應付不過來&#xff0c;而有些天不知道什么原因卻一個人也不來&#xff0c;俱樂部為雇員數量浪費了不少資金。 小王的目的是…

3.6 最大公約數

輸入樣例&#xff1a; 6 5 18 22 輸出樣例&#xff1a; 1 6 #include<iostream> #include<fstream> #include<cmath> using namespace std;int main() {ifstream cin("test.txt");//向OJ提交時&#xff0c;注釋此句int m, n;while (cin >&…

劍指offer-反轉鏈表

反轉鏈表 一、題目描述 輸入一個鏈表&#xff0c;反轉鏈表后&#xff0c;輸出新鏈表的表頭。 &#xff08;看過答案和測試之后&#xff0c;題目隱藏條件是要求鏈表是不帶頭結點的&#xff09; 二、題目思路 就是用三個指針&#xff0c;head、pre、next&#xff0c;head之前都是…

3.7 最小公倍數

先各自除以最大公約數&#xff0c;然后將兩個結果和最大公約數相乘&#xff0c;即為最小公倍數。 輸入樣例&#xff1a; 6 5 18 12 輸出樣例&#xff1a; 30 36 #include<iostream> #include<fstream> using namespace std;int gcd(int, int);int main() {ifs…

聚類、K-Means、例子、細節

聚類#####今天說聚類&#xff0c;但是必須要先理解聚類和分類的區別&#xff0c;很多業務人員在日常分析時候不是很嚴謹&#xff0c;混為一談&#xff0c;其實二者有本質的區別。分類其實是從特定的數據中挖掘模式&#xff0c;作出判斷的過程。比如Gmail郵箱里有垃圾郵件分類器…

圖的廣度優先遍歷

#include <iostream> #include <vector> #include <queue> using namespace std;const int MAXV 1000; const int INF 1000000000; //下標代表點,數組元素代表連接的點 //圖的鄰接表 vector<int> Adj[MAXV]; //頂點數 int n;//DFS 如果頂點i已經被…

3.8 平均數

求若干整數的平均數&#xff0c;結果保留三位小數。 輸入樣例&#xff1a;第一個數字代表數據個數 3 6 5 18 4 1 2 3 4 輸出樣例&#xff1a; 9.667 2.500 #include<iostream> #include<fstream> using namespace std;int main() {ifstream cin("test.t…

從決策樹學習談到貝葉斯分類算法、EM、HMM

引言 最近在面試中(點擊查看&#xff1a;我的個人簡歷&#xff0c;求職意向&#xff0c;擇司標準)&#xff0c;除了基礎 & 算法 & 項目之外&#xff0c;經常被問到或被要求介紹和描述下自己所知道的幾種分類或聚類算法(當然&#xff0c;這完全不代表你將來的面試中會遇…

gdb調試的基本使用

GDB調試 啟動程序準備調試 GDB yourpram 或者 先輸入GDB 然后輸入 file yourpram然后使用run或者r命令開始程序的執行,也可以使用 run parameter將參數傳遞給該程序參數列表  命令 命令縮寫 命令說明 list l 顯示多行源代碼 break b 設置斷點,程序運行到斷點的位置會停…

3.9 對稱三位素數

素數&#xff1a;只能被1和自身整除 判斷一個數是否是素數&#xff1a;判斷從2到sqrt(n)的整數中是否有其約數 判斷一個數是否是三位素數。 輸入樣例&#xff1a; 11 101 272 輸出樣例&#xff1a; No Yes No #include<iostream> #include<fstream> #incl…

決策樹的過擬合問題

決策樹的過擬合問題決策樹是一種分類器&#xff0c;通過ID3&#xff0c;C4.5和CART等算法可以通過訓練數據構建一個決策樹。但是&#xff0c;算法生成的決策樹非常詳細并且龐大&#xff0c;每個屬性都被詳細地加以考慮&#xff0c;決策樹的樹葉節點所覆蓋的訓練樣本都是“純”的…

計算機網絡與協議

計算機網絡&#xff1a; TCP/IP中只要是能夠設定IP地址的計算機就成為主機 網絡按其規模可分為&#xff1a; WAN&#xff08;廣域網&#xff09;&#xff1a;覆蓋多個遠距離區域的遠程網絡 MAN&#xff08;城域網&#xff09;&#xff1a;比廣域網小一級&#xff0c;連接整個城…

3.10 十進制轉換為二進制

將十進制整數轉換成二進制數 對于每個n&#xff0c;以11位的寬度右對齊輸出n值&#xff0c;然后輸出"-->"&#xff0c;然后輸出二進制數。 輸入樣例&#xff1a; 2 0 -12 1 輸出樣例&#xff1a; 2-->10 0-->0 -12-->-1100 1-->1 #include<…

對線性回歸、邏輯回歸、各種回歸的概念學習

回歸問題的條件/前提&#xff1a; 1&#xff09; 收集的數據 2&#xff09; 假設的模型&#xff0c;即一個函數&#xff0c;這個函數里含有未知的參數&#xff0c;通過學習&#xff0c;可以估計出參數。然后利用這個模型去預測/分類新的數據。 1. 線性回歸 假設 特征 和 結果 都…

redis的源碼編譯安裝+發布訂閱+RDB持久化

redis的源碼編譯安裝發布訂閱RDB持久化轉載于:https://www.cnblogs.com/zwq-/p/10420455.html

Shell基礎1

0 Shell基礎 0.1 Shell是什么 0.1.1 Shell是什么 Shell是一個命令行解釋器&#xff0c;它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序&#xff0c;用戶可以用Shell來啟動、掛起、停止甚至編寫一些程序。 硬件 <-內核 <- Shell命令解釋器<-外層應…

centos7自帶數據庫MariaDB重啟和修改密碼

1&#xff1a;MariaDB和mysql差不多是mysql的一個分支&#xff0c;完全兼容mysql的命令。 2&#xff1a;centos 7 中自帶MariaDB&#xff0c; 需要在centos中安裝mysql的時候就需要多注意了。 3&#xff1a;啟動 停止 重啟 MariaDB systemctl start mariadb.service #啟動Maria…

Shell基礎2

0.12 數值運算與運算符 aa11 bb22 cc$aa$bb echo $cc #1122&#xff0c;因為變量默認是字符串類型 1、declare聲明變量類型 declare /- 選項 變量名 選項&#xff1a; - 給變量設定類型屬性 取消變量的類型屬性 -i 將變量聲明為整數型 -x 將變量聲明為環境變量 …

XGBoost入門及實戰

kaggle比賽必備算法XGBoost入門及實戰 xgboost一直在kaggle競賽江湖里被傳為神器&#xff0c;它在對結構化數據的應用占據主導地位&#xff0c;是目前開源的最快最好的工具包&#xff0c;與常見的工具包算法相比速度提高了10倍以上&#xff01; XGBoost is an implementation o…