十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
我先直觀地闡述我對(duì)SVM的理解,這其中不會(huì)涉及數(shù)學(xué)公式,然后給出Python代碼。
成都創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營(yíng)銷人員及形象策劃。承接:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)頁設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫(kù)開發(fā),以高性價(jià)比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺(tái)等全方位的服務(wù)。
SVM是一種二分類模型,處理的數(shù)據(jù)可以分為三類:
線性可分,通過硬間隔最大化,學(xué)習(xí)線性分類器
近似線性可分,通過軟間隔最大化,學(xué)習(xí)線性分類器
線性不可分,通過核函數(shù)以及軟間隔最大化,學(xué)習(xí)非線性分類器
線性分類器,在平面上對(duì)應(yīng)直線;非線性分類器,在平面上對(duì)應(yīng)曲線。
硬間隔對(duì)應(yīng)于線性可分?jǐn)?shù)據(jù)集,可以將所有樣本正確分類,也正因?yàn)槿绱耍茉肼晿颖居绊懞艽?,不推薦。
軟間隔對(duì)應(yīng)于通常情況下的數(shù)據(jù)集(近似線性可分或線性不可分),允許一些超平面附近的樣本被錯(cuò)誤分類,從而提升了泛化性能。
如下圖:
實(shí)線是由硬間隔最大化得到的,預(yù)測(cè)能力顯然不及由軟間隔最大化得到的虛線。
對(duì)于線性不可分的數(shù)據(jù)集,如下圖:
我們直觀上覺得這時(shí)線性分類器,也就是直線,不能很好的分開紅點(diǎn)和藍(lán)點(diǎn)。
但是可以用一個(gè)介于紅點(diǎn)與藍(lán)點(diǎn)之間的類似圓的曲線將二者分開,如下圖:
我們假設(shè)這個(gè)黃色的曲線就是圓,不妨設(shè)其方程為x^2+y^2=1,那么核函數(shù)是干什么的呢?
我們將x^2映射為X,y^2映射為Y,那么超平面變成了X+Y=1。
那么原空間的線性不可分問題,就變成了新空間的(近似)線性可分問題。
此時(shí)就可以運(yùn)用處理(近似)線性可分問題的方法去解決線性不可分?jǐn)?shù)據(jù)集的分類問題。
---------------------------------------------------------------------------------------------------------------------------
以上我用最簡(jiǎn)單的語言粗略地解釋了SVM,沒有用到任何數(shù)學(xué)知識(shí)。但是沒有數(shù)學(xué),就體會(huì)不到SVM的精髓。因此接下來我會(huì)用盡量簡(jiǎn)潔的語言敘述SVM的數(shù)學(xué)思想,如果沒有看過SVM推導(dǎo)過程的朋友完全可以跳過下面這段。
對(duì)于求解(近似)線性可分問題:
由最大間隔法,得到凸二次規(guī)劃問題,這類問題是有最優(yōu)解的(理論上可以直接調(diào)用二次規(guī)劃計(jì)算包,得出最優(yōu)解)
我們得到以上凸優(yōu)化問題的對(duì)偶問題,一是因?yàn)閷?duì)偶問題更容易求解,二是引入核函數(shù),推廣到非線性問題。
求解對(duì)偶問題得到原始問題的解,進(jìn)而確定分離超平面和分類決策函數(shù)。由于對(duì)偶問題里目標(biāo)函數(shù)和分類決策函數(shù)只涉及實(shí)例與實(shí)例之間的內(nèi)積,即xi,xj。我們引入核函數(shù)的概念。
拓展到求解線性不可分問題:
如之前的例子,對(duì)于線性不可分的數(shù)據(jù)集的任意兩個(gè)實(shí)例:xi,xj。當(dāng)我們?nèi)∧硞€(gè)特定映射f之后,f(xi)與f(xj)在高維空間中線性可分,運(yùn)用上述的求解(近似)線性可分問題的方法,我們看到目標(biāo)函數(shù)和分類決策函數(shù)只涉及內(nèi)積f(xi),f(xj)。由于高維空間中的內(nèi)積計(jì)算非常復(fù)雜,我們可以引入核函數(shù)K(xi,xj)=f(xi),f(xj),因此內(nèi)積問題變成了求函數(shù)值問題。最有趣的是,我們根本不需要知道映射f。精彩!
我不準(zhǔn)備在這里放推導(dǎo)過程,因?yàn)橐呀?jīng)有很多非常好的學(xué)習(xí)資料,如果有興趣,可以看:CS229 Lecture notes
最后就是SMO算法求解SVM問題,有興趣的話直接看作者論文:Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines
我直接給出代碼:SMO+SVM
在線性可分?jǐn)?shù)據(jù)集上運(yùn)行結(jié)果:
圖中標(biāo)出了支持向量這個(gè)非常完美,支持向量都在超平面附近。
在線性不可分?jǐn)?shù)據(jù)集上運(yùn)行結(jié)果(200個(gè)樣本):
核函數(shù)用了高斯核,取了不同的sigma
sigma=1,有189個(gè)支持向量,相當(dāng)于用整個(gè)數(shù)據(jù)集進(jìn)行分類。
sigma=10,有20個(gè)支持向量,邊界曲線能較好的擬合數(shù)據(jù)集特點(diǎn)。
我們可以看到,當(dāng)支持向量太少,可能會(huì)得到很差的決策邊界。如果支持向量太多,就相當(dāng)于每次都利用整個(gè)數(shù)據(jù)集進(jìn)行分類,類似KNN。
代碼:
defnot_empty(s):
returnsandlen(s。strip())0
#returnsands。strip()
#如果直接單寫s。strip()那么s如果是None,會(huì)報(bào)錯(cuò),因?yàn)镹one沒有strip方法。
#如果s是None,那么Noneand任何值都是False,直接返回false
#如果s非None,那么判定s。trip()是否為空。
這樣子filter能過濾到None,"",""這樣的值。
分成兩部分看。第一部分是對(duì)長(zhǎng)度進(jìn)行序列。相當(dāng)于就是range(5)他的結(jié)果就是。01234。第二部分就是具體的排序規(guī)則。排序規(guī)則是用nums的值進(jìn)行排序,reverse沒申明就是默認(rèn)升序。就是用nums(0到4)的值進(jìn)行排序,根據(jù)這個(gè)結(jié)果返回的一個(gè)range(5)的數(shù)組。
擴(kuò)展資料:
根據(jù)PEP的規(guī)定,必須使用4個(gè)空格來表示每級(jí)縮進(jìn)。使用Tab字符和其它數(shù)目的空格雖然都可以編譯通過,但不符合編碼規(guī)范。支持Tab字符和其它數(shù)目的空格僅僅是為兼容很舊的的Python程序和某些有問題的編輯程序。
Python的函數(shù)支持遞歸、默認(rèn)參數(shù)值、可變參數(shù),但不支持函數(shù)重載。為了增強(qiáng)代碼的可讀性,可以在函數(shù)后書寫“文檔字符串”(Documentation Strings,或者簡(jiǎn)稱docstrings),用于解釋函數(shù)的作用、參數(shù)的類型與意義、返回值類型與取值范圍等??梢允褂脙?nèi)置函數(shù)help()打印出函數(shù)的使用幫助。
參考資料來源:百度百科-Python
這個(gè)和用不用python沒啥關(guān)系,是數(shù)據(jù)來源的問題。 調(diào)用淘寶API,使用 api相關(guān)接口獲得你想要的內(nèi)容,我 記得api中有相關(guān)的接口,你可以看一下接口的說明。 用python做爬蟲來進(jìn)行頁面數(shù)據(jù)的獲齲。