機器學習算法原理筆記(一)—— SVM支持向量機


一帚称、SVM簡述

SVM支持向量機(英文全稱:support vector machine)是一個分類算法敷扫, 通過找到一個分類平面突诬, 將數(shù)據(jù)分隔在平面兩側漫雷, 從而達到分類的目的颂龙。

其實SVM同其他機器學習算法一樣习蓬,直觀解釋并不難理解。簡單來說措嵌,SVM就是間隔最大化分類躲叼。如下圖所示,其實能正確對正負樣本進行分類的分隔線其實是很多的企巢,通常的分類算法只是找到了其中一條線對樣本進行分類:

考慮到這種情況枫慷,我們很自然可以想到那么我們可不可以找到一條最優(yōu)的線來分隔樣本呢?這就是SVM考慮的問題浪规。


二流礁、超平面

我們現(xiàn)在要考慮最優(yōu)的線來對我們的樣本進行分類,但線這個概念其實是二維的罗丰,當我們的數(shù)據(jù)是三維時神帅,這就變成了面。但如果我們的樣本不止二維(這種情況很常見萌抵,很少有數(shù)據(jù)集只有這么少的特征)找御,那么此時就需要提出超平面的概念。

我們對“平面”概念的理解绍填,一般是定義在三維空間中的:

A霎桅、B和C與x、y和z的關系其實可以用向量的形式來表示:

這個平面由兩個性質定義:

  • 方程是線性的讨永,是由空間點的各分量的線性組合
  • 方程數(shù)量是1滔驶。這個平面是建立在“三維”上的。

如果我們撇開“維度”這個限制卿闹,那么就有了超平面的定義揭糕。實際上,超平面是純粹的數(shù)學概念锻霎,不是物理概念著角,它是平面中的直線、空間中的平面的推廣旋恼,只有當維度大于3吏口,才稱為“超”平面。

百度百科上對超平面的數(shù)學定義是這樣的:超平面H是從n維空間到n-1維空間的一個映射子空間,它有一個n維向量和一個實數(shù)定義产徊。簡單來說就是二維空間里的超平面為一條直線. 一維空間里超平面為數(shù)軸上的一個點昂勒。

定義完超平面,我們接下來就要考慮距離的問題舟铜,我們高中就學過三維空間中點到面的距離公式為:

換成向量的表示形式就是:

那么可以想象叁怪,超平面上點到超平面的距離用公式表示也不外乎就是A、B深滚、C之類的參數(shù)個數(shù)變多而已奕谭,所以完全可以用上式來表示超平面上點到超平面的距離。


三痴荐、間隔最大化

解決了距離的表示方法血柳,我們就可以回到我們原來的問題上來,我們想要找到一個超平面最大程度地分隔數(shù)據(jù)生兆∧寻疲考慮到我們對每個點都求到超平面的距離然后再對這個問題進行優(yōu)化顯然是不可行的,那么我們可以將問題轉化為距離超平面最近的樣本到超平面的距離最大鸦难,也就是說我們先對下面的式子求一個使得該式子最小的i根吁,然后再對其求使得該式子最大的wb

但是這樣的問題顯然還是難以處理,為了能在現(xiàn)實中應用合蔽,我們希望能對其做一些簡化, 使其變得便于求解的優(yōu)化問題击敌。

觀察距離公式我們可以發(fā)現(xiàn)wb同乘一個數(shù)r變成 rwrb ,對上面這個距離也是沒什么影響的拴事,那么我們干脆找一個wb使得上面需要變化為1沃斤,也就是我們強制使得下面這個式子成立:

另外,考慮到最大化\frac{1}{∥w∥}其實也就是最小化∥w∥^2刃宵,然后為了求導相消的方便衡瓶,前面補一個1/2,這樣我們的問題就變成了下面這個形式:

這種帶最小值的約束條件我們是不喜歡的,能不能換個形式呢?比如:

我們用反證法可以證明:

假設我們現(xiàn)在已經(jīng)求解得滿足y_i(w^?x_i + b) \geq 1且使得\frac{1}{2} w^Tw最小的最優(yōu)值 (w^*, b^{*})甚淡,這個最優(yōu)值 (w^*, b^{*})在等號不成立,即 y_i(w^?x_i + b) > 1十厢,那么此時應該存在一個(rw^*, rb^*)使得y_i(w^?x_i + b) = 1成立。因為y_i(w^?x_i + b) > 1键闺,所以可以想象r應該滿足0 < r < 1的條件寿烟。但這樣的話澈驼,∥rw^*∥^2 < ∥w^*∥^2辛燥,這顯然與假設是不符合的,所以,我們的問題可以等價為:

對于這個帶約束條件的問題挎塌,我們最直接的想到的方法應該就是高中學過的構造拉格朗日函數(shù)的方法徘六,所以,先用一個小節(jié)敘述下構造拉格朗日函數(shù)榴都。


四待锈、拉格朗日函數(shù)和對偶問題

轉化成拉格朗日函數(shù)之后,我們自然知道我們要對f({{u}^{*}})取最小值嘴高,那么\alpha , \beta應該怎么辦呢竿音?我們進行如下操作:

我們對原問題可以這么理解,我們一定要使得約束條件成立拴驮,也就是我們求得的u絕對會滿足約束條件春瞬。那么怎么保證這一點呢?那就是一旦u不滿足約束條件套啤,那么其就應該導致這個u不可能會被 \underset{u}{\mathop{\min }}\,f(u )選中宽气,轉化成如拉格朗日函數(shù)一樣的形式的話就變成如下表示:

如果我們將 \sum\limits_{i}{{{\alpha }_{i}}{{g}_{i}}({{x}^{*}})}+\sum\limits_{i}{{{\beta }_{i}}{{h}_{i}}({{x}^{*}})} 看成是懲罰的話,那么原問題的懲罰就是一旦不符合約束條件潜沦,懲罰就是∞萄涯。但這樣的表達在數(shù)學上不美觀,那應該怎么表示呢唆鸡?
我們觀察g涝影,當不符合g的條件時,{{g}_{i}}({{x}}) > 0争占,當符合的時候袄琳,{{g}_{i}}({{x}}) =< 0。那么我們不就可以用\underset{\alpha }{\mathop{\max }}\,L(u,\alpha ,\beta )來表示嗎?當不符合g的條件燃乍,{{g}_{i}}({{x}}) > 0時唆樊,只要取\alpha為∞,就能使得L(u,\alpha ,\beta )取到最大值刻蟹,也就是∞逗旁,同理也可以得到當符合的時候時,只要取\alpha為0舆瘪,就能使得L(u,\alpha ,\beta )取到最大值0片效。所以我們得到了原問題的等價形式:

那么問題又來了,這個等價問題并不好解英古。所以淀衣,我們提出了一個對偶問題:

其實對偶問題從原問題出發(fā)非常好理解,我們先拋棄掉我們得到的原問題的等價形式召调,回到原問題膨桥。

我們將原問題轉化為拉格朗日函數(shù)后蛮浑,必然第一反應是對其求最小值:

\begin{align*}\underset{u}{\mathop{\min }}\,L(u,\alpha ,\beta )\\\end{align*}

那么\alpha , \beta怎么辦呢?

假設我們現(xiàn)在有一個最優(yōu)的u^*滿足約束條件并且使得f(u)最小只嚣,我們將其帶入上式就會發(fā)現(xiàn)我們并不能保證u是最優(yōu)時沮稚,\sum\limits_{i}{{{\alpha }_{i}}{{g}_{i}}({{u}^{*}})}為0,由于\alpha >= 0册舞,又因為當u^*滿足約束條件{{g}_{i}}({{u}^{*}}) <= 0蕴掏,所以我們最多只能保證下面這個不等式:

\begin{align*}f({{u}^{*}})+\sum\limits_{i}{{{\alpha }_{i}}{{g}_{i}}({{u}^{*}})}+\sum\limits_{i}{{{\beta }_{i}}{{h}_{i}}({{u}^{*}})} \le f({{u}^{*}}) ={{p}^{*}} \\\end{align*}

那么怎么使得它和原問題盡可能地接近,最明顯的方式就是對其\underset{\alpha}{\mathop{\max }}\,L(u,\alpha ,\beta )调鲸,當然同上面懲罰的道理盛杰,也需要對\beta也進行相同的操作,這樣就得到了所謂的原問題的對偶問題:

既然是求最大值藐石,那么最大的問題就是這個等號是不是能成立饶唤。

  1. Slater條件

存在一個最優(yōu)解u^* ,使得不等式約束{{g}_{i}}({{u}^{*}})≤0嚴格成立贯钩,即{{g}_{i}}({{u}^{*}}) != 0募狂。
當原問題為一凸優(yōu)化問題,且滿足Slater條件時角雷,有d* = p*祸穷,這樣就原問題和對偶問題的解一致,求解對偶問題即可勺三。顯然雷滚,Slater是凸優(yōu)化問題與其對偶問題等價的一個充分條件。

  1. KTT條件

考慮一般優(yōu)化問題(不一定是凸優(yōu)化)吗坚,如果有d* = p*祈远,則:

\begin{align*}\underset{u}{\mathop{\min }}\,L(u,{{\alpha }^{*}},{{\beta }^{*}}) \le L({{u}^{*}},{{\alpha }^{*}},{{\beta }^{*}}) =f({{u}^{*}})+\sum\limits_{i}{{{\alpha }_{i}}^{*}{{g}_{i}}({{u}^{*}})}+\sum\limits_{i}{{{\beta }_{i}}^{*}{{h}_{i}}({{u}^{*}})} \ \le f({{u}^{*}}) ={{p}^{*}} \\\end{align*}

由于d* = p*,所以上面推導過程中所以的不等號“≤ ”應該取到等號商源。第一個等號得到\underset{u}{\mathop{\min }}\,L(u,{{\alpha }^{*}},{{\beta }^{*}}) \le L({{u}^{*}},{{\alpha }^{*}},{{\beta }^{*}})车份,這說明u^*\underset{u}{\mathop{\min }}\,L(u,{{\alpha }^{*}},{{\beta }^{*}}) 的一個極值點,所以\underset{u}{\mathop{\min }}\,L(u,{{\alpha }^{*}},{{\beta }^{*}})u* 處的偏導為零牡彻,\frac{\partial L(x,{{\alpha }^{*}},{{\beta }^{*}})}{\partial x}{{|}_{{{x}^{*}}}}=0

另外在f({{u}^{*}})+\sum\limits_{i}{{{\alpha }_{i}}^{*}{{g}_{i}}({{u}^{*}})}+\sum\limits_{i}{{{\beta }_{i}}^{*}{{h}_{i}}({{u}^{*}})} \le f({{u}^{*}})取得等號 扫沼,除去本來就應該為0的項之外,現(xiàn)在還需要\sum\limits_{i}{{{\alpha }_{i}}^{*}{{g}_{i}}({{u}^{*}})}等于0

綜合以上兩點庄吼,在加上原來的約束缎除,可以得到KKT條件:

\left\{ \begin{matrix}\frac{\partial L(u,{{\alpha }^{*}},{{\beta }^{*}})}{\partial u}{{|}_{{{u}^{*}}}}=0 \\\sum\limits_{i}{{{\alpha }_{i}}^{*}{{g}_{i}}({{u}^{*}})}=0 \\{{\alpha }_{i}}^{*}\ge 0 \\\begin{matrix}{{g}_{i}}({{u}^{*}})\le 0 \\{{h}_{i}}({{u}^{*}})=0 \\\end{matrix} \\\end{matrix} \right.

盡管KKT條件是d* = p*的必要條件,但當原問題是凸優(yōu)化問題時总寻,它就升級為充要條件器罐,也就是只要找到u^*,α^*,β^*滿足以上五個條件,那么原問題就和對偶問題就有相同的解渐行,分別在u^?(α^?,β^?)處取得轰坊。

注:另外铸董,根據(jù)KKT條件中的\sum\limits_{i}{{{\alpha }_{i}}^{*}{{g}_{i}}({{u}^{*}})}=0可以得到,{{g}_{i}}({{u}^{*}})<0 ? {{\alpha }_{i}}^{*}=0衰倦,反過來說袒炉,只有{{g}_{i}}({{u}^{*}})=0旁理,{{\alpha }_{i}}^{*}才有可能不為0樊零,這是之后SVM中會用到的一個重要性質。


五孽文、間隔最大化后續(xù)

我們將線性支持向量機的拉格朗日函數(shù)寫出:

其對偶問題為:

我們對于這個對偶問題的求解可以分成兩部分:

  1. 固定α驻襟,令拉格朗日函數(shù)分別對(w, b)求偏導數(shù)并令其等于零:

將結果帶入原式子:

回帶后的結果:

  1. 求對α的極大

改變一下符號,使得其變?yōu)榍笞钚〉膯栴}

那么α怎么求解呢?最笨的方法當然是一一帶入去試求芋哭,未引入軟間隔時沉衣,α使用這種方法還是好求的,但加入軟間隔后减牺,α的限制范圍變多了豌习,就只能尋求更高效的方法,例如SMO算法

假設我們已經(jīng)得到最優(yōu)的α^*拔疚,那么根據(jù)KKT條件可得:

KKT條件

所以我們可以推出:

由第三行KKT 條件還可以得到:

所以支持向量機的參數(shù) (w, b) 僅由支持向量決定, 與其他樣本無關(最理想的情況當然是我們完美地得到了所有的支持向量肥隆,然后得到下面的式子):

其中 SV 代表所有支持向量的集合

b同樣可以由上述條件得出:

線性支持向量機的假設函數(shù)可表示為:


六、序列最小最優(yōu)化算法SMO

SMO算法是一種啟發(fā)式算法稚失,其基本思路是:如果所有的變量的解都滿足此最優(yōu)問題的KKT條件栋艳,那么這個優(yōu)化問題的解就能得到。也就是說由于KKT條件是該優(yōu)化問題的充分必要條件句各,所以只有當所有的a都滿足KKT條件時吸占,這些a就是該優(yōu)化問題的解。

但是a的數(shù)量眾多凿宾,并且還需要滿足如下等式:

所以矾屯,對所有的a直接進行調整使其符合KKT條件顯然是一件相當困難的事情。

就該問題初厚,SMO 選擇每步同時選擇兩個變量 α_iα_j 進行優(yōu)化,问拘,并固定其他參數(shù),以保證不違背約束惧所。

也就是說我們通過如下方法同時更新a_ia_j

此時我們每步的優(yōu)化目標為(就是把原來的式子中和a_ia_j無關的去掉了):

注:這里\Phi(x)是加了映射函數(shù)的意思骤坐,去掉不影響,注意這里的c和下面的C不同下愈,下面的C指的是這里的\xi之和前面的超參數(shù)纽绍,表示對誤分類的懲罰程度。\xi是松弛因子的意思势似,具體的推導可以參考:松弛因子

在不考慮其他的約束條件的情況下拌夏,我們可以通過用a_j來表示a_i的方式使得本來有兩個變量的函數(shù)變成只有一個僧著,這個時候其實就可以求偏導并令其為 0得到更新值。

注意:下面推導中中1障簿,2和我們這里的i盹愚,j是對應的,僅僅是假設i站故,j為1皆怕,2而已,K是核函數(shù)的意思西篓,去掉不影響愈腾。

詳細的推導可以參考:

  1. 知乎SMO
  2. CSDN

結果為:

接著我們就要考慮其他的約束條件:
把SMO中對于同時更新α_iα_j過程看成線性規(guī)劃來理解來理解的話,那么下圖所表達的便是約束條件:`

根據(jù)y_iy_j同號或異號岂津,可得出α的上下界分別為:

根據(jù)這里得到的上下界對上面最近求偏導所得到的α進行剪裁虱黄。

最后可以通過其求另一個α的值:

到這里為止,其實SMO算法已經(jīng)可以基本可以結束了吮成。但是還有一個關鍵性的問題要解決橱乱,那就是α_iα_j的選取。

理論上講, 每步優(yōu)化時 α_iα_j 可以任意選擇, 但實踐中通常取 α_i 為違背 KKT 條件最大的α, 而 α_i 取對應樣本與 α_j 對應樣本之間間隔最大的變量粱甫,也就是選擇使| E1 - E2 | 最大的α_j 泳叠。 具體操作可以參考:SMO變量選取

SMO的主要步驟如下:
  1. 第一步選取一對α_iα_j ,選取方法使用啟發(fā)式方法
    先“掃描”所有乘子魔种,把第一個違反KKT條件的作為更新對象析二,令為α_i (還有其他一些啟發(fā)式的方法)。在所有不違反KKT條件的α中节预,選擇使| E_1 - E_2 |最大的α_j進行更新叶摄,使得能最大限度增大目標函數(shù)的值

  2. 固定除α_iα_j的其他參數(shù),用α_j表示α_i安拟,進行更新迭代

最后蛤吓,每次更新完兩個乘子的優(yōu)化后,都需要再重新計算b糠赦,及對應的E_i值会傲。


七、機器學習實戰(zhàn)中的python實現(xiàn)

#coding=utf-8

import numpy as np

#數(shù)據(jù)讀取
def loadDataSet(fileName):
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = line.strip().split('\t')
        dataMat.append([float(lineArr[0]), float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat,labelMat



#該過程即為已經(jīng)確定了一個alphas拙泽,在剩下的中選取另一個alphas構成SMO算法中選擇兩個來優(yōu)化的過程
#:已經(jīng)選擇的alphas的下標淌山;全部alphas的數(shù)碼(要-1,畢竟下標從0算起)
#r:選擇的下標
def selectJrand(i,m):
    j=i
    while (j==i):
        j = int(np.random.uniform(0,m))
    return j



#剪輯aj顾瞻,即使得得到的aj在[L,H]的范圍內泼疑;具體方法參考統(tǒng)計學習方法127頁7.108
#:需要剪輯的a;上限H荷荤;下限L
#r:剪輯后的aj
def clipAlpha(aj,H,L):
    if aj > H:
        aj = H
    if L > aj:
        aj = L
    return aj



#使用SMO算法進行SVM
#:數(shù)據(jù)列表退渗;標簽列表移稳;權衡因子(增加松弛因子而在目標優(yōu)化函數(shù)中引入了懲罰項);容錯率会油;最大迭代次數(shù)
#r:返回最后的b值和alpha向量
def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()

    b = 0
    m,n = np.shape(dataMatrix)
    alphas = np.mat(np.zeros((m,1)))
    iter = 0

    while (iter < maxIter):
        alphaPairsChanged = 0

        for i in range(m):
            #計算預測值个粱,利用的公式是alphas*y*(x*x)+b,可參考李航統(tǒng)計學方法中的7.56
            fXi = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b
            #計算出預測值與實際值之間的誤差
            Ei = fXi - float(labelMat[i])

            #如果不滿足KKT條件,即labelMat[i]*fXi<1(labelMat[i]*fXi-1<-toler)
            #and alpha<C 或者labelMat[i]*fXi>1(labelMat[i]*fXi-1>toler)and alpha>0
            #那么就對其進行優(yōu)化
            if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) \
                 or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)):
                #以下過程即挑選另一個alphasj并計算相應需要的參數(shù)
                j = selectJrand(i,m)
                fXj = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b
                Ej = fXj - float(labelMat[j])

                alphaIold = alphas[i].copy()
                alphaJold = alphas[j].copy()
                #這里的理解可參考統(tǒng)計學習方法第126頁翻翩,也就是求出alphas的上下界
                if (labelMat[i] != labelMat[j]):
                    L = max(0, alphas[j] - alphas[i])
                    H = min(C, C + alphas[j] - alphas[i])
                else:
                    L = max(0, alphas[j] + alphas[i] - C)
                    H = min(C, alphas[j] + alphas[i])

                if L==H: print "L==H"; continue  #如果上下界沒有變化都许,就表示不需要更新
                # 根據(jù)公式計算未經(jīng)剪輯的alphaj
                eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T \
                          - dataMatrix[i,:]*dataMatrix[i,:].T \
                          - dataMatrix[j,:]*dataMatrix[j,:].T

                if eta >= 0: print "eta>=0"; continue  #如果eta>=0,跳出本次循環(huán)

                #該公式可參考統(tǒng)計學習方法127頁7.106
                alphas[j] -= labelMat[j]*(Ei - Ej)/eta
                #剪輯alphas
                alphas[j] = clipAlpha(alphas[j],H,L)
                # 如果改變后的alphaj值變化不大,跳出本次循環(huán)
                if (abs(alphas[j] - alphaJold) < 0.00001): print "j not moving enough"; continue
                # 否則体斩,計算相應的alphai值
                alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])#update i by the same amount as j
                # 再分別計算兩個alpha情況下對于的b值
                b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
                b2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T
                # 如果0<alphai<C,那么b=b1
                if (0 < alphas[i]) and (C > alphas[i]): b = b1
                # 否則如果0<alphai<C,那么b=b1
                elif (0 < alphas[j]) and (C > alphas[j]): b = b2
                # 否則梭稚,alphai颖低,alphaj=0或C
                else: b = (b1 + b2)/2.0
                # 如果走到此步絮吵,表面改變了一對alpha值
                alphaPairsChanged += 1
                print "iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)
        # 最后判斷是否有改變的alpha對,沒有就進行下一次迭代
        if (alphaPairsChanged == 0): iter += 1
        else: iter = 0
        print "iteration number: %d" % iter

    # 返回最后的b值和alpha向量
    return b,alphas

數(shù)據(jù)可從此處下載:鏈接:https://pan.baidu.com/s/1BIuZxz16UPiMWfHYX_lknQ 密碼:90al


八忱屑、sklearn實現(xiàn)

sklearn中一共有SVC, NuSVCLinearSVC 三種實現(xiàn)蹬敲,它們都能在數(shù)據(jù)集中實現(xiàn)多元分類。

SVCNuSVC 是相似的方法, 但是接受稍許不同的參數(shù)設置并且有不同的數(shù)學方程(在這部分看 數(shù)學公式). 另一方面, LinearSVC 是另一個實現(xiàn)線性核函數(shù)的支持向量分類. 記住 LinearSVC 不接受關鍵詞 kernel, 因為它被假設為線性的. 它也缺少一些 SVCNuSVC 的成員(members) 比如 support_ 莺戒。

在實踐過程中伴嗡,NuSVC 沒怎么用過就暫且不提,但是LinearSVC 確實比直接在SVC 中把kernel設為線性核要快从铲,當然效果也相對差一點瘪校。

一般主要還是使用SVC

class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None)
Parameters:
  • C : float類型,默認值為1.0
    錯誤項的懲罰系數(shù)名段。C越大阱扬,即對分錯樣本的懲罰程度越大,因此在訓練樣本中準確率越高伸辟,但是泛化能力降低麻惶,也就是對測試數(shù)據(jù)的分類準確率降低。相反信夫,減小C的話窃蹋,容許訓練樣本中有一些誤分類錯誤樣本,泛化能力強静稻。對于訓練樣本帶有噪聲的情況警没,一般采用后者,把訓練樣本集中錯誤分類的樣本作為噪聲

  • str類型振湾,默認為‘rbf’
    算法中采用的核函數(shù)類型杀迹,可選參數(shù)有:‘linear’:線性核函數(shù);‘poly’:多項式核函數(shù)恰梢;‘rbf’:徑像核函數(shù)/高斯核佛南;‘sigmod’:sigmod核函數(shù)梗掰;‘precomputed’:核矩陣,precomputed表示自己提前計算好核函數(shù)矩陣嗅回,這時候算法內部就不再用核函數(shù)去計算核矩陣及穗,而是直接用你給的核矩陣

  • degree: int類型,默認為3
    這個參數(shù)只對多項式核函數(shù)有用绵载,是指多項式核函數(shù)的階數(shù)n埂陆,如果給的核函數(shù)參數(shù)是其他核函數(shù),則會自動忽略該參數(shù)

  • gamma: float類型娃豹,默認為auto
    核函數(shù)系數(shù)焚虱,只對‘rbf’,‘poly’,‘sigmod’有效。如果gamma為auto懂版,代表其值為樣本特征數(shù)的倒數(shù)鹃栽,即1/n_features

  • coef0: float類型,默認為0.0
    核函數(shù)中的獨立項躯畴,只有對‘poly’和‘sigmod’核函數(shù)有用民鼓,是指其中的參數(shù)c

  • probability: bool類型,默認為False
    是否啟用概率估計蓬抄,這必須在調用fit()之前啟用丰嘉,并且會fit()方法速度變慢

  • shrinking: bool類型,默認為True
    是否采用啟發(fā)式收縮方式

  • tol: float類型嚷缭,默認為1e^-3
    svm停止訓練的誤差精度

  • cache_size: float類型饮亏,默認為200
    指定訓練所需要的內存,以MB為單位阅爽,默認為200MB

  • class_weight: 字典類型或者‘balance’字符串路幸,默認為None
    給每個類別分別設置不同的懲罰參數(shù)C。如果沒有給优床,則會給所有類別都給C=1劝赔,即前面參數(shù)指出的參數(shù)C。如果給定參數(shù)‘balance’胆敞,則使用y的值自動調整與輸入數(shù)據(jù)中的類頻率成反比的權重

  • verbose : bool類型着帽,默認為False
    是否啟用詳細輸出。 此設置利用libsvm中的每個進程運行時設置移层,如果啟用仍翰,可能無法在多線程上下文中正常工作。一般情況都設為False观话,不用管它
    max_iter : int類型予借,

  • 默認為-1
    最大迭代次數(shù),如果為-1,表示不限制

  • random_state: int類型灵迫,默認為None
    偽隨機數(shù)發(fā)生器的種子,在混洗數(shù)據(jù)時用于概率估計

  • decision_function_shape:str類型秦叛,默認是’ovr’
    用來選擇如何構造多類的SVM分類器。SVM算法最初是為二值分類問題設計的瀑粥,當處理多類問題時挣跋,就需要構造合適的多類分類器。 具體可以參考:decision_function_shape解釋

Attributes:
  • support_:各類的支持向量在訓練樣本中的索引

  • n_support_:各類各有多少個支持向量

  • support_vectors_:各類所有的支持向量

  • dual_coef_: 對偶系數(shù)狞换,即支持向量在決策函數(shù)中的系數(shù)避咆,在多分類問題中,這個會有所不同

  • coef_: 每個特征系數(shù)(重要性)修噪,只有核函數(shù)是Linear的時候可用

  • intercept_: 決策函數(shù)中的常數(shù)項查库,和coef_共同構成決策函數(shù)的參數(shù)值

Method:
  • fit(X, y): 在數(shù)據(jù)集(X,y)上擬合SVM模型

  • predict(X): 預測數(shù)據(jù)值X的標簽

  • score(X,y): 返回給定測試集和對應標簽的平均準確率

  • decision_function(X): 獲取數(shù)據(jù)集中樣本X到分離超平面的距離

  • get_params([deep]): 獲取模型的參數(shù)

使用例子:

import numpy as np
from sklearn.svm import SVC

# 自己構造的小數(shù)據(jù)
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])

# 加載SVC模型(一般來說可能前面還有一個標準化的步驟,這邊暫時省掉)
clf = SVC()
# 訓練該模型
 clf.fit(X, y) 

>> SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)

print(clf.predict([[-0.8, -1]]))
>> [1]


九黄琼、SVM相關面試題

這部分還是不斷更新:

面試好像對手推SVM和各個參數(shù)看得比較重樊销,這部分還是要好好地推和背。

1. SVM的原理是什么适荣?

SVM是一種二類分類模型现柠。它的基本模型是在特征空間中尋找間隔最大化的分離超平面的線性分類器院领。(間隔最大是它有別于感知機)

  1. 當訓練樣本線性可分時弛矛,通過硬間隔最大化,學習一個線性分類器比然,即線性可分支持向量機
  2. 當訓練數(shù)據(jù)近似線性可分時丈氓,引入松弛變量,通過軟間隔最大化强法,學習一個線性分類器万俗,即線性支持向量機
  3. 當訓練數(shù)據(jù)線性不可分時,通過使用核技巧及軟間隔最大化饮怯,學習非線性支持向量機

注:以上各SVM的數(shù)學推導應該熟悉:硬間隔最大化(幾何間隔)---學習的對偶問題---軟間隔最大化(引入松弛變量)---非線性支持向量機(核技巧)

2. SVM為什么采用間隔最大化闰歪?

當訓練數(shù)據(jù)線性可分時,存在無窮個分離超平面可以將兩類數(shù)據(jù)正確分開蓖墅。感知機利用誤分類最小策略库倘,求得分離超平面,不過此時的解有無窮多個论矾。線性可分支持向量機利用間隔最大化求得最優(yōu)分離超平面教翩,這時,解是唯一的贪壳。另一方面饱亿,此時的分隔超平面所產(chǎn)生的分類結果是最魯棒的,對未知實例的泛化能力最強。

3. 為什么要將求解SVM的原始問題轉換為其對偶問題彪笼?
  1. 是對偶問題往往更易求解(當我們尋找約束存在時的最優(yōu)點的時候钻注,約束的存在雖然減小了需要搜尋的范圍,但是卻使問題變得更加復雜配猫。為了使問題變得易于處理队寇,我們的方法是把目標函數(shù)和約束全部融入一個新的函數(shù),即拉格朗日函數(shù)章姓,再通過這個函數(shù)來尋找最優(yōu)點佳遣。)

  2. 自然引入核函數(shù),進而推廣到非線性分類問題

4. 為什么SVM要引入核函數(shù)凡伊?

當樣本在原始空間線性不可分時零渐,可將樣本從原始空間映射到一個更高維的特征空間,使得樣本在這個特征空間內線性可分系忙。在學習預測中诵盼,只定義核函數(shù)K(x,y),而不是顯式的定義映射函數(shù)?银还。因為特征空間維數(shù)可能很高风宁,甚至可能是無窮維,因此直接計算?(x)·?(y)是比較困難的蛹疯。相反戒财,直接計算K(x,y)比較容易(即直接在原來的低維空間中進行計算,而不需要顯式地寫出映射后的結果)捺弦。

核函數(shù)的定義:K(x,y)=<?(x),?(y)>饮寞,即在特征空間的內積等于它們在原始樣本空間中通過核函數(shù)K計算的結果。

5. svm RBF核函數(shù)的具體公式列吼?

Gauss徑向基函數(shù)則是局部性強的核函數(shù)幽崩,其外推能力隨著參數(shù)σ的增大而減弱。

這個核會將原始空間映射為無窮維空間寞钥。不過慌申,如果 σ 選得很大的話,高次特征上的權重實際上衰減得非忱碇#快蹄溉,所以實際上(數(shù)值上近似一下)相當于一個低維的子空間;反過來香浩,如果 σ 選得很小类缤,則可以將任意的數(shù)據(jù)映射為線性可分——當然,這并不一定是好事邻吭,因為隨之而來的可能是非常嚴重的過擬合問題餐弱。不過,總的來說,通過調控參數(shù)σ 膏蚓,高斯核實際上具有相當高的靈活性瓢谢,也是使用最廣泛的核函數(shù)之一。

6. 為什么SVM對缺失數(shù)據(jù)敏感驮瞧?

這里說的缺失數(shù)據(jù)是指缺失某些特征數(shù)據(jù)氓扛,向量數(shù)據(jù)不完整。SVM沒有處理缺失值的策略(決策樹有)论笔。而SVM希望樣本在特征空間中線性可分采郎,所以特征空間的好壞對SVM的性能很重要。缺失特征數(shù)據(jù)將影響訓練結果的好壞狂魔。

7. SVM如何處理多分類問題蒜埋?

一般有兩種做法:一種是直接法,直接在目標函數(shù)上修改最楷,將多個分類面的參數(shù)求解合并到一個最優(yōu)化問題里面整份。看似簡單但是計算量卻非常的大籽孙。

另外一種做法是間接法:對訓練器進行組合烈评。其中比較典型的有一對一,和一對多犯建。

一對多讲冠,就是對每個類都訓練出一個分類器,由svm是二分類胎挎,所以將此而分類器的兩類設定為目標類為一類沟启,其余類為另外一類。這樣針對k個類可以訓練出k個分類器犹菇,當有一個新的樣本來的時候,用這k個分類器來測試芽卿,那個分類器的概率高揭芍,那么這個樣本就屬于哪一類。這種方法效果不太好卸例,bias比較高称杨。

svm一對一法(one-vs-one),針對任意兩個類訓練出一個分類器筷转,如果有k類姑原,一共訓練出C(2,k) 個分類器,這樣當有一個新的樣本要來的時候呜舒,用這C(2,k) 個分類器來測試锭汛,每當被判定屬于某一類的時候,該類就加一,最后票數(shù)最多的類別被認定為該樣本的類唤殴。


參考:

  1. https://www.cnblogs.com/dreamvibe/p/4349886.html
  2. 支持向量機通俗導論(理解SVM的三層境界)
  3. 統(tǒng)計機器學習
  4. https://www.cnblogs.com/steven-yang/p/5658362.html
  5. https://blog.csdn.net/on2way/article/details/47730367
  6. https://www.cnblogs.com/zy230530/p/6901277.html
  7. 機器學習實戰(zhàn)
  8. sklearn官方手冊
  9. https://www.cnblogs.com/solong1989/p/9620170.html
  10. https://blog.csdn.net/github_39261590/article/details/75009069
  11. https://blog.csdn.net/szlcw1/article/details/52336824
  12. https://blog.csdn.net/szlcw1/article/details/52259668
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末般婆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朵逝,更是在濱河造成了極大的恐慌蔚袍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件配名,死亡現(xiàn)場離奇詭異啤咽,居然都是意外死亡,警方通過查閱死者的電腦和手機渠脉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門闰蚕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人连舍,你說我怎么就攤上這事没陡。” “怎么了索赏?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵盼玄,是天一觀的道長。 經(jīng)常有香客問我潜腻,道長埃儿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任融涣,我火速辦了婚禮童番,結果婚禮上,老公的妹妹穿的比我還像新娘威鹿。我一直安慰自己剃斧,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布忽你。 她就那樣靜靜地躺著悠轩,像睡著了一般溢豆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天淆游,我揣著相機與錄音业筏,去河邊找鬼黔攒。 笑死旨巷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的尿赚。 我是一名探鬼主播散庶,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蕉堰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了督赤?” 一聲冷哼從身側響起嘁灯,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躲舌,沒想到半個月后丑婿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡没卸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年羹奉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片约计。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诀拭,死狀恐怖,靈堂內的尸體忽然破棺而出煤蚌,到底是詐尸還是另有隱情耕挨,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布尉桩,位于F島的核電站筒占,受9級特大地震影響,放射性物質發(fā)生泄漏蜘犁。R本人自食惡果不足惜翰苫,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望这橙。 院中可真熱鬧奏窑,春花似錦、人聲如沸屈扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽助隧。三九已至筑凫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間并村,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工滓技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哩牍,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓令漂,卻偏偏與公主長得像膝昆,于是被迫代替她去往敵國和親丸边。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354