周志華《機器學習》課後習題(第六章):支持向量機

作者 | 我是韓小琦

鏈接 | https://zhuanlan.zhihu.com/p/49023182

6.1 試證明樣本空間中任意點  到超平面  的的距離爲式 (6.2)。

答:

圖中,令A點到超平面(點B)的距離爲 ,於是  (  是  同向的單位向量, 對於超平面 其垂直方向即  ),對於B點有:  ,而  ,於是  ,可得  ,這裏的  即書中  ,即可的式6.2。

這個問題在吳恩達老師的《機器學習》課程(斯坦福版本CS 229)裏面講解過,有興趣的可以自己去網易公開課看看,圖片截圖自該課程課件。

6.2 試使用 LIBSVM,在西瓜數據集 3.0α 上分別用線性核和高斯核訓練一個 SVM,並比較其支持向量的差別。

答:

這裏沒用LIBSVM,用的sklearn中的sklearn.svm.svc,它的實現也是基於libsvm的。

使用不同參數的時候,支持向量是不同的(沒有對高斯核中的gamma調參)。由於西瓜數據集3.0a線性不可分,所以使用線性核時,無論懲罰係數多高 ,還是會出現誤分類的情況;而使用高斯核時在懲罰係數設置較大時,是可以完全擬合訓練數據。所以在懲罰係數設置較小時,兩者支持向量都類似,而在懲罰係數較大(支持向量機中,懲罰係數越大,正則化程度越低)時,高斯核的支持向量數目會較少,而線性核的會幾乎沒有變化。

代碼在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets

C = 100時訓練情況如下:

高斯核支持向量: [ 8 9 11 12 13 14 16 2 3 4 5 6 7]

----------------------------------------

線性核支持向量: [ 8 9 11 12 13 14 16 2 3 4 5 6 7]


C = 10000時訓練情況如下:

高斯核支持向量: [11 13 14 1 5 6]

----------------------------------------

線性核支持向量: [ 9 11 12 13 14 16 2 3 4 5 6 7]

6.3 選擇兩個 UCI 數據集,分別用線性核和高斯核訓練一個 SVM,並與BP 神經網絡和 C4.5 決策樹進行實驗比較。

答:

han1057578619/MachineLearning_Zhouzhihua_ProblemSets

6.4 試討論線性判別分析與線性核支持向量機在何種條件下等價。

答:

這道題想不出很明確的答案,這僅討論一下。

有一點很明確的是:在數據線性可分時並不會導致線性判別分析與線性核支持向量機等價。

上圖是以iris數據中第0列和第2列數據作爲訓練集。分別LDA和線性核SVM訓練,得到圖中兩者的決策邊界,可以看出在數據線性可分的情況下,兩者決策邊界還是有很大差別的。如果這裏等價理解爲兩者決策邊界相同,即兩個模型決策函數是相同的,那麼兩者決策邊界重合時,兩者等價的。那麼什麼時候兩者會重疊?

事實上,可以想象到,LDA的決策邊界的斜率可以由投影面  得到,其斜率是垂直於  的,而截距則可由兩類樣本的中心點 在  投影  得到,即LDA決策邊界通過  的中點(公式參考原書p60)。

而線性核SVM的決策邊界則由模型參數  得到(對應原書式6.12),所以當SVM中的參數  和LDA中投影面  垂直,且 SVM的 通過兩類樣本中心在  的投影的中點時,兩者等價。只討論到這裏了。

查了很多資料沒找到相關信息。感覺LDA和SVM其實沒有多大相似度。

ps.這裏解答其實就按照結果倒推了一下。貌似都是些廢話。

畫圖代碼在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets

代碼有點亂。

6.5 試述高斯核 SVM 與 RBF 神經網絡之間的聯繫。

答:

其實這個題目在p145的《休息一會兒》的註釋裏面已經給出答案了。

RBF神經網絡中,將隱藏層神經元個數設置爲訓練樣本數,每個樣本設置爲一個神經元中心,此時RBF的預測函數和SVM激活函數相同。

個人理解,兩個模型還是有挺大差別的。

  • RBF中徑向基激活函數中控制方差的參數  是由模型自動習得,而在SVM中是一個可調節的超參。

  • 目標函數、優化方式也不同。

但是如果將RBF中  固定爲和SVM一致,最後訓練結果應該會比較相似。

以上是個人理解。就不寫代碼驗證了。。。

6.6 試析 SVM 對噪聲敏感的原因。

答:

SVM的決策只基於少量的支持向量,若噪音樣本出現在支持向量中,容易對決策造成影響,所以SVM對噪音敏感。

6.7 試給出式 (6.52) 的完整 KKT 條件。

答:

6.52式是經過將完整的KKT條件

 ,這裏對應着原書式6.47-6.50合併之後的。完整的如下:

6.52中其他公式的推導出來的。

6.8 以西瓜數據集 3.0α 的"密度"爲輸入"含糖率"爲輸出,試使用LIBSVM 訓練一個 SVR。

答:

關於SVR沒有理解很深,簡單瞭解了一下。這道題就簡單看一下不同參數,訓練結果的變換吧。

直觀上看,含糖率和密度無明顯關係。所以無論模型參數怎麼調,看上去對數據的擬合都不是很好,預測值和真實值還是有較大差異。不過還是可以看出來隨着gamma或者C的增大,模型都會趨於更加複雜。

這裏代碼很簡單,還是放上來。

han1057578619/MachineLearning_Zhouzhihua_ProblemSet

6.9 試使用核技巧推廣對率迴歸,產生"覈對率迴歸"。

答:

對於  形式的模型,即線性模型,使用核技巧的關鍵點在於最優的  可以由訓練集的線性組合表示,即  ,使得模型可表示爲  ,進而使用核函數直接計算數據點在高維空間內積,而不顯式的計算數據點從低維到高維的映射。

原命題:事實上對於任何L2正則化的線性模型: ,這裏,其最優值都可以表示爲  。其證明參考下圖:(截圖自林軒田講授的《機器學習技法》課程第五章課件)

(上圖中  可以理解爲數據點  或者  在高維空間的映射  )

上圖通過反證法來證明:

將  分解爲與  空間平行的  和垂直的  ,若  則表示  可以表示爲  的線性組合。

假設  爲最優解且  。由於  與  空間垂直,於是  , 因此不會對目標函數中  項的大小產生影響,而對於  ,在  的情況下必定有:  ,顯然  比  “更優”,即  不是最優解。於是原命題得證。

那麼對於L2正則化的邏輯迴歸,其核形式即如下圖:

可直接使用梯度下降等優化算法求解上圖的目標函數即

題目沒要求。就偷個懶不寫代碼了。

說個題外的。SVM中只有少數支持向量對應的  非零,所以對於SVM來說,訓練完成後只需要儲存個別非零的  和對應數據點即可;而不同於SVM, 核邏輯迴歸並沒有這一性質,需要儲存所有訓練數據。就這一點來說核邏輯迴歸並不高效。

6.10* 試設計一個能顯著減少 SVM 中支持向量的數目而不顯著降低泛化性能的方法。(未完成)

答:

這個應該也是某個論文。最近時間不多,暫時不深究了就。。

6.11 自己編程實現SVM,並在西瓜數據集 3.0αα 測試。

答:

自己加的題目。雖然書上沒要求,但還是自己寫了一遍。

代碼在:

han1057578619/MachineLearning_Zhouzhihua_ProblemSets

其實主要就是把SMO實現了一遍。

參考:

  • 《統計學習方法》

  • 《機器學習實戰》

  • 《Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines》

  • 《THE IMPLEMENTATION OF SUPPORT VECTOR MACHINES USING THE SEQUENTIAL MINIMAL OPTIMIZATION ALGORITHM》

寫代碼的時候參考以上資料。代碼主要根據原論文中提供的僞代碼和《機器學習實戰》的源碼寫的,《機器學習實戰》中給出的代碼和原論文有幾個地方有差異:

  • 在選擇第二個  變量時,原論文給出的方法是1、首先從間隔邊界上的支持向量(  )中,找到使得  最大的  。2、若上面選的  不行,則遍歷所有的支持向量。3、還是不行則遍歷所有的樣本點。4、若所有樣本點都不行,則放棄一個變量。關於認定  不行的原則,原論文描述的是:不能使得目標函數有足夠下降。實際上在僞代碼中是使得  本身有足夠下降就認爲不行。而《機器學習實戰》中代碼從更新過的  中選擇使得  最大的 作爲第二個變量。若不行則直接放棄第一個變量。不知道這一點是改進還是簡化。代碼中是按照論文的方式實現的

  • 爲了選擇第二個變量時方便,SMO會將所有支持向量的誤差  建立緩存,且在每次更新完 之後,都同時更新誤差緩存。《機器學習實戰》源碼中,在給支持向量建立誤差緩存時,雖然有更新  的步驟,但只更新了每次更新的兩個變量  對應的誤差,並且更新之後也沒有使用,在選擇第二個變量計算  時,都重新計算了  。在自己實現的時候,這一點也是按照論文來的。

  • 最後一點,在更新  時,需要計算  (參考統計學習方法 p127 式7.107),在極少數情況下  會等於零,在原論文中給出了針對這種情況下  的更新方式,在《機器學習實戰》中,這種情況會直接跳過更新。這裏代碼和《機器學習實戰》一致,直接跳過了,這一點其實影響不大。

另外實際上更新誤差緩存  有更高效的方法,是在第四個參考文獻裏面發現的。不過在代碼裏面沒有實現。因爲感覺有點複雜。。。有興趣的可以看看那篇論文,在3.4小節解釋了更新誤差緩存的方式。

最後自己寫的代碼在西瓜數據集3.0α上測試了一下,訓練後決策邊界如下:

訓練結果和使用sklearn中結果(習題6.2)一致,支持向量也是相同的,決策邊界差不多相同,其他數據未測試。不過速度上,sklearn會快很多,測試了一下訓練西瓜數據集,自己寫的代碼需要5e-4秒,而sklearn只需要1e-8。還是有很大差距的。

代碼有點亂,這裏只爲深刻理解一下SMO,也不做工程使用,暫時就不優化了。。以後閒下來再看看。

以上。

系列文章:

1. 周志華機器學習課後習題解析【第二章】

2. 周志華《機器學習》課後習題(第三章):線性模型

3. 周志華《機器學習》課後習題解析(第四章):決策樹

4. 周志華《機器學習》課後習題(第五章):神經網絡


推薦閱讀

(點擊標題可跳轉閱讀)

乾貨 | 公衆號歷史文章精選

我的深度學習入門路線

我的機器學習入門路線圖

重磅

AI有道年度技術文章電子版PDF來啦!

掃描下方二維碼,添加 AI有道小助手微信,可申請入羣,並獲得2020完整技術文章合集PDF(一定要備註:入羣 + 地點 + 學校/公司。例如:入羣+上海+復旦。 

長按掃碼,申請入羣

(添加人數較多,請耐心等待)

 

最新 AI 乾貨,我在看 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章