一步步教你輕松學支持向量機SVM算法之理論篇1
(白寧超 2018年10月22日10:03:35)
摘要:支持向量機即SVM(Support Vector Machine) ,是一種監督學習算法,屬於分類的范疇。首先,支持向量機不是一種機器,而是一種機器學習算法。在數據挖掘的應用中,與無監督學習的聚類相對應和區別。廣泛應用於機器學習,計算機視覺和數據挖掘當中。(本文原創,轉載必須注明出處.)
目錄
1 機器學習:一步步教你輕松學KNN模型算法
2 機器學習:一步步教你輕松學決策樹算法
3 機器學習:一步步教你輕松學朴素貝葉斯模型算法理論篇1
4 機器學習:一步步教你輕松學朴素貝葉斯模型實現篇2
5 機器學習:一步步教你輕松學朴素貝葉斯模型算法Sklearn深度篇3
6 機器學習:一步步教你輕松學邏輯回歸模型算法
7 機器學習:一步步教你輕松學K-means聚類算法
8 機器學習:一步步教你輕松學關聯規則Apriori算法
9 機器學習: 一步步教你輕松學支持向量機SVM算法之理論篇1
10 機器學習: 一步步教你輕松學支持向量機SVM算法之案例篇2
11 機器學習: 一步步教你輕松學主成分分析PCA降維算法
12 機器學習: 一步步教你輕松學支持向量機SVM降維算法
更多文章請點擊這里>>
相關概念
- 支持向量就是
數據集中的某些點
,位置比較特殊。比如 x+y-2=0 這條直線,直線上面區域 x+y-2>0 的全是 A 類,下面的 x+y-2<0 的全是 B 類,我們找這條直線的時候,一般就看聚集在一起的兩類數據,他們各自的最邊緣
位置的點,也就是最靠近划分直線的那幾個點,而其他點對這條直線的最終位置的確定起不了作用,所以我姑且叫這些點叫 “支持點”(意思就是有用的點). - 在最大間隔上的這些點就叫 “支持向量”,因為最后的 classification machine (分類器)的表達式里只含有這些 “支持向量” 的信息,而與其他數據點無關,借助圖形理解(支持向量就是圖中用紫色框框圈出來的點)如下:
線性可分(linearly separable)
: 如上圖中的兩組數據,它們之間已經分的足夠開了,因此很容易就可以在圖中畫出一條直線將兩組數據點分開。在這種情況下,這組數據就被稱為線性可分數據
。分隔超平面(separating hyperplane)
: 上述將數據集分隔開來的直線稱為分隔超平面
。超平面(hyperplane)
: 在上面給出的例子中,由於數據點都在二維平面上,所以此時分隔超平面就只是一條直線。但是,如果所給的數據集是三維的,那么此時用來分隔數據的就是一個平面。顯而易見,更高緯度的情況可以依此類推。如果數據是 1024 維的,那么就需要一個 1023 維的某某對象來對數據進行分隔。這個 1023 維的某某對象到底應該叫什么呢? N-1 維呢?該對象被稱為超平面
,也就是分類的決策邊界
。分布在超平面一側的所有數據都屬於某個類別,而分布在另一側的所有數據則屬於另一個類別。間隔(margin)
: 我們希望能通過上述的方式來構建分類器,即如果數據點離決策邊界越遠,那么其最后的預測結果也就越可信。既然這樣,我們希望找到離分隔超平面最近的點,確保它們離分隔面的距離盡可能遠。這里所說的點到分隔面的距離就是間隔
。我們希望間隔盡可能地大,這是因為如果我們犯錯或者在有限數據上訓練分類器的話,我們希望分類器盡可能健壯。支持向量(support vector)
: 就是上面所說的離分隔超平面最近的那些點。分類器
: 分類器就是給定一個樣本的數據,判定這個樣本屬於哪個類別的算法。例如在股票漲跌預測中,我們認為前一天的交易量和收盤價對於第二天的漲跌是有影響的,那么分類器就是通過樣本的交易量和收盤價預測第二天的漲跌情況的算法。特征
: 在分類問題中,輸入到分類器中的數據叫做特征。以上面的股票漲跌預測問題為例,特征就是前一天的交易量和收盤價。線性分類器
: 線性分類器是分類器中的一種,就是判定分類結果的根據是通過特征的線性組合得到的,不能通過特征的非線性運算結果作為判定根據。還以上面的股票漲跌預測問題為例,判斷的依據只能是前一天的交易量和收盤價的線性組合,不能將交易量和收盤價進行開方,平方等運算。
SVM 原理
直觀理解
我們在桌子上放置一些不同顏色的球,讓小明用一根棍分開它們?要求:盡量在放更多球之后,仍然適用。
於是小明這樣放,看起來還不錯?
然后我們又在桌上放了更多的球,似乎有一個球站錯了陣營。
SVM 就是試圖把棍放在最佳位置,好讓在棍的兩邊有盡可能大的間隙。
現在即使我們放了更多的球,棍仍然是一個好的分界線。
然后,在 SVM 工具箱中有另一個更加重要的 trick。 我們看到小明已經學會了一個 trick ,於是我們給了小明一個新的挑戰。
現在,小明沒有棍可以很好幫他分開兩種球了,現在怎么辦呢?當然像所有武俠片中一樣大俠桌子一拍,球飛到空中。然后,憑借大俠的輕功,大俠抓起一張紙,插到了兩種球的中間。
現在,從我們的角度看這些球,這些球看起來像是被一條曲線分開了。
我們把這些球叫做 「data」
,把棍子叫做「classifier」
, 最大間隙 trick 叫做「optimization」
, 拍桌子叫做「kernelling」
, 那張紙叫做「hyperplane」
。到這里,大家對支持向量機有個更加直觀的感受了吧,以上引用網絡案例。
支持向量機分類
先考慮最簡單的情況,豌豆和米粒,用曬子很快可以分開,小顆粒漏下去,大顆粒保留。用一個函數來表示就是當直徑 d 大於某個值 D ,就判定為豌豆,小於某個值就是米粒。
- d>D, 豌豆
- d<D,米粒
在數軸上就是在d左邊就是米粒,右邊就是綠豆,這是一維的情況。但是實際問題沒這么簡單,考慮的問題不單單是尺寸,一個花的兩個品種,怎么分類?
假設決定他們分類的有兩個屬性,花瓣尺寸和顏色。單獨用一個屬性來分類,像剛才分米粒那樣,就不行了。這個時候我們設置兩個值 尺寸 x 和顏色 y.我們把所有的數據都丟到 x-y 平面上作為點,按道理如果只有這兩個屬性決定了兩個品種,數據肯定會按兩類聚集在這個二維平面上。我們只要找到一條直線,把這兩類划分開來,分類就很容易了,以后遇到一個數據,就丟進這個平面,看在直線的哪一邊,就是哪一類。比如 x+y-2=0 這條直線,我們把數據 (x,y) 代入,只要認為 x+y-2>0 的就是 A 類, x+y-2<0 的就是 B 類。以此類推,還有三維的,四維的,N維的 屬性的分類,這樣構造的也許就不是直線,而是平面,超平面。
一個三維的函數分類 :x+y+z-2=0,這就是個分類的平面了。有時候,分類的那條線不一定是直線,還有可能是曲線,我們通過某些函數來轉換,就可以轉化成剛才的哪種多維的分類問題,這個就是核函數的思想。例如:分類的函數是個圓形 x^2+y^2-4=0 。這個時候令 x^2=a ; y^2=b ,還不就變成了a+b-4=0 這種直線問題了。這就是支持向量機的思想。
SVM 工作原理
原理
對於上述的蘋果和香蕉,我們想象為2種水果類型的炸彈。(保證距離最近的炸彈,距離它們最遠)
- 尋找最大分類間距
- 轉而通過拉格朗日函數求優化的問題
- 數據可以通過畫一條直線就可以將它們完全分開,這組數據叫
線性可分(linearly separable)
數據,而這條分隔直線稱為分隔超平面(separating hyperplane)
。 - 如果數據集上升到1024維呢?那么需要1023維來分隔數據集,也就說需要N-1維的對象來分隔,這個對象叫做
超平面(hyperlane)
,也就是分類的決策邊界。
SVM學習方法的選擇
- 當訓練數據線性可分時,通過
硬間隔最大化
學習一個線性分類器,即線性可分支持向量機
又稱為硬間隔支持向量機
。 - 當訓練數據近似線性可分時,通過
軟間隔最大化
學習一個線性分類器,即線性可分支持向量機
又稱為軟間隔支持向量機
。 - 當訓練數據線性不可分時,通過
核函數及軟間隔最大化
學習一個非線性支持向量機
。
更多內容參考如下資料:
https://www.zhihu.com/question/21094489
http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
https://zhuanlan.zhihu.com/p/26891427?utm_medium=social&utm_source=qq
https://zhuanlan.zhihu.com/p/21308801?utm_medium=social&utm_source=qq
http://blog.csdn.net/v_july_v/article/details/7624837
理解和應用
數據挖掘(DataMining)
做數據挖掘應用的一種重要算法,也是效果最好的分類算法之一。舉個例子,就是盡量把樣本中的從更高緯度看起來在一起的樣本合在一起,比如在一維(直線)空間里的樣本從二維平面上可以分成不同類別,而在二維平面上分散的樣本如果從第三維空間上來看就可以對他們做分類。支持向量機算法目的是找出最優超平面,使分類間隔最大,要求不但正確分開,而且使分類間隔最大,在兩類樣本中離分類平面最近且位於平行於最優超平面的超平面上的點就是支持向量,為找到最優超平面只要找到所有支持向量即可。對於非線性支持向量機,通常做法是把線性不可分轉化成線性可分,通過一個非線性映射將輸入到低維空間中的數據特性映射到高維線性特征空間中,在高維空間中求線性最優分類超平面。
scikit(scikit-learn)
SVM 的基本原理基本上已經說的差不多了,下面咱們就來看看 SVM 在實際應用該如何使用了。幸運的是,sklearn 提供了一個非常好用的機器學習算法,我們調用相關的包就好啦。
參考文獻
- scikit中文社區:http://sklearn.apachecn.org/cn/0.19.0/
- ApacheCN
- GitHub:https://github.com/BaiNingchao/MachineLearning-1
- 圖書:《機器學習實戰》
- 圖書:《自然語言處理理論與實戰》
完整代碼下載
作者聲明
本文版權歸作者所有,旨在技術交流使用。未經作者同意禁止轉載,轉載后需在文章頁面明顯位置給出原文連接,否則相關責任自行承擔。