SVM:如何判斷線性可分

支持向量機(SVM),介紹都說了假設數據要是線性可分。

如果數據不是線性可分的,我們就必須要採用一些特殊的方法,比如SVM的核技巧把數據轉換到更高的維度上,在那個高維空間數據更可能是線性可分的(Cover定理)。


現在的問題是,如何判斷數據是線性可分的?

最簡單的情況是數據向量是一維二維或者三維的,我們可以把圖像畫出來,直觀上就能看出來。

比如Håvard Geithus網友的圖,非常簡單就看出兩個類的情形下X和O是不是線性可分。


但是數據向量維度一旦變得很高,我們怎麼辦?

答案是:檢查凸包(convex hull)是否相交。


什麼是凸包呢?

簡單說凸包就是一個凸的閉合曲線(曲面),而且它剛好包住了所有的數據。

舉個例子,下圖的藍色線就是一個恰好包住所有數據的閉合凸曲線。



知道了什麼是凸包,我們就能檢查我們的數據是不是線性可分了。

以二維的情況爲例,如果我們的數據訓練集有兩類:M+和M-,

當我們畫出兩個類的凸包,如果兩者不重疊,那麼兩者線性可分,反之則不是線性可分。

下圖就是個線性可分的情況。


雖然現在我們比直接看數據判斷是不是線性可分進了一步,但是好像還是靠畫出圖來人眼判斷,這對高維度數據依然無效。

是這樣麼?當然不是。

因爲判斷兩個凸包是不是有重疊可以通過判斷凸包M+的邊和凸包M-的邊是否相交來實現,這就無需把凸包畫出來了。


如何高效的找到一組數據的凸包?

如何高效的判斷兩個凸包是否重合?

網友Darren Engwirda 給出了很好的建議:

There are efficient algorithms that can be used both to find the convex hull (theqhull algorithm is based on anO(nlog(n)) quickhull approach I think), and to perform line-line intersection tests for a set of segments (sweepline atO(nlog(n))), so overall it seems that an efficient O(nlog(n)) algorithm should be possible.

This type of approach should also generalise to general k-way separation tests (where you havekgroups of objects) by forming the convex hull and performing the intersection tests for each group.

It should also work in higher dimensions, although the intersection tests would start to become more challenging...

簡單說,他的建議就是用quickhull算法來找到數據的凸包,sweepline算法判斷凸包邊緣是否有相交,兩個步驟的複雜度都是O(nlogn)。

其中quickhull已經在軟件包qhull(http://www.qhull.org/)實現了。


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