SVM原理以及Tensorflow 实现SVM分类(附代码讲了一下原理)
- 1.1. SVM介紹
- 1.2. 工作原理
- 1.2.1. 幾何間隔和函數間隔
- 1.2.2. 最大化間隔
- 1.3. 軟間隔
- 1.4. SMO算法
- 1.5. 核函數
- 1.6. 實例
1.1. SVM介紹
SVM(Support Vector Machines)——支持向量機是在所有知名的數據挖掘算法中最健壯,最準確的方法之一,它屬于二分類算法,可以支持線性和非線性的分類。發展到今天,SVM已經可以支持多分類了,但在這一章里,我們著重講支持向量機在二分類問題中的工作原理。
假設在一個二維線性可分的數據集中,圖一A所示,我們要找到一個超平面把兩組數據分開,這時,我們認為線性回歸的直線或邏輯回歸的直線也能夠做這個分類,這條直線可以是圖一B中的直線,也可以是圖一C中的直線,或者圖一D中的直線,但哪條直線才最好呢,也就是說哪條直線能夠達到最好的泛化能力呢?那就是一個能使兩類之間的空間大小最大的一個超平面。
這個超平面在二維平面上看到的就是一條直線,在三維空間中就是一個平面...,因此,我們把這個劃分數據的決策邊界統稱為超平面。離這個超平面最近的點就叫做支持向量,點到超平面的距離叫間隔。支持向量機就是要使超平面和支持向量之間的間隔盡可能的大,這樣超平面才可以將兩類樣本準確的分開,而保證間隔盡可能的大就是保證我們的分類器誤差盡可能的小,盡可能的健壯。
圖一
1.2. 工作原理
1.2.1. 幾何間隔和函數間隔
在最大化支持向量到超平面距離前,我們首先要定義我們的超平面h(x)h(x)(稱為超平面的判別函數,也稱給定ww和bb的泛函間隔),其中ww為權重向量,bb為偏移向量:
?
h(x)=wTx+bh(x)=wTx+b
?
樣本xx到最優超平面的幾何間隔為:
?
r=h(x)||w||=wTx+b||w||r=h(x)||w||=wTx+b||w||
?
||w||||w||是向量ww的內積,是個常數,即||w||=w02+w12+...+wn2????????????????√||w||=w02+w12+...+wn2,而h(x)h(x)就是下面要介紹的函數間隔。
函數間隔:
?
r?=h(x)r^=h(x)
?
函數間隔h(x)h(x)它是一個并不標準的間隔度量,是人為定義的,它不適合用來做最大化的間隔值,因為,一旦超平面固定以后,如果我們人為的放大或縮小ww和bb值,那這個超平面也會無限的放大或縮小,這將對分類造成嚴重影響。而幾何間隔是函數間隔除以||w||||w||,當ww的值無限放大或縮小時,||w||||w||也會放大或縮小,而整個rr保持不變,它只隨著超平面的變動而變動,不受兩個參數的影響。因而,我們用幾何間隔來做最大化間隔度量。
1.2.2. 最大化間隔
在支持向量機中,我們把幾何間隔rr作為最大化間隔進行分析,并且采用-1和1作為類別標簽,什么采用-1和+1,而不是0和1呢?這是由于-1和+1僅僅相差一個符號,方便數學上的處理。我們可以通過一個統一公式來表示間隔或者數據點到分隔超平面的距離,同時不必擔心數據到底是屬于-1還是+1類。
我們一步一步的進行分析,首先如下圖,在這個R2R2空間中,假設我們已經確定了一個超平面,這個超平面的函數關系式應該是h(x)=wTx+b=0h(x)=wTx+b=0,這個式子表示我們圖中的那條虛線,很明顯,這個式子意思是說點x在超平面上,但我們要想使所有的點都盡可能的遠離這個超平面,我們只要保證離這個超平面最近的點遠離這個超平面,也就是說這些叫支持向量的點x?x?需要盡可能的遠離它。
?
我們把其中一個支持向量x?x?到最優超平面的距離定義為:
?
r?=h(x?)||w||=?????????1||w||?1||w||if:y?=h(x?)=+1if:y?=h(x?)=?1r?=h(x?)||w||={1||w||if:y?=h(x?)=+1?1||w||if:y?=h(x?)=?1
?
這是我們通過把函數間隔h(x)h(x)固定為1而得來的。我們可以把這個式子想象成還存在兩個平面,這兩個平面分別是wTxs+b=1wTxs+b=1和wTxs+b=?1wTxs+b=?1,對應上圖中的兩根實線。這些支持向量xsxs就在這兩個平面上,這兩個平面離最優超平面的距離越大,我們的間隔也就越大。對于其他的點xixi如果滿足wTxi+b>1wTxi+b>1,則被分為1類,如果滿足滿足wTxi+b<?1wTxi+b<?1,則被分為-1類。即有約束條件:
?
?????wTxi+b?1wTxi+b??1yi=+1yi=?1{wTxi+b?1yi=+1wTxi+b??1yi=?1
?
支持向量到超平面的距離知道后,那么分離的間隔ρρ很明顯就為:
?
ρ=2r?=2||w||ρ=2r?=2||w||
?
這下我們就要通過找到最優的ww和bb來最大化ρρ了,感覺又像回到了邏輯回歸或線性回歸的例子。但是這里,我們最大化ρρ值需要有條件限制,即:
?
???????maxw,b2||w||yi(wTxi+b)?1,?(i=1,..,n){maxw,b2||w||yi(wTxi+b)?1,?(i=1,..,n)
?
yi(wTxi+b)yi(wTxi+b)的意思是通過判斷yiyi和wTxi+bwTxi+b是否同號來確定分類結果。
接著,為了計算方便,我們把上式最大化ρρ換成:
?
???????minw,b12||w||2yi(wTxi+b)?1,?(i=1,..,n){minw,b12||w||2yi(wTxi+b)?1,?(i=1,..,n)
?
這種式子通常我們用拉格朗日乘數法來求解,即:
?
L(x)=f(x)+∑αg(x)L(x)=f(x)+∑αg(x)
?
f(x)f(x)是我們需要最小化的目標函數,g(x)g(x)是不等式約束條件,即前面的yi(wTxi+b)?1yi(wTxi+b)?1,αα是對應的約束系數,也叫拉格朗日乘子。為了使得拉格朗日函數得到最優化解,我們需要加入能使該函數有最優化解法的KKT條件,或者叫最優化條件、充要條件。即假設存在一點x?x?
1.2.2.0.0.1.?L(x?)L(x?)對x?x?求導為0
1.2.2.0.0.2.?αigi(x?)=0αigi(x?)=0,對于所有的i=1,.....,ni=1,.....,n
這樣構建我們的拉格朗日函數為:
?
L(w,b,α)=12wTw?∑i=1nαi[yi(wTxi+b)?1]L(w,b,α)=12wTw?∑i=1nαi[yi(wTxi+b)?1]
?
以上的KKT條件αi[yi(wTxi+b)?1]=0αi[yi(wTxi+b)?1]=0表示,只有距離最優超平面的支持向量(xi,yi)(xi,yi)對應的αα非零,其他所有點集的αα等于零。綜上所述,引入拉格朗日乘子以后,我們的目標變為:
?
minw,bmaxα?0L(w,b,α)minw,bmaxα?0L(w,b,α)
?
即先求得αα的極大值,再求ww和bb的極小值。可以把該問題轉為為等價的凸優化和對偶問題來求解,對于凸優化和對偶問題可以參考《凸優化》這本書,因為該理論可以整整用一本書來介紹了,筆者在這里也只能點到為止了。通過對偶,我們的目標可以又變成:
?
maxα?0minw,bL(w,b,α)maxα?0minw,bL(w,b,α)
?
即先求得ww和bb的極小值,在求αα的極大值。用L(w,b,α)L(w,b,α)對ww和bb分別求偏導,并令其等于0:
?
????????L(w,b,α)?w=0??L(w,b,α)?b=0{?L(w,b,α)?w=0??L(w,b,α)?b=0
?
得:
?
???w=∑ni=1αiyixi?∑ni=1αiyi=0{w=∑i=1nαiyixi?∑i=1nαiyi=0
?
把該式代入原來的的拉格朗日式子可得(推導過程省略):
?
W(α)=∑i=1nαi?12∑i=1n∑j=1nαiαjyiyjxiTxjW(α)=∑i=1nαi?12∑i=1n∑j=1nαiαjyiyjxiTxj
?
?
∑i=1nαiyi=0?,αi?0(i=1,...,n)∑i=1nαiyi=0?,αi?0(i=1,...,n)
?
該W(α)W(α)函數消去了向量ww和向量bb,僅剩αα這個未知參數,只要我們能夠最大化W(α)W(α),就能求出對應的αα,進而求得ww和bb。對于如何求解αα,SMO算法給出了完美的解決方案,下一節我們詳細講述。這里我們假設通過SMO算法確定了最優α?α?,則
?
w?=∑i=1nαi?yixiw?=∑i=1nαi?yixi
?
最后使用一個正的支持向量xsxs,就可以計算出bb:
?
b?=1?w?Txsb?=1?w?Txs
?
1.3. 軟間隔
在4.2節中我們推導了如何計算ww、bb和αα,但別忘了以上所有的推導都是在線性可分的條件下進行的,但是現實世界的許多問題并不都是線性可分的,尤其存在許多復雜的非線性可分的情形。如果樣本不能被完全線性分開,那么情況就是:間隔為負,原問題的可行域為空,對偶問題的目標函數無限,這講導致相應的最優化問題不可解。
要解決這些不可分問題,一般有兩種方法。第一種是放寬過于嚴格的間隔,構造軟間隔。另一種是運用核函數把這些數據映射到另一個維度空間去解決非線性問題。在本節中,我們首先介紹軟間隔優化。
假設兩個類有幾個數據點混在一起,這些點對最優超平面形成了噪聲干擾,軟間隔就是要擴展一下我們的目標函數和KKT條件,允許少量這樣的噪聲存在。具體地說,就要引入松馳變量ξiξi來量化分類器的違規行為:
?
???????minw,b12||w||2+C∑ni=1ξiyi(wTxi+b)?1?ξi,ξi?0,(i=1,..,n){minw,b12||w||2+C∑i=1nξiyi(wTxi+b)?1?ξi,ξi?0,(i=1,..,n)
?
參數C用來平衡機器的復雜度和不可分數據點的數量,它可被視為一個由用戶依據經驗或分析選定的“正則化”參數。松馳變量ξiξi的一個直接的幾何解釋是一個錯分實例到超平面的距離,這個距離度量的是錯分實例相對于理想的可分模式的偏差程度。對上式的化解,可得:
?
W(α)=∑i=1nαi?12∑i=1n∑j=1nαiαjyiyjxiTxjW(α)=∑i=1nαi?12∑i=1n∑j=1nαiαjyiyjxiTxj
?
?
∑i=1nαiyi=0,0?αi?C(i=1,...,n)∑i=1nαiyi=0,0?αi?C(i=1,...,n)
?
可以看到,松馳變量ξiξi沒有出現在W(α)W(α)中,線性可分與不可分的差異體現在約束αi?0αi?0被替換成了約束0?αi?C0?αi?C。但是,這兩種情況下求解ww和bb是非常相似的,對于支持向量的定義也都是一致的。
在不可分情況下,對應的KKT條件為:
?
αi[yi(wTxi+b)?1+ξi]=0,(i=1,...,n)αi[yi(wTxi+b)?1+ξi]=0,(i=1,...,n)
?
1.4. SMO算法
1996年, John Platt發布了一個稱為SMO的強大算法,用于訓練SVM。 SMO表示序列最小優化(Sequential Minimal Optimization)。 Platt的SMO算法是將大優化問題分解為多個小優化問題來求解,這些小優化問題往往很容易求解,并且對它們進行順序求解的結果與將它們作為整體來求解的結果是完全一致的。
SMO算法的目標是求出一系列αα,一旦求出了這些αα,就很容易計算出權重向量ww和bb,并得到分隔超平面。
SMO算法的工作原理是:每次循環中選擇兩個αα進行優化處理。一旦找到一對合適的αα,那么就增大其中一個同時減小另一個。這里所謂的“合適”就是指兩個αα必須要符合一定的條件,條件之一就是這兩個αα必須要在間隔邊界之外,而其第二個條件則是這兩個αα還沒有進行過區間化處理或者不在邊界上。
對SMO具體的分析如下,在4.3節中我們已經得出了
?
W(α)=∑i=1nαi?12∑i=1n∑j=1nαiαjyiyjxiTxjW(α)=∑i=1nαi?12∑i=1n∑j=1nαiαjyiyjxiTxj
?
?
∑i=1nαiyi=0,0?αi?C(i=1,...,n)∑i=1nαiyi=0,0?αi?C(i=1,...,n)
?
其中(xi,yi)(xi,yi)已知,C可以預先設定,也是已知數,現在就是要最大化W(α)W(α),求得參數α=[α1,α2,...,αn]α=[α1,α2,...,αn]。SMO算法是一次選擇兩個αα進行優化,那我們就選擇α1α1和α2α2,然后把其他參數[α3,α4,...,αn][α3,α4,...,αn]固定,這樣α1α1、α2α2表示為下面的式子,其中ζζ是實數值:
?
α1y1+α2y2=?∑i=3nαiyi=ζα1y1+α2y2=?∑i=3nαiyi=ζ
?
然后用α2α2來表示α1α1:
?
α1=(ζ?α2y2)y1α1=(ζ?α2y2)y1
?
把上式帶入W(α)W(α)中:
?
W(α)=W(α1,α2,...,αn)=W((ζ?α2y2)y1,α2,...,αn)W(α)=W(α1,α2,...,αn)=W((ζ?α2y2)y1,α2,...,αn)
?
省略一系列化解過程后,最后會化解成我們熟悉的一元二次方程,a,b,c均是實數值:
?
W(α2)=aα22+bα2+cW(α2)=aα22+bα2+c
?
最后對α2α2求導,解得α2α2的具體值,我們暫時把這個實數值叫α?2α2?。而這個α?2α2?需要滿足一個條件L?α?2?HL?α2??H,其中LL和HH是什么呢?如下圖所示:
(圖片來自網絡)
根據之前的條件0?αi?C0?αi?C和等式α1y1+α2y2=ζα1y1+α2y2=ζ知α1α1和α2α2要在矩形區域內,并且在直線上。當y1y1和y2y2異號時:
?
???L=max(0,α2?α1)H=min(C,C+α2?α1){L=max(0,α2?α1)H=min(C,C+α2?α1)
?
當y1y1和y2y2同號時:
?
???L=max(0,α2+α1?C)H=min(C,α2+α1){L=max(0,α2+α1?C)H=min(C,α2+α1)
?
最后,滿足條件的α2α2應該由下面的式子得到,α??2α2??才為最終的值:
?
α??2=?????????????Hα?2L,α?2>H,L≤α?2≤H,α?2<Lα2??={H,α2?>Hα2?,L≤α2?≤HL,α2?<L
?
求得α??2α2??后我們就可以求得α??1α1??了。然后我們重復地按照最優化(α1,α2)(α1,α2)的方式繼續選擇(α3,α4)(α3,α4),(α5,α6)(α5,α6)....(αn?1,αn)(αn?1,αn)進行優化求解,這樣α=[α1,α2,...,αn]α=[α1,α2,...,αn]求解出來后,整個線性劃分問題就迎刃而解。
1.5. 核函數
對于以上幾節講的SVC算法,我們都在線性可分或存在一些噪聲點的情況下進行的二分類,但是如果我們存在兩組數據,它們的散點圖如下圖所示,你可以看出這完全是一個非線性不可分的問題,我們無法使用之前講的SVC算法在這個二維空間中找到一個超平面把這些數據點準確的分開。
?
解決這個劃分問題我們需要引入一個核函數,核函數能夠恰當的計算給定數據的內積,將數據從輸入空間的非線性轉變到特征空間,特征空間具有更高甚至無限的維度,從而使得數據在該空間中被轉換成線性可分的。如下圖所示,我們把二維平面的一組數據,通過核函數映射到了一個三維空間中,這樣,我們的超平面就面成了一個平面(在二維空間中是一條直線),這個平面就可以準確的把數據劃分開了。
?
核函數有Sigmoid核、線性核、多項式核和高斯核等,其中高斯核和多項式核比較常用,兩種核函數均可以把低維數據映射到高維數據。高斯核的公式如下,σσ是達到率,即函數值跌落到0的速度參數:
?
K(x1,x2)=exp(?||x1?x2||22σ2)K(x1,x2)=exp(?||x1?x2||22σ2)
?
多項式核函數的公式如下,RR為實數,dd為低維空間的維數:
?
K(x1,x2)=(?x1,x2?+R)dK(x1,x2)=(?x1,x2?+R)d
?
應用于我們的上個例子,我們先定義,用?:x→H?:x→H表示從輸入空間x?Rnx?Rn到特征空間H的一個非線性變換。假設在特征空間中的問題是線性可分的,那么對應的最優超平面為:
?
w?T?(x)+b=0w?T?(x)+b=0
?
通過拉格朗日函數我們推導出:
?
w??=∑i=1nαi?yi?(xi)w??=∑i=1nαi?yi?(xi)
?
帶入上式得特征空間的最優超平面為:
?
∑i=1nαi?yi?T(xi)?(x)+b=0∑i=1nαi?yi?T(xi)?(x)+b=0
?
這里的?T(xi)?(x)?T(xi)?(x)表示內積,用核函數代替內積則為:
?
∑i=1nαi?yiK(xi,x)+b=0∑i=1nαi?yiK(xi,x)+b=0
?
這說明,我們的核函數均是內積函數,通過在低維空間對輸入向量求內積來映射到高維空間,從而解決在高維空間中數據線性可分的問題,至于具體的推導過程,這里就不再進行了,感興趣的可以自己再推導一次,加深理解。
為什么核函數可以把低維數據映射成高維數據呢,我們以多項式核來解釋一下。
假設有兩個輸入樣本,它們均為二維行向量x1=[x1,x2]x1=[x1,x2],x2=[x3,x4]x2=[x3,x4],他們的內積為:
?
?x1,x2?=x1x2T=[x1x2][x3x4]=x1x3+x2x4?x1,x2?=x1x2T=[x1x2][x3x4]=x1x3+x2x4
?
用多項式核函數進行映射,令R=0R=0,d=2d=2:
?
K(x1,x2)=(?x1,x2?)2=(x1x3+x2x4)2=x12x32+2x1x2x3x4+x22x42=?(x1)?(x2)K(x1,x2)=(?x1,x2?)2=(x1x3+x2x4)2=x12x32+2x1x2x3x4+x22x42=?(x1)?(x2)
?
按照線性代數中的標準定義,?(x1)?(x1)和?(x2)?(x2)為映射后的三維行向量和三維列向量,即:
?
?(x1)=[x122–√x1x2x22]?(x1)=[x122x1x2x22]
?
?
?(x2)=????????x322–√x3x4x42?????????(x2)=[x322x3x4x42]
?
它們的內積用向量的方式表示則更直觀:
?
?(x1)?(x2)=[x122–√x1x2x22]????????x322–√x3x4x42????????=x12x32+2x1x2x3x4+x22x42?(x1)?(x2)=[x122x1x2x22][x322x3x4x42]=x12x32+2x1x2x3x4+x22x42
?
這樣我們就把二維數據映射成了三維數據,對于高斯核的映射,會用到泰勒級數展開式,讀者可以自行推導一下。
對于核函數我們就暫時介紹到這里。下一節我們開始運用tensorflow來進行實戰,由于沒有找到線性不可分的數據集,我們的例子中就沒有用到核函數來建模,因為我們只找到了一個線性可分的數據集,所以下一節我們僅運用tensorflow來進行線性二分類的分類器構建。
1.6. 實例
我們在網上下載了一組鳶尾花數據集,這組數據集有100個樣本點,我們用SVM來預測這些鳶尾花數據集中哪些是山鳶尾花,哪些是非山鳶尾花。
- 首先需要加載數據集,加載數據集需要用到sklearn、scipy、mkl庫,sklearn直接在Pycharm中安裝即可,而另外兩個庫需要在網上下載安裝,下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
- 分離測試集與訓練集
- 定義模型和loss函數
- 開始訓練數據
- 繪制圖像
訓練后的結果
轉載注明出處http://www.cnblogs.com/vipyoumay/p/7560061.html
以上內容有任何錯誤或不準確的地方請大家指正,不喜勿噴! 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步么?那就【關注】我吧。
來源:https://www.cnblogs.com/vipyoumay/p/7560061.html
總結
以上是生活随笔為你收集整理的SVM原理以及Tensorflow 实现SVM分类(附代码讲了一下原理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python实现鸢尾花数据集分类问题——
- 下一篇: 想买地暖机,因为地暖机比较低碳环保,不止