首先還是回顧一下原理。
先了解一下最簡單的線性svm向量機,個人認為從hinge loss的角度來解釋線性svm比使用幾何意義來說更加簡單快速並且擴充套件性更好。
首先我們令:
這是乙個簡單的線性回歸的形式,此時我們來定義損失函式:
可以看到,這是乙個通用的損失函式的形式,當損失函式l為二元交叉熵的時候,上面的l(x)表示的就是邏輯回歸的損失函式,當損失函式l為mse的時候,上面的l(x)表示的就是線性回歸的損失函式,當l為hinge loss的時候,上面的l(x)表示的就是線性svm的損失函式。
此時我們令
,其中
為了簡單起見我們令
,和邏輯回歸、線性回歸推導過程中的矩陣形式表達是一樣的。
那麼這個時候我們就可以得到線性svm的損失函式了:
,l定義如上,這稱之為硬間隔線性svm的損失函式;而加入正則項之後:
,這稱之為軟間隔線性svm的損失函式。進一步的我們把hinge loss的表示式帶入,可得(下面統一以軟間隔線性svm的損失函式為例,硬間隔的推導基本類似):
這就是線性svm的最終的損失函式,這玩意兒居然是凸函式。。。真沒看出來。。。
然後就是常規的梯度下降法來求解引數了,
分別對這兩個式子進行求導:
當 時,上式等於0
否則,上式等於
(這也是為什麼svm要把正負樣本分別定義為+1和-1的原因,如果把類別定義為0則上面這個式子的梯度永遠為0)
所以,最終的梯度更新公式為:
(1)、當
時,即
時,梯度更新為0,即模型權重不進行更新。從回歸的角度來說很好理解,當樣本的類別為1時,用樣本的特徵x和權重w的乘積大小與1比較,如果大於1,表示分類正確,此樣本在分介面w*x-1=0下方;當樣本的類別為-1時,用樣本的特徵x和權重w的乘積大小與-1比較,如果小於-1,表示分類正確,此樣本在分介面w*x+1=0上方。此時,svm的分類間隔為:w*x+1=0與w*x-1=0,也就是我們熟悉的圖:
從上述的推導也可以看出,在分界間隔之外的樣本對svm的模型來說是沒有梯度貢獻的,這也是為什麼svm在小樣本的情況下效果就可以比較好的原因,因為我們最終的分界間隔可能僅僅受少部分樣本影響。
(2)、當
時,即
時,梯度更新為
,即這樣,svm的推導就完成了。
這也是sklearn中sgdclassifier的loss 為hinge的時候,svm的計算方式。
這樣理解起來方便多了。
sklearn 的linearsvc用的也是上面的求解方法,而sklearn.svm則使用的是傳統的smo的求解方法,這種方法的問題難以擴充套件到數量巨大的樣本上,而使用這種梯度下降法求解的svm則可以比較容易的擴充套件到海量的樣本上,畢竟記憶體不夠可以增量訓練。
這就是在海量資料上使用的求解svm的pegasos演算法,具體可見:
關於非線性svm,目前沒有找到什麼很準確的推導,不過在實現上倒是在sklearn的官網上發現了乙個非常有意思的東西:
傳統的svm的低維到高維的對映是隱式的,直接通過核技巧來規避了高維空間的複雜運算,
sgdclassifier
可以使在大型資料集上進行非線性學習成為可能
from sklearn.linear_model import sgdclassifier
x = [[0, 0], [1, 1], [1, 0], [0, 1]]
y = [0, 0, 1, 1]
rbf_feature = rbfsampler(gamma=1, random_state=1)
x_features = rbf_feature.fit_transform(x)
clf = sgdclassifier(max_iter=5, tol=1e-3)
clf.fit(x_features, y)
如果不是看了李巨集毅的svm核技巧的講解估計我一臉懵逼。
不同的核函式決定了不同的低維到高維的對映關係,而 在kernel a決定的對映關係 a下才能用kernel a實施核技巧的運算(比如你不可能用rbf核來計算原始特徵空間 的多項式核的對映)。
比如:
機器學習有很多關於核函式的說法,核函式的定義和作用是什麼?www.zhihu.com
最高贊舉的例子:
上述使用的多項式核函式實際上顯式的對映就是把(x,y)對映為:
也就是乙個二維到三維的對映。
因為原始的rbf核的對映關係實際上是對映到無窮維度的:
具體的原因可見:
對指數部分做了無限的泰勒展開。
所以sklearn中的rbfsamler做了簡化,只取展開式前的n項,n可由使用者自行指定。
LR與SVM的異同
1.本質上是其loss function不同 邏輯回歸採用的是logistical loss,svm採用的是hinge loss。可以看出,二者的唯一區別就是對於單個資料點,計算損失的方法不同。logistic regression中的log loss 而svm中的hinge loss。可以看出,二...
SVM使用與引數優化
對python語言有所了解的科研人員可能都知道scipy 乙個開源的基於python的科學計算工具包。基於scipy,目前開發者們針對不同的應用領域已經發展出了為數眾多的分支版本,它們被統一稱為scikits,即scipy工具包的意思。而在這些分支版本中,最有名,也是專門面向機器學習的乙個就是sci...
SVM與LR的區別
在大大小小的面試過程中,多次被問及這個問題 請說一下邏輯回歸 lr 和支援向量機 svm 之間的相同點和不同點 第一次被問到這個問題的時候,含含糊糊地說了一些,大多不在點子上,後來被問得多了,慢慢也就理解得更清楚了,所以現在整理一下,希望對以後面試機器學習方向的同學有所幫助 至少可以瞎扯幾句,而不至...