程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

機器學習實戰及Python實現——支持向量機(SVM)

編輯:Python

本篇內容講一下業界鼎鼎大名的支持向量機,該算法之所以出名,一是模型參數少,稍微調整下,可以直接拿來使用;二是其具有扎實的數學理論基礎支撐;三是模型效果還不錯。因此受到各位大神的喜好,可以說在深度學習出現之前,是最好的機器學習方法之一。

1、支撐向量機的概念


支持向量機(support vector machine,SVM),可以拆開兩部分來看,一是支撐向量,顧名思義,就是支撐構建分類器的向量;二是機,就是機器的意思,也就是分類器的意思,從一個簡單示例來理解其含義和涉及到的術語。


在該圖中,藍色的圈和紅色的塊是要區分的兩個類別,中間的分割直線是分類函數,實心的點就是支持向量,這也是算法的由來。而分類函數就是需要通過模型來尋找的,但這裡有很多分類函數能夠區分,因此需要找一個最穩定和最優化的分類器,該分類器能夠其到達分類邊界最大,就是支撐向量到達分類器最大。

這是線性可分的情況,那什麼是線性可分函數?在一維空間是一個點,二維空間是一條直線,三維空間是一個平面,而在四維及以上,就超出了想象,可統稱為超平面。

但一般我們會遇到非線性情況,因此SVM的方法就是通過一個核函數將低維度數據映射到高維度空間,從而將非線性問題轉換為線性問題。如圖所示,通過數據映射,可以明顯看到有條直線可以將其區分。


另外,核函數的價值雖然將特征從低維映射到高維空間,但其最牛的地方在於通過在低維空間的計算,能夠實現高維空間的分類,從而避免了維度災難,因此減少了計算量。

2、支撐向量機的特點


如下圖,X是牛群,點是狼群,如何在他們之間建設合適的籬笆?這也是一個二分類問題。下圖就是SVM、邏輯回歸和決策樹構建模型結果。可以看出SVM的分類比較符合實際用途,這就是非線性分類的優勢。


SVM的優點是計算量少,效果好;但其缺點是對參數調節和核函數選擇比較敏感。

3、支撐向量機的推導


關於支撐向量機的推導,網上有很多較好的資料,都講的比較清楚和透徹,如《支持向量機通俗導論(理解SVM的三層境界)》,也有視頻可以看。所以這裡不再過多介紹。但還是幾點學習心得僅供參考。


(1)支撐向量機的核心就是尋找能夠使區間間隔最大化的分類器;

(2)使用拉格朗日乘子法和KKT條件,將其轉化成在約束條件的優化問題,

(3)僅使用支撐向量來對未知樣本進行預測;

(4)通過核函數將數據映射到高維空間,轉化為線性可分;

(5)需要自己設定參數C和K,其中C為松弛變量,用來平衡懲罰誤差,值越大越不能有誤差;K是核函數的參數,決定了映射到高維空間的分布。

以下文章是從網絡整理過來,僅供參考。


4、SMO求解


從SVM的公式推導中,可以看出只要求出alpha,就可求解出w和b,需要的超平面就可得出。而求alpha的方法,目前比較流行的是使用SMO算法,即序列最小優化算法。

其中SMO算法的工作原理是:首先選擇兩個alpha進行優化處理,固定其他alpha;一旦找到合適的alpha,那麼就增大其中一個減少另一個。因為所有alpha的和為0。

其中SMO的求解步驟為(偽代碼):

(1)初始化化alpha,將其設定為0向量;

(2)設定最大的迭代次數(外循環),當迭代次數<最大迭代次數:

(3)對數據集中的每個數據向量(內循環)

(4)如果該數據向量可以被優化(>設定的最小誤差):

(5)隨機選擇另外一個數據向量:

(6) 同時優化選擇的兩個向量:

(7) 如果兩個向量都不能被優化,退出內循環

(8)如果所有向量都沒被優化,增加迭代數目,繼續下一次循環

因為所選擇的的是隨機向量,因此需要多次迭代,一直到alpha不會在優化為止。

該算法的簡單版本Python代碼如下:


對樣本測試結果:


輸出結果為,表示支撐向量共4個,其中正樣本1個,負樣本3:


另外,為加快計算速度,在該簡化版本上做了優化處理,該方法為 Platt SMO,從外循環和內循環分別選擇兩個alpha值,快速收斂。


另外,通過計算alpha,可求解w,因此可求解出y=w*x+b來確定超平面;具體代碼如下:


計算示例如下,>0表示類別1,<0表示類別-1:


5、支持向量機的核函數

上節講到的只能夠解決線性問題,而對於下圖情況,則效果不好。這時候就需要利用核函數。直觀上講下圖就是兩個圓,因此如果映射到三維空間就可以通過一個平面區分。如通過將(x,y)映射為(x,y,x^2+y^2)


一般使用的是高斯徑向基函數


其中sigam是計算收斂速度的參數,也是需要調整優化的參數。其中相關代碼如下

KernelTrans():函數是用來向量的轉化。


6、Python實現示例

本次使用的例子是手寫識別樣本,包括兩類樣本,其中0設為1,9設為-1.該方法的優勢在於僅需要保存支持向量機就可以進行預測。


結果如下,本次選擇的參數為C=200,sigma=10


另外,C和k值等參數取值不同,導致的預測結果和支撐向量也各異,也說明了該方法對參數調整比較敏感。還對比了線性模型,核函數結果較優。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved