如何(高效)判斷資料是否線性可分
很多機器學習分類演算法,比如支援向量機(SVM),的介紹都說了假設資料要是線性可分。
如果資料不是線性可分的,我們就必須要採用一些特殊的方法,比如SVM的核技巧把資料轉換到更高的維度上,在那個高維空間資料更可能是線性可分的(Cover定理)。
現在的問題是,如何判斷資料是線性可分的?
最簡單的情況是資料向量是一維二維或者三維的,我們可以把影象畫出來,直觀上就能看出來。
比如Håvard
Geithus網友的圖,非常簡單就看出兩個類的情形下X和O是不是線性可分。
但是資料向量維度一旦變得很高,我們怎麼辦?
答案是檢查凸包(convex hull)是否相交。
什麼是凸包呢?
簡單說凸包就是一個凸的閉合曲線(曲面),而且它剛好包住了所有的資料。
舉個例子,下圖的藍色線就是一個恰好包住所有資料的閉合凸曲線。
知道了什麼是凸包,我們就能檢查我們的資料是不是線性可分了。
以二維的情況為例,如果我們的資料訓練集有兩類:M+和M-,
當我們畫出兩個類的凸包,如果兩者不重疊,那麼兩者線性可分,反之則不是線性可分。
下圖就是個線性可分的情況。
雖然現在我們比直接看資料判斷是不是線性可分進了一步,但是好像還是靠畫出圖來人眼判斷,這對高維度資料依然無效。
是這樣麼?當然不是。
因為判斷兩個凸包是不是有重疊可以通過判斷凸包M+的邊和凸包M-的邊是否相交來實現,這就無需把凸包畫出來了。
如何高效的找到一組資料的凸包?
如何高效的判斷兩個凸包是否重合?
There are efficient algorithms that can be used both to find the convex hull (theqhull algorithm is based on anO(nlog(n))
quickhullapproach
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))
This type of approach should also generalise to general k-way
separation tests (where you havek
groups 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/)實現了。
參考連結和圖片來源:
更數學的對凸包的定義:http://www.nanshan.edu.cn/lxy/shuxuejm/jiao%20cai/31%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B8%80%E7%AB%A0%20%20%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA.pdf
wikipedia對凸包的介紹:http://zh.wikipedia.org/wiki/%E5%87%B8%E5%8C%85
Håvard Geithus和Darren
Engwirda(以及其他人)的問答:http://stackoverflow.com/questions/9779179/determine-whether-the-two-classes-are-linearly-separable-algorithmically-in-2d