前言:參考《機器學習》,對偶問題沒看懂,,,,(我只是一個代碼的搬運工,,,)
機器學習專欄:
- 機器學習——線性回歸(預測)
- 機器學習——邏輯回歸(分類)
- 機器學習——特征縮放
- 機器學習——正則化
- 機器學習——支持向量機(SVM)
目錄
- 支持向量機(SVM)
- 1、基本原理
- 2、軟間隔
- 3、核函式
- 4、sklearn實作SVM
- 5、SVM多分類
- 4.1多分類原理
- 4.2sklearn實作SVM多分類
支持向量機(SVM)
1、基本原理
現給定資料集\(D={((x^{(1)},y^{(i)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}))},y^{(i)}\in\{-1,1 \}\),我們現在的目的就是找一個超平面將這兩個類別的樣本點分開,
在樣本空間中,劃分超平面可以由線性方程表示為:
\[w^Tx+b=0 \]
則樣本點\(x^{(i)}\)到超平面\((w,x)\)的距離為:
\[r=\frac{|w^Tx^{(i)}+b|}{||w||} \]
其中,\(||w||\)表示范數,這是空間的一個性質,一般指歐式范數,到原點距離的意思,超平面可以理解為平面中的直線、空間中的平面的推廣到更高維度,但是作用都是劃分,
一個超平面\((w,x)\)可以將它所在的空間分為兩半, 它的法向量指向的那一半對應的一面是它的正面, 另一面則是它的反面,假設超平面\((w,x)\)能夠將訓練樣本正確分類,即:
\[\left\{\begin{matrix} w^Tx^{(i)}+b>0,&&y^{(i)}=+1\\ w^Tx^{(i)}+b<0,&&y^{(i)}=-1 \end{matrix}\right. \]
支持向量機要求滿足:
\[\left\{\begin{matrix} w^Tx^{(i)}+b\geqslant+1,&&y^{(i)}=+1\\ w^Tx^{(i)}+b\leqslant -1,&&y^{(i)}=-1 \end{matrix}\right. \]
距離超平面最近的樣本點使上式等號成立,它們被稱為“支持向量”(support vector),兩個異類支持向量到超平面的距離之和:
\[\gamma =\frac{2}{||w||} \]
被稱為“間隔”(margin)

欲使分類效果更好,我們就要找到具有“最大間隔”的劃分超平面,即:
\[\mathop{max}\limits_{w,b} \quad \frac{2}{||w||} \\ s.t. \quad y^{(i)}(w^Tx^{(i)}+b)\geqslant1,\quad i=1,2,...,m \]
最大化\(\frac{2}{||w||}\)等價于最小化\(\frac{||w||^2}{2}\),,即:
\[\mathop{min}\limits_{w,b} \quad \frac{||w||^2}{2} \\ s.t. \quad y^{(i)}(w^Tx^{(i)}+b)\geqslant1,\quad i=1,2,...,m \]
這就是SVM模型,是一個QP問題,(對偶問題以后再看吧,看不懂,)
2、軟間隔
在處理現實問題的時候,我們其實很難找到一個能剛好劃分的超平面,就算找到了,我們也不能確定這個結果不是由于過擬合導致,所以我們要放寬條件,即允許一些樣本不滿足約束條件,我們稱為“軟間隔”,

但是,我們在最大化間隔的時候,應使不滿足約束條件的樣本點盡可能少,即:
\[\mathop{min}\limits_{w,b} \quad \frac{||w||^2}{2}+C\sum_{i=1}^{m}l_{0/1}(y^{(i)}(w^Tx^{(i)}+b)-1) \]
其中,\(C>0\)取有限值常數,\(l_{0/1}\)是“0/1”損失函式
\[l_{0/1}(z)=\left\{\begin{matrix} 1,&& if\quad z<0\\ 0.&& otherwise \end{matrix}\right. \]
但是,\(l_{0/1}\)非凸、非連續,數學性質不好,常用“替代損失”(surrogate loss)函式代替:
- hinge損失:\(l_{hinge}(z)=max(0,1-z)\)
- 指數損失(exponential loss):\(l_{exp}(z)=exp(-z)\)
- 對率損失(logistic loss):\(l_{log}(z)=log(1+exp(-z))\)
若采用hinge損失,則模型表示為:
\[\mathop{min}\limits_{w,b} \quad \frac{||w||^2}{2}+C\sum_{i=1}^{m}max(0,1-y^{(i)}(w^Tx^{(i)}+b)) \]
引入“松弛變數”\(\xi_i\geqslant0\),可得“軟間隔支持向量機”,但是要求在這個軟間隔區域的樣本點盡可能少,即:
\[\mathop{min}\limits_{w,b} \quad \frac{||w||^2}{2}+C\sum_{i=1}^{m}\xi_i \\ s.t. \quad y^{(i)}(w^Tx^{(i)}+b)\geqslant1-\xi_i,\quad i=1,2,...,m \]
3、核函式
前面說的是線性可分的情況,那要是出現線性不可分怎么辦?比如:

對于這樣的問題,我們需要將樣本從原始空間映射到一個更高維的特征空間,使得樣本在這個特征空間線性可分,比如:現在有樣本點如下,很明顯我們用\(x^2\)二次項去擬合更好,這其實就是一個維度提升,核函式就是實作這樣的作用的,

令\(\phi(x)\)表示將\(x\)映射后的特征向量,于是在新的特征空間的超平面表示為:
\[f(x)=w^T\phi(x)+b \]
此時,SVM模型表示為:
\[\mathop{min}\limits_{w,b} \quad \frac{||w||^2}{2} \\ s.t. \quad y^{(i)}(w^T\phi(x)+b)\geqslant1,\quad i=1,2,...,m \]
(這里等我以后再慢慢弄懂)
4、sklearn實作SVM
# -*- coding:utf-8 -*-
"""
@author: 1
@file: SVM.py
@time: 2019/11/25 23:58
"""
from sklearn import svm
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df = pd.read_csv(r'D:\workspace\python\machine learning\data\breast_cancer.csv',header=None)
X = df.iloc[:, 1:10] # 屬性
y = df.iloc[:, 30] # 分類結果
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf = svm.SVC(gamma='scale')
'''SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)'''
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print('accuracy_score:', accuracy_score(y_test, y_pred))
5、SVM多分類
4.1多分類原理
1、一對多法(one-versus-rest,簡稱1-v-r SVMs),訓練時依次把某個類別的樣本歸為一類,其他剩余的樣本歸為另一類,這樣k個類別的樣本就構造出了k個SVM,分類時將未知樣本分類為具有最大分類函式值的那類,(這個與邏輯回歸的多分類原理相同)
2、一對一法(one-versus-one,簡稱1-v-1 SVMs),其做法是在任意兩類樣本之間設計一個SVM,因此k個類別的樣本就需要設計k(k-1)/2個SVM,當對一個未知樣本進行分類時,最后得票最多的類別即為該未知樣本的類別,Libsvm中的多類分類就是根據這個方法實作的,
3、層次支持向量機(H-SVMs),層次分類法首先將所有類別分成兩個子類,再將子類進一步劃分成兩個次級子類,如此回圈,直到得到一個單獨的類別為止,
4.2sklearn實作SVM多分類
# -*- coding:utf-8 -*-
"""
@author: 1
@file: SVM_mc.py
@time: 2019/11/26 20:34
"""
from sklearn import svm
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df = pd.read_csv(r'D:\workspace\python\machine learning\data\iris.csv')
X = df.iloc[:, 0:3]
Y = df.iloc[:, 4]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
clf = svm.SVC(gamma='scale', decision_function_shape='ovr') # 一對多法
# clf = svm.SVC(gamma='scale', decision_function_shape='ovo') 一對一法
clf.fit(x_train, y_train)
'''LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)'''
y_pred = clf.predict(x_test)
print('accuracy_score:', accuracy_score(y_test, y_pred))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/60211.html
標籤:其他
