機器學習
四、SVM支持向量機
- github地址:https://github.com/lawlite19/MachineLearning_Python
- 由於公式使用的是LaTex,解析使用的google的Chart API,所以顯示有問題,可以移步github(可以翻牆就不用了)
1、代價函數
- 在邏輯迴歸中,我們的代價爲:
,
其中:, - 如圖所示,如果
y=1
,cost
代價函數如圖所示
我們想讓,即z>>0
,這樣的話cost
代價函數纔會趨於最小(這是我們想要的),所以用途中紅色的函數代替邏輯迴歸中的cost - 當
y=0
時同樣,用代替
- 最終得到的代價函數爲:
最後我們想要 - 之前我們邏輯迴歸中的代價函數爲:
可以認爲這裏的,只是表達形式問題,這裏C
的值越大,SVM的決策邊界的margin
也越大,下面會說明
2、Large Margin
- 如下圖所示,SVM分類會使用最大的
margin
將其分開
先說一下向量內積
- ,
- 表示
u
的歐幾里得範數(歐式範數), 向量V
在向量u
上的投影的長度記爲p
,則:向量內積:
根據向量夾角公式推導一下即可,
前面說過,當
C
越大時,margin
也就越大,我們的目的是最小化代價函數J(θ)
,當margin
最大時,C
的乘積項要很小,所以近似爲:
,
我們最後的目的就是求使代價最小的θ
- 由
可以得到:
,p
即爲x
在θ
上的投影 - 如下圖所示,假設決策邊界如圖,找其中的一個點,到
θ
上的投影爲p
,則或者,若是p
很小,則需要很大,這與我們要求的θ
使最小相違背,所以最後求的是large margin
3、SVM Kernel(核函數)
- 對於線性可分的問題,使用線性核函數即可
- 對於線性不可分的問題,在邏輯迴歸中,我們是將
feature
映射爲使用多項式的形式,SVM
中也有多項式核函數,但是更常用的是高斯核函數,也稱爲RBF核 - 高斯核函數爲:
假設如圖幾個點,
令:
.
.
. - 可以看出,若是
x
與距離較近,==》,(即相似度較大)
若是x
與距離較遠,==》,(即相似度較低) 高斯核函數的
σ
越小,f
下降的越快
如何選擇初始的
- 訓練集:
- 選擇:
- 對於給出的
x
,計算f
,令:所以: - 最小化
J
求出θ
,
- 如果,==》預測
y=1
4、使用scikit-learn
中的SVM
模型代碼
- 全部代碼
- 線性可分的,指定核函數爲
linear
:
'''data1——線性分類'''
data1 = spio.loadmat('data1.mat')
X = data1['X']
y = data1['y']
y = np.ravel(y)
plot_data(X,y)
model = svm.SVC(C=1.0,kernel='linear').fit(X,y) # 指定核函數爲線性核函數
- 非線性可分的,默認核函數爲
rbf
'''data2——非線性分類'''
data2 = spio.loadmat('data2.mat')
X = data2['X']
y = data2['y']
y = np.ravel(y)
plt = plot_data(X,y)
plt.show()
model = svm.SVC(gamma=100).fit(X,y) # gamma爲核函數的係數,值越大擬合的越好
5、運行結果
- 線性可分的決策邊界:
- 線性不可分的決策邊界: