python大戰機器學習——支持向量機
支持向量機(Support Vector Machine,SVM)的基本模型是定義在特征空間上間隔最大的線性分類器。它是一種二類分類模型,當采用了核技巧之後,支持向量機可以用於非線性分類。
1)線性可分支持向量機(也稱硬間隔支持向量機):當訓練數據線性可分是,通過硬間隔最大化,學得一個線性可分支持向量機
2)線性支持向量機(也稱為軟間隔支持向量機):當訓練數據近似線性可分時,通過軟間隔最大化,學得一個線性支持向量機
3)非線性支持向量機:當訓練數據不可分時,通過使用核技巧以及軟間隔最大化,學得一個非線性支持向量機。
1、線性可分支持向量機
輸入:線性可分訓練數據集T
輸出:最大幾何間隔的分離超平面和分類決策函數
算法步驟:
1)構造並且求解約束優化問題,求得最優解w*,b*
2)由此得到分離超平面,以及分類決策函數
若訓練數據集T線性可分,最大間隔分離超平面存在且唯一
下面是線性可分支持向量機學習算法的對偶算法:
輸入:線性可分訓練數據集T
輸出:最大集合間隔的分離超平面和分類決策函數
算法步驟:
1)構造並且求解約束最優化問題,求得最優解α*
2)計算w*,同時選擇α*的一個正的分量αj*>0,計算b*
3)由此得到最大集合間隔分離超平面和分類決策函數
2、線性支持向量機
對於線性不可分訓練數據,線性支持向量機不再適用,但可以將它擴展到線性不可分問題
線性支持向量機學習算法的對偶算法:
輸入:訓練數據集T,懲罰參數C>0
輸出:軟間隔最大化分離超平面和分類決策函數
算法步驟:
1)求解約束優化問題,求得最優解α*
2)計算w*,b*
3)由此得到軟間隔最大化分離超平面以及分類決策函數\
實驗代碼:
1 import matplotlib.pyplot as plt 2 import numpy as np 3 from sklearn import datasets,linear_model,cross_validation,svm 4 5 def load_data_regression():View Code6 diabetes=datasets.load_diabetes() 7 return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0) 8 9 def load_data_classfication(): 10 iris=datasets.load_iris() 11 X_train=iris.data 12 Y_train=iris.target 13 return cross_validation.train_test_split(X_train,Y_train,test_size=0.25,random_state=0,stratify=Y_train) 14 15 def test_LinearSVC(*data): 16 X_train,X_test,Y_train,Y_test=data 17 cls=svm.LinearSVC() 18 cls.fit(X_train,Y_train) 19 print("Coefficients:%s,intercept %s"%(cls.coef_,cls.intercept_)) 20 print("Score:%.2f"%cls.score(X_test,Y_test)) 21 22 X_train,X_test,Y_train,Y_test=load_data_classfication() 23 test_LinearSVC(X_train,X_test,Y_train,Y_test)
實驗結果:
在測試集上的預測準確率達到了0.97,還是非常高的
3、非線性支持向量機
核函數將輸入空間中的任意兩個向量x,z映射為特征空間中對應的向量之間的內積。在給定核函數K(x,z)的情況下,可以利用求解線性分類問題的方法求解非線性分類問題的支持向量機。
在實際應用中,往往依賴經驗直接選擇核函數,然後驗證該核函數確實是有效的核函數。常用的核函數如下:
1)多項式核函數 2)高斯核函數 3)sigmoid核函數
輸入:訓練數據集T,懲罰參數C
輸出:分類決策函數
算法步驟:
1)選擇適當的核函數K,求解約束最優化問題,求得最優解α*
2)計算w*和b*
3)構造分類決策函數
4、支持向量回歸(Support Vector Regression,SVR)
5、SVM的優缺點
SVM本質上是非線性方法,在樣本量很少時,容易抓住數據和特征之間的非線性關系,因此可以解決非線性問題、可以避免神經網絡結構選擇和局部極小點問題、可以提高泛化性能、可以解決高維問題
SVM對缺失數據敏感,對非線性問題沒有通用解決方案,必須謹慎選擇核函數來處理,計算復雜度高。
python大戰機器學習——支持向量機