對(duì)于SVM來(lái)說(shuō),數(shù)據(jù)點(diǎn)被視為p維向量福也,而我們?cè)噲D用(p-1)維超平面分開(kāi)這些點(diǎn)麦备,即創(chuàng)造所謂的“線性分割器”孽椰。為此,我們要選擇能夠讓到每邊最近的數(shù)據(jù)點(diǎn)的距離最大化的超平面凛篙。如果存在這樣的超平面黍匾,則稱為最大間隔超平面,而其定義的線性分類器被稱為最大間隔分類器呛梆,或者叫做最佳穩(wěn)定性感知器锐涯。SVM的學(xué)習(xí)策略便是間隔最大化,最終可轉(zhuǎn)化為一個(gè)凸二次規(guī)劃問(wèn)題的求解填物。
(A Support Vector Machine (SVM) is a discriminative classifier formally defined by a separating hyperplane. In other words, given labeled training data (supervised learning), the algorithm outputs an optimal hyperplane which categorizes new examples.)
遇到線性不可分的情況時(shí)纹腌,需要使用Kernal投射到高維霎终。其實(shí)Kernal函數(shù)和SVM可以理解為兩個(gè)不同的東西,SVM只不過(guò)是用到了kernel trick把有些線性不可分的情況變得在高維線性可分(理想上)升薯,任何可以用內(nèi)積計(jì)算距離的分類器或者其他的都可以用kernel trick莱褒。Kernal函數(shù)的好處是把低維空間投影到高維,有些核函數(shù)投影到有限維涎劈,比如多項(xiàng)式核广凸,有些投影到無(wú)窮維,比如RBF蛛枚。但這只是增大的線性可分的可能性炮障,并不能保證。所以還要進(jìn)入松弛系數(shù)(slash coefficients) 如果形象的理解坤候,就是如果你有N個(gè)點(diǎn),如果N個(gè)點(diǎn)分布在N維空間里企蹭,那他們肯定是線性可分的(比如2個(gè)點(diǎn)在平面上)白筹。所以SVM用kenel的目的就在于此。
參考資料:
http://blog.csdn.net/v_july_v/article/details/7624837
http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
===========================
一個(gè)郵件識(shí)別谅摄,在Python中運(yùn)用SVM徒河。運(yùn)用了幾個(gè)不同的kernal:linear, poly,?rbf,sigmoid送漠,修改了幾次數(shù)據(jù)集大小顽照。
1、1%集闽寡,clf = SVC(kernel="linear"):88%正確率代兵,16秒
2、20%集爷狈,clf = SVC(kernel="linear"):95%正確率植影,64秒
3、全集涎永,clf = SVC(kernel="linear"):98%正確率思币,308秒
1、1%集羡微,clf = SVC(kernel="rbf"):62%正確率谷饿,1.8秒
2、20%集妈倔,clf = SVC(kernel="linear"):49%正確率博投,13秒
3、20%集启涯,clf = SVC(kernel="rbf", C = 1000): ?94%正確率贬堵,11秒
4晒哄、20%集方灾,clf = SVC(kernel="rbf", C = 10000): ?95%正確率,8秒
5、全集纸淮,clf = SVC(kernel="rbf", C = 10000): ?99%正確率
在計(jì)算效率方面,SVM是通過(guò)QP來(lái)求解的比默√褡埽基于libsvm的實(shí)現(xiàn)時(shí)間復(fù)雜度在O(d * n^2) ~ O(d * n^3)之間,變化取決于如何使用cache. 所以如果我們內(nèi)存足夠的話那么可以調(diào)大cache_size來(lái)加快計(jì)算速度宏所。其中d表示feature大小酥艳,如果數(shù)據(jù)集合比較稀疏的話,那么可以認(rèn)為d是non-zero的feature平均數(shù)量爬骤。libsvm處理數(shù)據(jù)集合大小最好不要超過(guò)10k. 相比之下充石,liblinear的效率則要好得多,可以很容易訓(xùn)練million級(jí)別的數(shù)據(jù)集合霞玄。
kernel函數(shù)支持1.linear 2. polynomial 3. rbf 4. sigmoid(tanh). 對(duì)于unbalanced的問(wèn)題骤铃,sklearn實(shí)現(xiàn)允許指定 1.class_weight 2.sample_weight. 其中class_weight表示每個(gè)class對(duì)應(yīng)的權(quán)重,這個(gè)在構(gòu)造classifier時(shí)候就需要設(shè)置坷剧。如果不確定的話就設(shè)置成為'auto'惰爬。sample_weight則表示每個(gè)實(shí)例對(duì)應(yīng)的權(quán)重,這個(gè)可以在調(diào)用訓(xùn)練方法fit的時(shí)候傳入惫企。另外一個(gè)比較重要的參數(shù)是C(懲罰代價(jià)),通常來(lái)說(shuō)設(shè)置成為1.0就夠了撕瞧。但是如果數(shù)據(jù)中太多噪音的話那么最好減小一些。
參數(shù)方面狞尔,可使用GridCV丛版,一種幾乎能自動(dòng)查找最優(yōu)參數(shù)調(diào)整的優(yōu)秀 sklearn 工具。
===========================