你的程序大部分都沒錯,只是對列表my_list中的字符串元素"5"轉(zhuǎn)數(shù)值元素時,要把轉(zhuǎn)換結(jié)果賦值給原元素,
十載的隆林網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整隆林建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“隆林網(wǎng)站設(shè)計”,“隆林網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實(shí)執(zhí)行。
否則列表my_list沒改變,導(dǎo)致處理字符串元素"5"時,出現(xiàn)不支持字符串和整數(shù)相除操作的錯誤.
完整的Python程序如下(改動的地方見注釋,僅一處有問題)
my_list = [1, 2, 3, 4, "5"]
my_list[4]=int(my_list[4]) #這里把int(my_list[4])改成my_list[4]=int(my_list[4])
number = int(input("請輸入一個number:"))
for i in my_list:
print(f"{i}/{number}={i/number}")
源代碼(注意源代碼的縮進(jìn))
python并不支持i++這種整數(shù)自增的語法。如果想要達(dá)到類似的效果,可以使用如下語句。
首先,如果您想要使整數(shù)i,每次增加1,則有語句 i += 1;同理,整數(shù) i 每次增加2,則有語句 i += 2,以此類推。如果想要使整數(shù)i,每次減少1,則有語句 i -= 1,;同理,整數(shù) i 每次減少2,則有語句 i -= 2,以此類推。
拓展資料:
python軟件有如下優(yōu)點(diǎn):
1. 簡單,Python的語法非常優(yōu)雅,甚至沒有像其他語言的大括號,分號等特殊符號,代表了一種極簡主義的設(shè)計思想。閱讀Python程序像是在讀英語。
2. 易學(xué),Python入手非??欤瑢W(xué)習(xí)曲線非常低,可以直接通過命令行交互環(huán)境來學(xué)習(xí)Python編程。
3. 開源,Python的所有內(nèi)容都是免費(fèi)開源的,這意味著你不需要花一分錢就可以免費(fèi)使用Python,并且你可以自由地發(fā)布這個軟件的拷貝、閱讀它的源代碼、對它做改動、把它的一部分用于新的自由軟件中。
4. 自動內(nèi)存管理,如果你了解C語言、C++語言你就會知道內(nèi)存管理給你帶來很大麻煩,程序非常容易出現(xiàn)內(nèi)存方面的漏洞。但是在Python中內(nèi)存管理是自動完成的,你可以專注于程序本身。
5. 可以移植,由于Python是開源的,它已經(jīng)被移植到了大多數(shù)平臺下面,例如:Windows、MacOS、Linux、Andorid、iOS等等。
6. 解釋性,大多數(shù)計算機(jī)編程語言都是編譯型的,在運(yùn)行之前需要將源碼編譯為操作系統(tǒng)可以執(zhí)行的二進(jìn)制格式(0110格式的),這樣大型項目編譯過程非常消耗時間,而Python語言寫的程序不需要編譯成二進(jìn)制代碼。你可以直接從源代碼運(yùn)行程序。在計算機(jī)內(nèi)部,Python解釋器把源代碼轉(zhuǎn)換成稱為字節(jié)碼的中間形式,然后再把它翻譯成計算機(jī)使用的機(jī)器語言并運(yùn)行。
7. 面向?qū)ο?,Python既支持面向過程,又支持面向?qū)ο?,這樣編程就更加靈活。
8. 可擴(kuò)展,Python除了使用Python本身編寫外,還可以混合使用像C語言、Java語言等編寫。
9. 豐富的第三方庫,Python具有本身有豐富而且強(qiáng)大的庫,而且由于Python的開源特性,第三方庫也非常多,例如:在web開發(fā)、爬蟲、科學(xué)計算等等。
Python有哪些技術(shù)上的優(yōu)點(diǎn)
1. 面向?qū)ο蠛秃瘮?shù)式
從根本上講,Python是一種面向?qū)ο蟮恼Z言。它的類模型支持多態(tài)、運(yùn)算符重載和多重繼承等高級概念,并且以Python特有的簡潔的語法和類型為背景,OOP十分易于使用。事實(shí)上,即使你不懂這些術(shù)語,仍會發(fā)現(xiàn)學(xué)習(xí)Python比學(xué)習(xí)其他OOP語言要容易得多。
除了作為一種強(qiáng)大的代碼組織和重用手段以外,Python的OOP本質(zhì)使它成為其他面向?qū)ο笙到y(tǒng)語言的理想腳本工具。例如,通過適當(dāng)?shù)恼辰哟a,Python程序可以對C++、Java和C#的類進(jìn)行子類的定制。
OOP只是Python的一個選擇而已,這一點(diǎn)非常重要。即使不能立馬成為一個面向?qū)ο蟾呤?,但你同樣可以繼續(xù)深入學(xué)習(xí)。就像C++一樣,Python既支持面向?qū)ο缶幊桃仓С置嫦蜻^程編程的模式。如果條件允許,其面向?qū)ο蟮墓ぞ呖梢粤⒓磁缮嫌脠觥_@對策略開發(fā)模式十分有用,該模式常用于軟件開發(fā)的設(shè)計階段。
除了最初的過程式(語句為基礎(chǔ))和面向?qū)ο螅悶榛A(chǔ))的編程范式,Python在最近幾年內(nèi)置了對函數(shù)式編程的支持——一個多數(shù)情況下包括生成器、推導(dǎo)、閉包、映射、裝飾器、匿名lambda函數(shù)和第一類函數(shù)對象的集合。這是對其本身OOP工具的補(bǔ)充和替代。
2. 免費(fèi)
Python的使用和分發(fā)是完全免費(fèi)的。就像其他的開源軟件一樣,例如,Tcl、Perl、Linux和Apache。你可以從Internet上免費(fèi)獲得Python的源代碼。你可以不受限制地復(fù)制Python,或?qū)⑵淝度肽愕南到y(tǒng)或者隨產(chǎn)品一起發(fā)布。實(shí)際上,如果你愿意的話,甚至可以銷售它的源代碼。
但請別誤會:“免費(fèi)”并不代表“沒有支持”。恰恰相反,Python的在線社區(qū)對用戶需求的響應(yīng)和商業(yè)軟件一樣快。而且,由于Python完全開放源代碼,提高了開發(fā)者的實(shí)力,并產(chǎn)生了一個很大的專家團(tuán)隊。
盡管研究或改變一種程序語言的實(shí)現(xiàn)并不是對每一個人來說都那么有趣,但是當(dāng)你知道如果需要的話可以做到這些,該是多么的令人欣慰。你不需要去依賴商業(yè)廠商的智慧,因為最終的文檔和終極的凈土(源碼)任憑你的使用。
Python的開發(fā)是由社區(qū)驅(qū)動的,是Internet大范圍的協(xié)同合作努力的結(jié)果。Python語言的改變必須遵循一套規(guī)范而有約束力的程序(稱作PEP流程),并需要經(jīng)過規(guī)范的測試系統(tǒng)進(jìn)行徹底檢查。正是這樣才使得Python相對于其他語言和系統(tǒng)可以保守地持續(xù)改進(jìn)。
盡管Python 2.X和Python 3.X版本之間的分裂有力并蓄意地破壞了這項傳統(tǒng),但通常它仍然體現(xiàn)在Python的這兩個系列內(nèi)部。
3. 可移植
Python的標(biāo)準(zhǔn)實(shí)現(xiàn)是由可移植的ANSI C編寫的,可以在目前所有主流平臺上編譯和運(yùn)行。例如,如今從掌上電腦(PDA)到超級計算機(jī),隨處可見 Python的運(yùn)行。Python可以在下列平臺上運(yùn)行(這里只是部分列表):
Linux和UNIX系統(tǒng)
微軟Windows(所有現(xiàn)代版本)
Mac OS(包括OS X 和經(jīng)典版)
BeOS、OS/2、VMS和QNX
實(shí)時操作系統(tǒng),例如VxWorks
Cray超級計算機(jī)和IBM大型機(jī)
運(yùn)行Palm OS、PocketPC和Linux的PDA
運(yùn)行 Symbian OS和Windows Mobile 的移動電話
游戲終端和iPod
運(yùn)行谷歌安卓系統(tǒng)和蘋果iOS系統(tǒng)的平板和智能手機(jī)
以及更多
除了語言解釋器本身以外,Python發(fā)行時自帶的標(biāo)準(zhǔn)庫和模塊在實(shí)現(xiàn)上也都盡可能地考慮到了跨平臺的移植性。此外,Python程序自動編譯成可移植的字節(jié)碼,這些字節(jié)碼在已安裝兼容版本Python的平臺上運(yùn)行的結(jié)果都是相同的。
這些意味著Python程序的核心語言和標(biāo)準(zhǔn)庫可以在Linux、Windows和其他帶有Python解釋器的平臺上無差別地運(yùn)行。大多數(shù)Python外圍接口都有平臺相關(guān)的擴(kuò)展(例如COM支持Windows),但是核心語言和庫在任何平臺都一樣。
就像之前我們提到的那樣,Python還包含了一個叫作tkinter(Tkinter的2.X版本)的Tk GUI工具包,它可以使Python程序?qū)崿F(xiàn)功能完整的,無須做任何修改即可在所有主流GUI桌面平臺運(yùn)行的用戶圖形界面。
4. 功能強(qiáng)大
從語言特性的角度來看,Python是一個混合體。它豐富的工具集使它介于傳統(tǒng)的腳本語言(如Tcl、Scheme和Perl)和系統(tǒng)語言(如C、C++和Java)之間。Python提供了所有腳本語言的簡單和易用性,并且具有那些在編譯語言中才能找到的高級軟件工程工具。
不像其他腳本語言不同,這種結(jié)合使Python在長期大型的開發(fā)項目中十分有用。下面是一些Python工具箱中的工具簡介:
動態(tài)類型
Python在程序運(yùn)行過程中跟蹤對象的類型,不需要代碼中進(jìn)行關(guān)于復(fù)雜的類型和大小的聲明。事實(shí)上,Python中沒有類型或變量聲明這種做法。因為Python代碼不約束數(shù)據(jù)的類型,它往往自動地應(yīng)用了一種廣義上的對象。
自動內(nèi)存管理
Python自動為對象分配空間,并且當(dāng)對象不再使用時將自動撤銷空間(“垃圾回收”),當(dāng)需要時自動擴(kuò)展或收縮。正如你將學(xué)到的,Python能夠幫你完成底層的內(nèi)存管理。
大型程序支持
為了能建立更大規(guī)模的系統(tǒng),Python包含了模塊、類和異常等工具。這些工具允許你把系統(tǒng)組織為組件,使用OOP重用并定制代碼,并以一種優(yōu)雅的方式處理事件和錯誤。前面提到的Python函數(shù)式編程工具,提供了實(shí)現(xiàn)相同目標(biāo)的其他方法。
內(nèi)置對象類型
Python提供了常用的數(shù)據(jù)結(jié)構(gòu)作為語言的基本組成部分。例如,列表(list)、字典(dictionary)、字符串(string)。我們將會看到,它們靈活并易于使用。例如,內(nèi)置對象可以根據(jù)需求擴(kuò)展或收縮,可以任意地組織復(fù)雜的信息等。
內(nèi)置工具
為了對以上對象類型進(jìn)行處理,Python自帶了許多強(qiáng)大的標(biāo)準(zhǔn)操作,包括拼接(concatenation)、分片(slice)、排序(sort)和映射(mapping)等。
庫工具
為了完成更多特定的任務(wù),Python預(yù)置了許多預(yù)編碼的庫工具,從正則表達(dá)式匹配到網(wǎng)絡(luò)都支持。當(dāng)你掌握了語言本身,就能在應(yīng)用級的操作中使用Python的庫工具。
第三方工具
由于Python是開源的,它鼓勵開發(fā)者提供Python內(nèi)置工具之外的預(yù)編碼工具。你可以在網(wǎng)上找到COM、圖像處理、數(shù)值編程、XML、數(shù)據(jù)庫訪問等許多免費(fèi)的支持工具。
除了這一系列的Python工具外,Python保持了相當(dāng)簡潔的語法和設(shè)計。綜合這一切得到的就是一個具有腳本語言所有可用性的強(qiáng)大編程工具。
請點(diǎn)擊輸入圖片描述
5. 可混合
Python程序可以以多種方式輕易地與其他語言編寫的組件“粘接”在一起。例如,Python的C語言API可以幫助Python程序靈活地調(diào)用C程序。這意味著可以根據(jù)需要給Python程序添加功能,或者在其他環(huán)境系統(tǒng)中使用Python。
例如,將Python與C或者C++寫成的庫文件混合起來,使Python成為一個前端語言和定制工具。就像之前我們所提到過的那樣,這使Python成為一個很好的快速原型工具;系統(tǒng)可以在開發(fā)初期出于速度考慮使用Python實(shí)現(xiàn),然后轉(zhuǎn)移至C,根據(jù)不同時期性能的需要逐步實(shí)現(xiàn)系統(tǒng)。
6. 相對簡單易用
同其他語言(如C++、Java和C#)相比,Python編程對大多數(shù)用戶來講出奇得簡單。要運(yùn)行Python程序,你只需簡單地鍵入Python程序并運(yùn)行就可以了。不需要其他語言(如C或C++)所必需的編譯和鏈接等中間步驟。
Python可立即執(zhí)行程序,這形成了一種交互式編程體驗和不同情況下快速調(diào)整的能力,往往在修改代碼后幾乎能立即看到程序改變后的效果。
當(dāng)然,開發(fā)周期短僅僅是Python易用性的一方面的體現(xiàn)。Python提供了簡潔的語法和強(qiáng)大的內(nèi)置工具。實(shí)際上,Python曾被稱為“可執(zhí)行的偽代碼”。由于它減少了其他工具常見的復(fù)雜性,在實(shí)現(xiàn)相同的功能時,Python程序比采用其他流行語言編寫的程序更為簡單、小巧,也更靈活。
請點(diǎn)擊輸入圖片描述
7. 相對簡單易學(xué)
這一部分引出了本書的重點(diǎn):尤其同其他廣泛使用的編程語言比較時,Python語言的核心相當(dāng)簡單易學(xué)。實(shí)際上,如果你是一位有經(jīng)驗的程序員,你可以期望在幾天內(nèi)寫出小規(guī)模的Python代碼,你也許能在幾個小時之內(nèi)習(xí)得Python的一招一式,但是你并不能指望在如此短的時間內(nèi)成為專家(忘掉市面上的那些宣傳廣告吧)。
當(dāng)然,掌握任何像今天Python這樣的充實(shí)主題都不是一件輕松事,我們將在本書的剩余部分致力于此項任務(wù)。但是為了掌握Python而進(jìn)行的真正投資是非常值得的——最終你會獲取幾乎在每個計算機(jī)應(yīng)用程序領(lǐng)域都適用的編程技能。此外,很多人還發(fā)現(xiàn)Python的學(xué)習(xí)曲線比其他的編程語言更加平緩。
這對于那些想學(xué)習(xí)語言以在工作中應(yīng)用的專業(yè)人員來說是一個好消息,同樣對于那些使用Python層進(jìn)行定制和控制的系統(tǒng)的終端用戶來說,也是一個好消息。如今,許多系統(tǒng)都依賴于這一事實(shí):用戶可以在沒有或者得到很少支持的情況下就學(xué)到足夠的Python知識以便當(dāng)場增刪他們的Python定制化代碼。
此外,Python還孕育出一群不以編程為生而以編程為樂的用戶,他們并不需要掌握全面的軟件開發(fā)技巧。盡管Python還是有很多高級編程工具,但不論對初學(xué)者還是行家來說,Python的核心語言精髓仍是相當(dāng)簡單的。
8. 以Monty Python命名
好的,在講完這么多技術(shù)方面的優(yōu)勢后,我想再揭露一個Python世界里面令人驚奇而保守良好的小秘密。
盡管Python的書和圖標(biāo)中有很多爬行動物,真相卻是Python以英國喜劇組“Monty Python”命名——這是BBC 在20世紀(jì)70年代喜劇《Monty Python's Flying Circus》的制片方,也是至今仍在流行的少量包括《Monty Python and the Holy Grai》在內(nèi)的大電影的制片方。Python的最初創(chuàng)作者是Monty Python的粉絲,這同其他許多的軟件開發(fā)者一樣(事實(shí)上,這兩個領(lǐng)域存在某種對稱性……)。
請點(diǎn)擊輸入圖片描述
▲《Python學(xué)習(xí)手冊》書封上的爬行動物
這段有趣的歷史無疑增加了Python代碼例子的幽默屬性。例如,作為一般變量名命名傳統(tǒng)的“foo”和“bar”在Python世界中變成了“spam”和“eggs”。而在Python中偶爾出現(xiàn)的“Brian”,“ni”和“shrubbery”表現(xiàn)得也同此類似。它甚至影響了Python的整個社區(qū)。
當(dāng)然了,如果你對這部喜劇非常熟悉,就能體會這其中的笑點(diǎn),但如果不熟悉則相反。你不必非得熟悉Monty Python這部劇來了解從劇中獲得靈感的例子(包括你將在本書中看到的許多例子),但至少你現(xiàn)在知道它們的起源了。(嗨——我已經(jīng)告訴你啦。)
02
Python和其他語言比較起來怎么樣
最后,你也許已經(jīng)知道了,人們往往將Python與Perl、Tcl和Javat等語言相比較。這部分總結(jié)這方面的一些普遍共識。
我想預(yù)先表明我個人并不喜歡通過詆毀競爭者來獲勝——這在長期是行不通的,而且也不是這里的目的。此外,這并不是一場零和游戲——絕大多數(shù)的程序員在他們的職業(yè)生涯中都會使用許多語言。盡管如此,編程工具也展示出值得考慮的選擇和權(quán)衡。畢竟,如果Python沒有比它的競爭者提供更多的東西,那么它一開始就不會被人們使用了。
請點(diǎn)擊輸入圖片描述
我們之前已經(jīng)介紹過性能上的權(quán)衡,那么這里重點(diǎn)談一下功能。盡管下面列舉的這些語言也是值得學(xué)習(xí)和使用的有力工具,但人們通常認(rèn)為Python:
比Tcl強(qiáng)大。Python強(qiáng)有力地支持“大規(guī)模編程”,使其適用于開發(fā)大型系統(tǒng),它的應(yīng)用程序庫也更加豐富。
比Perl更具可讀性。Python有著簡潔的語法和簡單連貫的設(shè)計,這反過來使得Python更具可讀性和更易于維護(hù),同時有助于減少程序bug。
比Java和C#更簡單、更易于使用。Python是一門腳本語言,但Java和C#兩者從像C++這樣更加大型的OOP系統(tǒng)語言中繼承了許多語法和復(fù)雜性。
比C++更簡單、更易于使用。Python代碼比等效的C++代碼更加簡單,長度只有其五分之一到三分之一。盡管作為腳本語言,Python有時能扮演許多不同的角色。
比C更加簡單和高級。Python遠(yuǎn)離底層硬件架構(gòu)從而降低了代碼復(fù)雜性,擁有更好的組織結(jié)構(gòu),并比C(C++的祖先)更加友善。
比Visual Basic更強(qiáng)大,用途廣泛,也更具備跨平臺特性。Python是更加廣泛使用的更豐富的語言,它的開源本質(zhì)意味著它不可能被某一個公司所掌控。
比PHP更易懂并且用途更廣。Python也用來構(gòu)建Web站點(diǎn),但是,它也應(yīng)用于幾乎每個計算機(jī)領(lǐng)域,從機(jī)器人到電影動畫和游戲。
比JavaScript更強(qiáng)大和用途廣泛。Python有一個更大的工具集,也并不是牢牢地束縛于Web開發(fā)。它也用于科學(xué)建模、儀器調(diào)試等。
比Ruby更具可讀性,并更為人們所接受。Python的語法混亂更少,尤其在較復(fù)雜代碼中,同時它的OOP對用戶和和不太使用OOP的工程中是完全可選的。
比Lua更成熟和受到更廣泛關(guān)注。Python更加龐大的特性集合和更加擴(kuò)展的庫支持給予其比Lua(一門和Tcl一樣的嵌入式“膠水”語言)更加寬廣的視野。
比SmallTalk、Lisp和Prolog更不晦澀。Python擁有這類函數(shù)式語言的動態(tài)品味,但是也擁有開發(fā)者和定制系統(tǒng)終端用戶都可接受的傳統(tǒng)語法。
特別是對不僅僅用于個人掃描文本文件,未來會被人們(包括你在內(nèi))讀到的程序而言,很多人會發(fā)現(xiàn)Python比目前任何可用的腳本或編程語言都劃得來。不僅如此,除非你的應(yīng)用要求最尖端的性能,Python往往是C、C++和Java等系統(tǒng)開發(fā)語言的一個不錯的替代品:Python代碼能夠常常實(shí)現(xiàn)相同的目標(biāo),卻會減少很多編寫、調(diào)試和維護(hù)的麻煩。
當(dāng)然,本文作者從1992年就已經(jīng)是Python的正式布道者了,所以盡可能接受這些意見吧(其他語言的擁護(hù)者的利益可能會受到些損失)。然而,所有這些觀點(diǎn)的確代表了投入時間和精力來探索Python的眾多開發(fā)者的一致看法。
關(guān)于作者:Mark Lutz是一位世界級的Python培訓(xùn)講師。他是Python暢銷書籍的作者,同時從1992年起就成為Python社區(qū)的引領(lǐng)者,有著30余年的軟件開發(fā)經(jīng)驗。
本文摘編自《Python學(xué)習(xí)手冊》(原書第5版),經(jīng)出版方授權(quán)發(fā)布。
請點(diǎn)擊輸入圖片描述
筆者比較懶能截圖的地方都截圖了。
支持向量機(jī)分為三類:
(1)線性可分支持向量機(jī),樣本線性可分,可通過硬間隔最大化訓(xùn)練一個分類器。
(2)線性支持向量機(jī),樣本基本線性可分,可通過軟間隔最大化訓(xùn)練一個分類器。
(3)非線性支持向量機(jī),樣本線性不可分,可通過核函數(shù)和軟間隔最大化訓(xùn)練一個分類器。
上面最不好理解的恐怕就是硬間隔和軟間隔了,
說白了硬間隔就是說存在這么一個平面,可以把樣本完全正確無誤的分開,當(dāng)然這是一種極理想的情況,現(xiàn)實(shí)中不存在,所以就有了軟間隔。
軟間隔說的是,不存在一個平面可以把樣本完全正確無誤的分開,因此呢允許一些樣本被分錯,怎么做呢就是加入松弛變量,因為希望分錯的樣本越小越好,因此松弛變量也有約束條件。加入松弛變量后,問題就變?yōu)榫€性可分了,因為是每一個樣本都線性可分,因此松弛變量是針對樣本的,每一個樣本都對應(yīng)一個不同的松弛變量。
其實(shí)感知機(jī)說白了就是找到一條直線把樣本點(diǎn)分開,就是上方都是一類,下方是另一類。當(dāng)然完全分開是好事,往往是不能完全分開的,因此就存在一個損失函數(shù),就是誤分類點(diǎn)到這個平面的距離最短:
這里啰嗦一句,誤分類點(diǎn)y*(wx+b)0,所以加個負(fù)號在前邊。
一般情況下||w||都是可以縮放,那么我們把它縮放到1,最后的目標(biāo)函數(shù)就變成了
間隔就是距離,我們假設(shè)分離超平面為 ,那么樣本點(diǎn)到這個平面的距離可以記為 。我們都知道通過感知機(jī)劃分的點(diǎn),超平面上方的點(diǎn) ,下方的點(diǎn) ,然后通過判斷 的值與y的符號是否一致來判斷分類是否正確。根據(jù)這個思路函數(shù)間隔定義為:
支持向量的定義來源于幾何間隔,幾何間隔最直接的解釋是離分隔超平面最近點(diǎn)的距離,其他任何點(diǎn)到平面的距離都大于這個值,所以幾何間隔就是支持向量。然后呢同樣道理,w和b是可以縮放的,所以定義支持向量滿足如下條件:
再通俗一點(diǎn)說,支持向量是一些點(diǎn),這些點(diǎn)到分隔平面的距離最近,為了便于表示,把他們進(jìn)行一下縮放計算,讓他們滿足了wx+b=+-1.
核函數(shù)是支持向量機(jī)的核心概念之一,它存在的目的就是將維度轉(zhuǎn)換之后的計算簡化,達(dá)到減少計算量的目的。我們都知道支持向量機(jī)求的是間距最大化,通常情況下我們求得的alpha都等于0,因此支持向量決定了間距最大化程度。
核函數(shù)的形式是這樣的
其中x(i)和x(j)都是向量,他們兩個相乘就是向量內(nèi)積,相乘得到一個數(shù)。剛才說了目標(biāo)函數(shù)一般只和支持向量有關(guān),因此在做核函數(shù)計算之前,實(shí)際就是選擇的支持向量進(jìn)行計算。
這個寫完下面得再補(bǔ)充
我們知道了支持向量的概念,那么支持向量機(jī)的目標(biāo)函數(shù)是要使這兩個支持向量之間的距離盡可能的遠(yuǎn),因為這樣才能更好地把樣本點(diǎn)分開,當(dāng)然支持向量也要滿足最基本的約束條件,那就是分類正確,還有就是其他點(diǎn)到分隔平面的距離要大于等于支持向量到分隔平面的距離。
這種凸優(yōu)化問題都可以通過拉格朗日算子進(jìn)行優(yōu)化,就是把約束條件通過拉格朗日系數(shù)放到目標(biāo)函數(shù)上。這部分基礎(chǔ)知識,就是拉格朗日算法可以將等式約束和不等式約束都加到目標(biāo)函數(shù)上,完成求解問題的轉(zhuǎn)換,但是要滿足一些約束條件,也就是我們后邊要說的kkt條件。
這里有個細(xì)節(jié)就是轉(zhuǎn)換時候的加減號問題,這個和目標(biāo)函數(shù)還有約束的正負(fù)號有關(guān)。一般這么理解,就是求最小化問題時候,如果約束是大于0的,那么拉個朗日算子可以減到這一部分,這樣一來目標(biāo)函數(shù)只能越來越小,最優(yōu)解就是約束為0的時候,這個時候和沒有約束的等價,再求最小就是原問題了。
這里是最小化問題,直接減掉這部分約束,然后后半部分永遠(yuǎn)大于等于0所以這個式子的值是要小于原來目標(biāo)函數(shù)值的。我們知道當(dāng)x滿足原問題的約束條件的時候,最大化L就等于那個原目標(biāo)函數(shù)。所以我們可以把這個問題轉(zhuǎn)化為:
把它帶回去原來的目標(biāo)函數(shù)中,整理一下。
這個時候只要求最優(yōu)的α,就可以求出w和b了。我們上邊做了那么一堆轉(zhuǎn)換,這個過程要滿足一個叫做kkt條件的東西,其實(shí)這個東西就是把一堆約束條件整理到一起。
(1)原有問題的可行性,即h(x )=0,g(x )0
放到這里就是:
SMO算法的核心思想是求出最優(yōu)化的α,然后根據(jù)之前推導(dǎo)得到的w,b,α之間的關(guān)系計算得到w和b,最后的計算公式是:
現(xiàn)在的問題就是怎么求α了。
SMO算法總共分兩部分,一部分是求解兩個α的二次規(guī)劃算法,另一部分是選擇兩個α的啟發(fā)式算法。
先說這個選擇α的啟發(fā)式算法部分:大神可以證明優(yōu)先優(yōu)化違反kkt條件的α可以最快獲得最優(yōu)解,至于咋證明的,就先不看了。
在講支持向量機(jī)的求解算法時候,直接給出了核函數(shù)K,那么怎么去理解核函數(shù)呢。核函數(shù)的作用是解決樣本點(diǎn)在高維空間的內(nèi)積運(yùn)算問題,怎么理解呢,通常的分類問題都是有很多個特征的,然后為了達(dá)到現(xiàn)線性可分,又會從低維映射到高維,樣本量再一多計算量非常大,因此先通過函數(shù)進(jìn)行一個轉(zhuǎn)換,減少乘法的計算量。
要理解核函數(shù),先理解內(nèi)積運(yùn)算,內(nèi)積運(yùn)算實(shí)際是兩個向量,對應(yīng)位置相乘加和,比如我有x1 = [v1,v2], x2=[w1,w2],那么x1和x2的內(nèi)積計算方法就是:v1w1+v2w2。
如果上面那種情況線性不可分,需要到高維進(jìn)行映射,讓數(shù)據(jù)變得線性可分,然后數(shù)據(jù)變?yōu)槲寰S的,即v1 2+v2 2+v1+v2+v1v2,然后再進(jìn)行一次內(nèi)積計算,數(shù)據(jù)變?yōu)? 。
稍作變換,可以變?yōu)? ,形式展開和上邊那個長式子差不多,然后其實(shí)可以映射內(nèi)積相乘的情況,所以可以進(jìn)行核函數(shù)的變化。
問題在于,當(dāng)你需要顯式的寫出來映射形式的時候,在維度很高的時候,需要計算的量太大,比如x1有三個維度,再進(jìn)行映射就有19維度了,計算很復(fù)雜。如果用核函數(shù),還是在原來低維度進(jìn)行運(yùn)算,既有相似的效果(映射到高維),又低運(yùn)算量,這就是核函數(shù)的作用了。
核函數(shù)的種類:
這部分的核心在于SMO算法的編寫。有待補(bǔ)充。