斯坦福大學編程範式
『壹』 如何系統地自學 python
是否非常想學好 Python,一方面被瑣事糾纏,一直沒能動手,另一方面,擔心學習成本太高,心裡默默敲著退堂鼓?
幸運的是,Python 是一門初學者友好的編程語言,想要完全掌握它,你不必花上太多的時間和精力。
Python 的設計哲學之一就是簡單易學,體現在兩個方面:
語法簡潔明了:相對 Ruby 和 Perl,它的語法特性不多不少,大多數都很簡單直接,不玩兒玄學。
切入點很多:Python 可以讓你可以做很多事情,科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,總有一個是你感興趣並且願意投入時間的。
- 用一種方法,最好是只有一種方法來做一件事。
廢話不多說,學會一門語言的捷徑只有一個: Getting Started
¶ 起步階段
任何一種編程語言都包含兩個部分:硬知識和軟知識,起步階段的主要任務是掌握硬知識。
硬知識
「硬知識」指的是編程語言的語法、演算法和數據結構、編程範式等,例如:變數和類型、循環語句、分支、函數、類。這部分知識也是具有普適性的,看上去是掌握了一種語法,實際是建立了一種思維。例如:讓一個 Java 程序員去學習 Python,他可以很快的將 Java 中的學到的面向對象的知識 map 到 Python 中來,因此能夠快速掌握 Python 中面向對象的特性。
如果你是剛開始學習編程的新手,一本可靠的語法書是非常重要的。它看上去可能非常枯燥乏味,但對於建立穩固的編程思維是必不可少。
下面列出了一些適合初學者入門的教學材料:
廖雪峰的 Python 教程 Python 中文教程的翹楚,專為剛剛步入程序世界的小白打造。
笨方法學 Python 這本書在講解 Python 的語法成分時,還附帶大量可實踐的例子,非常適合快速起步。
The Hitchhiker』s Guide to Python! 這本指南著重於 Python 的最佳實踐,不管你是 Python 專家還是新手,都能獲得極大的幫助。
Python 的哲學:
學習也是一樣,雖然推薦了多種學習資料,但實際學習的時候,最好只選擇其中的一個,堅持看完。
必要的時候,可能需要閱讀講解數據結構和演算法的書,這些知識對於理解和使用 Python 中的對象模型有著很大的幫助。
軟知識
「軟知識」則是特定語言環境下的語法技巧、類庫的使用、IDE的選擇等等。這一部分,即使完全不了解不會使用,也不會妨礙你去編程,只不過寫出的程序,看上去顯得「傻」了些。
對這些知識的學習,取決於你嘗試解決的問題的領域和深度。對初學者而言,起步階段極易走火,或者在選擇 Python 版本時徘徊不決,一會兒看 2.7 一會兒又轉到 3.0,或者徜徉在類庫的大海中無法自拔,Scrapy,Numpy,Django 什麼都要試試,或者參與編輯器聖戰、大括弧縮進探究、操作系統辯論賽等無意義活動,或者整天跪舔語法糖,老想著怎麼一行代碼把所有的事情做完,或者去構想聖潔的性能安全通用性健壯性全部滿分的解決方案。
很多「大牛」都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
還不如告訴初學者,學習本來就是個需要你去走彎路出 Bug,只能腳踏實地,沒有奇跡只有狗屎的過程。
選擇一個方向先走下去,哪怕臟丑差,走不動了再看看有沒有更好的解決途徑。
自己走了彎路,你才知道這么做的好處,才能理解為什麼人們可以手寫狀態機去匹配卻偏要發明正則表達式,為什麼面向過程可以解決卻偏要面向對象,為什麼我可以操縱每一根指針卻偏要自動管理內存,為什麼我可以嵌套回調卻偏要用 Promise...
更重要的是,你會明白,高層次的解決方法都是對低層次的封裝,並不是任何情況下都是最有效最合適的。
技術涌進就像波浪一樣,那些陳舊的封存已久的技術,消退了遲早還會涌回的。就像現在移動端應用、手游和 HTML5 的火熱,某些方面不正在重演過去 PC 的那些歷史么?
因此,不要擔心自己走錯路誤了終身,堅持並保持進步才是正道。
起步階段的核心任務是掌握硬知識,軟知識做適當了解,有了穩固的根,粗壯的枝幹,才能長出濃密的葉子,結出甜美的果實。
¶ 發展階段
完成了基礎知識的學習,必定會感到一陣空虛,懷疑這些語法知識是不是真的有用。
沒錯,你的懷疑是非常正確的。要讓 Python 發揮出它的價值,當然不能停留在語法層面。
發展階段的核心任務,就是「跳出 Python,擁抱世界」。
在你面前會有多個分支:科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,這些都不是僅僅知道 Python 語法就能解決的問題。
拿爬蟲舉例,如果你對計算機網路,HTTP 協議,HTML,文本編碼,JSON 一無所知,你能做好這部分的工作么?而你在起步階段的基礎知識也同樣重要,如果你連循環遞歸怎麼寫都還要查文檔,連 BFS 都不知道怎麼實現,這就像工匠做石凳每次起錘都要思考錘子怎麼使用一樣,非常低效。
在這個階段,不可避免要接觸大量類庫,閱讀大量書籍的。
類庫方面
「Awesome Python 項目」:vinta/awesome-python · GitHub
這里列出了你在嘗試解決各種實際問題時,Python 社區已有的工具型類庫,如下圖所示:
vinta/awesome-python
你可以按照實際需求,尋找你需要的類庫。
至於相關類庫如何使用,必須掌握的技能便是閱讀文檔。由於開源社區大多數文檔都是英文寫成的,所以,英語不好的同學,需要惡補下。
書籍方面
這里我只列出一些我覺得比較有一些幫助的書籍,詳細的請看豆瓣的書評:
科學和數據分析:
❖「集體智慧編程」:集體智慧編程 (豆瓣)
❖「數學之美」:數學之美 (豆瓣)
❖「統計學習方法」:統計學習方法 (豆瓣)
❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
❖「數據科學實戰」:數據科學實戰 (豆瓣)
❖「數據檢索導論」:信息檢索導論 (豆瓣)
爬蟲:
❖「HTTP 權威指南」:HTTP權威指南 (豆瓣)
Web 網站:
❖「HTML & CSS 設計與構建網站」:HTML & CSS設計與構建網站 (豆瓣)
...
列到這里已經不需要繼續了。
聰明的你一定會發現上面的大部分書籍,並不是講 Python 的書,而更多的是專業知識。
事實上,這里所謂「跳出 Python,擁抱世界」,其實是發現 Python 和專業知識相結合,能夠解決很多實際問題。這個階段能走到什麼程度,更多的取決於自己的專業知識。
¶ 深入階段
這個階段的你,對 Python 幾乎了如指掌,那麼你一定知道 Python 是用 C 語言實現的。
可是 Python 對象的「動態特徵」是怎麼用相對底層,連自動內存管理都沒有的C語言實現的呢?這時候就不能停留在表面了,勇敢的拆開 Python 的黑盒子,深入到語言的內部,去看它的歷史,讀它的源碼,才能真正理解它的設計思路。
這里推薦一本書:
「Python 源碼剖析」:Python源碼剖析 (豆瓣)
這本書把 Python 源碼中最核心的部分,給出了詳細的闡釋,不過閱讀此書需要對 C 語言內存模型和指針有著很好的理解。
另外,Python 本身是一門雜糅多種範式的動態語言,也就是說,相對於 C 的過程式、 Haskell 等的函數式、Java 基於類的面向對象而言,它都不夠純粹。換而言之,編程語言的「道學」,在 Python 中只能有限的體悟。學習某種編程範式時,從那些面向這種範式更加純粹的語言出發,才能有更深刻的理解,也能了解到 Python 語言的根源。
這里推薦一門公開課
「編程範式」:斯坦福大學公開課:編程範式
講師高屋建瓴,從各種編程範式的代表語言出發,給出了每種編程範式最核心的思想。
值得一提的是,這門課程對C語言有非常深入的講解,例如C語言的范型和內存管理。這些知識,對閱讀 Python 源碼也有大有幫助。
Python 的許多最佳實踐都隱藏在那些眾所周知的框架和類庫中,例如 Django、Tornado 等等。在它們的源代碼中淘金,也是個不錯的選擇。
¶ 最後的話
每個人學編程的道路都是不一樣的,其實大都殊途同歸,沒有迷路的人只有不能堅持的人!
希望想學 Python 想學編程的同學,不要猶豫了,看完這篇文章,
Just Getting Started !!!
『貳』 講C語言內存管理的書籍或者博客
我推薦的是斯坦福的一門公開課 -- 《編程範式》。不是題主說的博客或者書,但是個人覺得很好用,希望對你有幫助。
還有一些其他的編程語言,如方案、Python等。
我只看到了多線程同步的一部分,個人的感覺受益於它。如果以後還有別的發現,願意及時分享給大家。
『叄』 濡備綍緋葷粺鍦拌嚜瀛 Python
鏄鍚﹂潪甯告兂瀛﹀ソ Python錛屼竴鏂歸潰琚鐞愪簨綰犵紶錛屼竴鐩存病鑳藉姩鎵嬶紝鍙︿竴鏂歸潰錛屾媴蹇冨︿範鎴愭湰澶楂橈紝蹇冮噷榛橀粯鏁茬潃閫鍫傞紦錛
騫歌繍鐨勬槸錛孭ython 鏄涓闂ㄥ垵瀛﹁呭弸濂界殑緙栫▼璇璦錛屾兂瑕佸畬鍏ㄦ帉鎻″畠錛屼綘涓嶅繀鑺變笂澶澶氱殑鏃墮棿鍜岀簿鍔涖
Python 鐨勮捐″摬瀛︿箣涓灝辨槸綆鍗曟槗瀛︼紝浣撶幇鍦ㄤ袱涓鏂歸潰錛
璇娉曠畝媧佹槑浜嗭細鐩稿 Ruby 鍜 Perl錛屽畠鐨勮娉曠壒鎬т笉澶氫笉灝戱紝澶у氭暟閮藉緢綆鍗曠洿鎺ワ紝涓嶇帺鍎跨巹瀛︺
鍒囧叆鐐瑰緢澶氾細Python 鍙浠ヨ╀綘鍙浠ュ仛寰堝氫簨鎯咃紝縐戝﹁$畻鍜屾暟鎹鍒嗘瀽銆佺埇鉶銆乄eb 緗戠珯銆佹父鎴忋佸懡浠よ屽疄鐢ㄥ伐鍏風瓑絳夌瓑絳夛紝鎬繪湁涓涓鏄浣犳劅鍏磋叮騫朵笖鎰挎剰鎶曞叆鏃墮棿鐨勩
搴熻瘽涓嶅氳達紝瀛︿細涓闂ㄨ璦鐨勬嵎寰勫彧鏈変竴涓錛 Getting Started
¶ 璧鋒ラ樁孌
浠諱綍涓縐嶇紪紼嬭璦閮藉寘鍚涓や釜閮ㄥ垎錛氱‖鐭ヨ瘑鍜岃蔣鐭ヨ瘑錛岃搗姝ラ樁孌電殑涓昏佷換鍔℃槸鎺屾彙紜鐭ヨ瘑銆
擄1 紜鐭ヨ瘑
鈥滅‖
鐭ヨ瘑鈥濇寚鐨勬槸緙栫▼璇璦鐨勮娉曘佺畻娉曞拰鏁版嵁緇撴瀯銆佺紪紼嬭寖寮忕瓑錛屼緥濡傦細鍙橀噺鍜岀被鍨嬨佸驚鐜璇鍙ャ佸垎鏀銆佸嚱鏁般佺被銆傝繖閮ㄥ垎鐭ヨ瘑涔熸槸鍏鋒湁鏅閫傛х殑錛岀湅涓婂幓鏄鎺屾彙浜嗕竴
縐嶈娉曪紝瀹為檯鏄寤虹珛浜嗕竴縐嶆濈淮銆備緥濡傦細璁╀竴涓 Java 紼嬪簭鍛樺幓瀛︿範 Python錛屼粬鍙浠ュ緢蹇鐨勫皢 Java 涓鐨勫﹀埌鐨勯潰鍚戝硅薄鐨勭煡璇 map 鍒
Python 涓鏉ワ紝鍥犳よ兘澶熷揩閫熸帉鎻 Python 涓闈㈠悜瀵硅薄鐨勭壒鎬с
濡傛灉浣犳槸鍒氬紑濮嬪︿範緙栫▼鐨勬柊鎵嬶紝涓鏈鍙闈犵殑璇娉曚功鏄闈炲父閲嶈佺殑銆傚畠鐪嬩笂鍘誨彲鑳介潪甯告灟鐕ヤ箯鍛籌紝浣嗗逛簬寤虹珛紼沖滻鐨勭紪紼嬫濈淮鏄蹇呬笉鍙灝戙
涓嬮潰鍒楀嚭浜嗕竴浜涢傚悎鍒濆﹁呭叆闂ㄧ殑鏁欏︽潗鏂欙細
❖銆岀ㄦ柟娉曞 Python銆嶏細
榪欐湰涔﹀湪璁茶В Python 鐨勮娉曟垚鍒嗘椂錛岃繕闄勫甫澶ч噺鍙瀹炶返鐨勪緥瀛愶紝闈炲父閫傚悎蹇閫熻搗姝ャ
❖銆屽粬闆宄扮殑 Python 2.7 鏁欑▼銆嶏細Home - 寤栭洩宄扮殑瀹樻柟緗戠珯
Python 涓鏂囨暀紼嬬殑緲樻氾紝涓撲負鍒氬垰姝ュ叆紼嬪簭涓栫晫鐨勫皬鐧芥墦閫犮
❖銆孴he Hitchhiker鈥檚 Guide to Python!銆嶏細The Hitchhiker鈥檚 Guide to Python!
榪欐湰鎸囧崡鐫閲嶄簬 Python 鐨勬渶浣沖疄璺碉紝涓嶇′綘鏄 Python 涓撳惰繕鏄鏂版墜錛岄兘鑳借幏寰楁瀬澶х殑甯鍔┿
❖銆孭ython 瀹樻柟鏂囨。銆嶏細Our Documentation
瀹炶返涓澶ч儴鍒嗛棶棰橈紝閮藉彲浠ュ湪瀹樻柟鏂囨。涓鎵懼埌絳旀堛
❖ 杈呭姪宸ュ叿錛歅ython Tutor
涓涓 Python 瀵硅薄鍙瑙嗗寲鐨勯」鐩錛岀敤鍥懼艦杈呭姪浣犵悊瑙 Python 涓鐨勫悇縐嶆傚康銆
Python 鐨勫摬瀛︼細
鐢ㄤ竴縐嶆柟娉曪紝鏈濂芥槸鍙鏈変竴縐嶆柟娉曟潵鍋氫竴浠朵簨銆
瀛︿範涔熸槸涓鏍鳳紝鉶界劧鎺ㄨ崘浜嗗氱嶅︿範璧勬枡錛屼絾瀹為檯瀛︿範鐨勬椂鍊欙紝鏈濂藉彧閫夋嫨鍏朵腑鐨勪竴涓錛屽潥鎸佺湅瀹屻
蹇呰佺殑鏃跺欙紝鍙鑳介渶瑕侀槄璇昏茶В鏁版嵁緇撴瀯鍜岀畻娉曠殑涔︼紝榪欎簺鐭ヨ瘑瀵逛簬鐞嗚В鍜屼嬌鐢 Python 涓鐨勫硅薄妯″瀷鏈夌潃寰堝ぇ鐨勫府鍔┿
擄2 杞鐭ヨ瘑
鈥滆蔣鐭ヨ瘑鈥濆垯鏄鐗瑰畾璇璦鐜澧冧笅鐨勮娉曟妧宸с佺被搴撶殑浣跨敤銆両DE鐨勯夋嫨絳夌瓑銆傝繖涓閮ㄥ垎錛屽嵆浣垮畬鍏ㄤ笉浜嗚В涓嶄細浣跨敤錛屼篃涓嶄細濡ㄧ嶄綘鍘葷紪紼嬶紝鍙涓嶈繃鍐欏嚭鐨勭▼搴忥紝鐪嬩笂鍘繪樉寰椻滃偦鈥濅簡浜涖
瀵
榪欎簺鐭ヨ瘑鐨勫︿範錛屽彇鍐充簬浣犲皾璇曡В鍐崇殑闂棰樼殑棰嗗煙鍜屾繁搴︺傚瑰垵瀛﹁呰岃█錛岃搗姝ラ樁孌墊瀬鏄撹蛋鐏錛屾垨鑰呭湪閫夋嫨 Python 鐗堟湰鏃跺緲寰婁笉鍐籌紝涓浼氬効鐪 2.7
涓浼氬効鍙堣漿鍒 3.0錛屾垨鑰呭緶寰夊湪綾誨簱鐨勫ぇ嫻蜂腑鏃犳硶鑷鎷旓紝Scrapy錛孨umpy錛孌jango
浠涔堥兘瑕佽瘯璇曪紝鎴栬呭弬涓庣紪杈戝櫒鍦f垬銆佸ぇ鎷鍙風緝榪涙帰絀躲佹搷浣滅郴緇熻京璁鴻禌絳夋棤鎰忎箟媧誨姩錛屾垨鑰呮暣澶╄藩鑸旇娉曠硸錛岃佹兂鐫鎬庝箞涓琛屼唬鐮佹妸鎵鏈夌殑浜嬫儏鍋氬畬錛屾垨鑰呭幓鏋勬兂
鍦f磥鐨勬ц兘瀹夊叏閫氱敤鎬у仴澹鎬у叏閮ㄦ弧鍒嗙殑瑙e喅鏂規堛
寰堝氣滃ぇ鐗涒濋兘浼氬憡璇鍒濆﹁咃紝鐢ㄨ繖涓鐢ㄩ偅涓錛屽皯璧板集璺錛岃繖鏍峰弽鑰屾妸鍒濆﹁呮帹鍚戜簡鐪熸g殑寮璺銆
榪樹笉濡傚憡璇夊垵瀛﹁咃紝瀛︿範鏈鏉ュ氨鏄涓闇瑕佷綘鍘昏蛋寮璺鍑 Bug錛屽彧鑳借剼韙忓疄鍦幫紝娌℃湁濂囪抗鍙鏈夌嫍灞庣殑榪囩▼銆
閫夋嫨涓涓鏂瑰悜鍏堣蛋涓嬪幓錛屽摢鎬曡剰涓戝樊錛岃蛋涓嶅姩浜嗗啀鐪嬬湅鏈夋病鏈夋洿濂界殑瑙e喅閫斿緞銆
鑷宸辮蛋浜嗗集璺錛屼綘鎵嶇煡閬撹繖涔堝仛鐨勫ソ澶勶紝鎵嶈兘鐞嗚В涓轟粈涔堜漢浠鍙浠ユ墜鍐欑姸鎬佹満鍘誨尮閰嶅嵈鍋忚佸彂鏄庢e垯琛ㄨ揪寮忥紝涓轟粈涔堥潰鍚戣繃紼嬪彲浠ヨВ鍐沖嵈鍋忚侀潰鍚戝硅薄錛屼負浠涔堟垜鍙浠ユ搷綰墊瘡涓鏍規寚閽堝嵈鍋忚佽嚜鍔ㄧ$悊鍐呭瓨錛屼負浠涔堟垜鍙浠ュ祵濂楀洖璋冨嵈鍋忚佺敤 Promise...
鏇撮噸瑕佺殑鏃訛紝浣犱細鏄庣櫧錛岄珮灞傛$殑瑙e喅鏂規硶閮芥槸瀵逛綆灞傛$殑灝佽咃紝騫朵笉鏄浠諱綍鎯呭喌涓嬮兘鏄鏈鏈夋晥鏈鍚堥傜殑銆
鎶鏈娑岃繘灝卞儚娉㈡氮涓鏍鳳紝閭d簺闄堟棫鐨勫皝瀛樺凡涔呯殑鎶鏈錛屾秷閫浜嗚繜鏃╄繕浼氭穠鍥炵殑銆傚氨鍍忕幇鍦ㄧЩ鍔ㄧ搴旂敤銆佹墜娓稿拰 HTML5 鐨勭伀鐑錛屾煇浜涙柟闈涓嶆e湪閲嶆紨榪囧幓 PC 鐨勯偅浜涘巻鍙蹭箞錛
鍥犳わ紝涓嶈佹媴蹇冭嚜宸辮蛋閿欒礬璇浜嗙粓韜錛屽潥鎸佸苟淇濇寔榪涙ユ墠鏄姝i亾銆
璧鋒ラ樁孌電殑鏍稿績浠誨姟鏄鎺屾彙紜鐭ヨ瘑錛岃蔣鐭ヨ瘑鍋氶傚綋浜嗚В錛屾湁浜嗙ǔ鍥虹殑鏍癸紝綺楀.鐨勬灊騫詫紝鎵嶈兘闀垮嚭嫻撳瘑鐨勫彾瀛愶紝緇撳嚭鐢滅編鐨勬灉瀹炪
¶ 鍙戝睍闃舵
瀹屾垚浜嗗熀紜鐭ヨ瘑鐨勫︿範錛屽繀瀹氫細鎰熷埌涓闃電┖鉶氾紝鎬鐤戣繖浜涜娉曠煡璇嗘槸涓嶆槸鐪熺殑鏈夌敤銆
娌¢敊錛屼綘鐨勬鐤戞槸闈炲父姝g『鐨勩傝佽 Python 鍙戞尌鍑哄畠鐨勪環鍊礆紝褰撶劧涓嶈兘鍋滅暀鍦ㄨ娉曞眰闈銆
鍙戝睍闃舵電殑鏍稿績浠誨姟錛屽氨鏄鈥滆煩鍑 Python錛屾嫢鎶變笘鐣屸濄
鍦ㄤ綘闈㈠墠浼氭湁澶氫釜鍒嗘敮錛氱戝﹁$畻鍜屾暟鎹鍒嗘瀽銆佺埇鉶銆乄eb 緗戠珯銆佹父鎴忋佸懡浠よ屽疄鐢ㄥ伐鍏風瓑絳夌瓑絳夛紝榪欎簺閮戒笉鏄浠呬粎鐭ラ亾 Python 璇娉曞氨鑳借В鍐崇殑闂棰樸
鎷
鐖鉶涓句緥錛屽傛灉浣犲硅$畻鏈虹綉緇滐紝HTTP鍗忚錛孒TML錛屾枃鏈緙栫爜錛孞SON涓鏃犳墍鐭ワ紝浣犺兘鍋氬ソ榪欓儴鍒嗙殑宸ヤ綔涔堬紵鑰屼綘鍦ㄨ搗姝ラ樁孌電殑鍩虹鐭ヨ瘑涔熷悓鏍烽噸瑕侊紝濡
鏋滀綘榪炲驚鐜閫掑綊鎬庝箞鍐欓兘榪樿佹煡鏂囨。錛岃繛 BFS 閮戒笉鐭ラ亾鎬庝箞瀹炵幇錛岃繖灝卞儚宸ュ尃鍋氱煶鍑蟲瘡嬈¤搗閿ら兘瑕佹濊冮敜瀛愭庝箞浣跨敤涓鏍鳳紝闈炲父浣庢晥銆
鍦ㄨ繖涓闃舵碉紝涓嶅彲閬垮厤瑕佹帴瑙﹀ぇ閲忕被搴擄紝闃呰誨ぇ閲忎功綾嶇殑銆
擄1 綾誨簱鏂歸潰
銆孉wesome Python 欏圭洰銆嶏細vinta/awesome-python 路 GitHub
榪欓噷鍒楀嚭浜嗕綘鍦ㄥ皾璇曡В鍐沖悇縐嶅疄闄呴棶棰樻椂錛孭ython 紺懼尯宸叉湁鐨勫伐鍏峰瀷綾誨簱錛屽備笅鍥炬墍紺猴細
浣犲彲浠ユ寜鐓у疄闄呴渶奼傦紝瀵繪壘浣犻渶瑕佺殑綾誨簱銆
鑷充簬鐩稿叧綾誨簱濡備綍浣跨敤錛屽繀欏繪帉鎻$殑鎶鑳戒究鏄闃呰繪枃妗c傜敱浜庡紑婧愮ぞ鍖哄ぇ澶氭暟鏂囨。閮芥槸鑻辨枃鍐欐垚鐨勶紝鎵浠ワ紝鑻辮涓嶅ソ鐨勫悓瀛︼紝闇瑕佹伓琛ヤ笅銆
擄2 涔︾睄鏂歸潰錛
榪欓噷鎴戝彧鍒楀嚭涓浜涙垜瑙夊緱姣旇緝鏈変竴浜涘府鍔╃殑涔︾睄錛岃︾粏鐨勮風湅璞嗙摚鐨勪功璇勶細
縐戝﹀拰鏁版嵁鍒嗘瀽錛
❖銆岄泦浣撴櫤鎱х紪紼嬨嶏細闆嗕綋鏅烘収緙栫▼ (璞嗙摚)
❖銆屾暟瀛︿箣緹庛嶏細鏁板︿箣緹 (璞嗙摚)
❖銆岀粺璁″︿範鏂規硶銆嶏細緇熻″︿範鏂規硶 (璞嗙摚)
❖銆孭attern Recognition And Machine Learning銆嶏細Pattern Recognition And Machine Learning (璞嗙摚)
❖銆屾暟鎹縐戝﹀疄鎴樸嶏細鏁版嵁縐戝﹀疄鎴 (璞嗙摚)
❖銆屾暟鎹媯緔㈠艱恆嶏細淇℃伅媯緔㈠艱 (璞嗙摚)
鐖鉶錛
❖銆孒TTP 鏉冨▉鎸囧崡銆嶏細HTTP鏉冨▉鎸囧崡 (璞嗙摚)
Web 緗戠珯錛
❖銆孒TML & CSS 璁捐′笌鏋勫緩緗戠珯銆嶏細HTML & CSS璁捐′笌鏋勫緩緗戠珯 (璞嗙摚)
...
鍒楀埌榪欓噷宸茬粡涓嶉渶瑕佺戶緇浜嗐
鑱鏄庣殑浣犱竴瀹氫細鍙戠幇涓婇潰鐨勫ぇ閮ㄥ垎涔︾睄錛屽苟涓嶆槸璁 Python 鐨勪功錛岃屾洿澶氱殑鏄涓撲笟鐭ヨ瘑銆
浜嬪疄涓婏紝榪欓噷鎵璋撯滆煩鍑 Python錛屾嫢鎶變笘鐣屸濓紝鍏跺疄鏄鍙戠幇 Python 鍜屼笓涓氱煡璇嗙浉緇撳悎錛岃兘澶熻В鍐沖緢澶氬疄闄呴棶棰樸傝繖涓闃舵佃兘璧板埌浠涔堢▼搴︼紝鏇村氱殑鍙栧喅浜庤嚜宸辯殑涓撲笟鐭ヨ瘑銆
¶ 娣卞叆闃舵
榪欎釜闃舵電殑浣狅紝瀵 Python 鍑犱箮浜嗗傛寚鎺岋紝閭d箞浣犱竴瀹氱煡閬 Python 鏄鐢 C 璇璦瀹炵幇鐨勩
鍙鏄 Python 瀵硅薄鐨勨滃姩鎬佺壒寰佲濇槸鎬庝箞鐢ㄧ浉瀵瑰簳灞傦紝榪炶嚜鍔ㄥ唴瀛樼$悊閮芥病鏈夌殑C璇璦瀹炵幇鐨勫憿錛熻繖鏃跺欏氨涓嶈兘鍋滅暀鍦ㄨ〃闈浜嗭紝鍕囨暍鐨勬媶寮 Python 鐨勯粦鐩掑瓙錛屾繁鍏ュ埌璇璦鐨勫唴閮錛屽幓鐪嬪畠鐨勫巻鍙詫紝璇誨畠鐨勬簮鐮侊紝鎵嶈兘鐪熸g悊瑙e畠鐨勮捐℃濊礬銆
榪欓噷鎺ㄨ崘涓鏈涔︼細
銆孭ython 婧愮爜鍓栨瀽銆嶏細Python婧愮爜鍓栨瀽 (璞嗙摚)
榪欐湰涔︽妸 Python 婧愮爜涓鏈鏍稿績鐨勯儴鍒嗭紝緇欏嚭浜嗚︾粏鐨勯槓閲婏紝涓嶈繃闃呰繪や功闇瑕佸 C 璇璦鍐呭瓨妯″瀷鍜屾寚閽堟湁鐫寰堝ソ鐨勭悊瑙c
鍙
澶栵紝Python 鏈韜鏄涓闂ㄦ潅緋呭氱嶈寖寮忕殑鍔ㄦ佽璦錛屼篃灝辨槸璇達紝鐩稿逛簬 C 鐨勮繃紼嬪紡銆 Haskell 絳夌殑鍑芥暟寮忋丣ava
鍩轟簬綾葷殑闈㈠悜瀵硅薄鑰岃█錛屽畠閮戒笉澶熺函綺廣傛崲鑰岃█涔嬶紝緙栫▼璇璦鐨勨滈亾瀛︹濓紝鍦 Python
涓鍙鑳芥湁闄愮殑浣撴偀銆傚︿範鏌愮嶇紪紼嬭寖寮忔椂錛屼粠閭d簺闈㈠悜榪欑嶈寖寮忔洿鍔犵函綺圭殑璇璦鍑哄彂錛屾墠鑳芥湁鏇存繁鍒葷殑鐞嗚В錛屼篃鑳戒簡瑙e埌 Python 璇璦鐨勬牴婧愩
榪欓噷鎺ㄨ崘涓闂ㄥ叕寮璇
銆岀紪紼嬭寖寮忋嶏細鏂鍧︾忓ぇ瀛﹀叕寮璇撅細緙栫▼鑼冨紡
璁插笀楂樺眿寤虹摯錛屼粠鍚勭嶇紪紼嬭寖寮忕殑浠h〃璇璦鍑哄彂錛岀粰鍑轟簡姣忕嶇紪紼嬭寖寮忔渶鏍稿績鐨勬濇兂銆
鍊煎緱涓鎻愮殑鏄錛岃繖闂ㄨ劇▼瀵笴璇璦鏈夐潪甯告繁鍏ョ殑璁茶В錛屼緥濡侰璇璦鐨勮寖鍨嬪拰鍐呭瓨綆$悊銆傝繖浜涚煡璇嗭紝瀵歸槄璇 Python 婧愮爜涔熸湁澶ф湁甯鍔┿
Python 鐨勮稿氭渶浣沖疄璺甸兘闅愯棌鍦ㄩ偅浜涗紬鎵鍛ㄧ煡鐨勬嗘灦鍜岀被搴撲腑錛屼緥濡 Django銆乀ornado 絳夌瓑銆傚湪瀹冧滑鐨勬簮浠g爜涓娣橀噾錛屼篃鏄涓涓嶉敊鐨勯夋嫨銆
¶ 鏈鍚庣殑璇
姣忎釜浜哄︾紪紼嬬殑閬撹礬閮芥槸涓嶄竴鏍風殑錛屽叾瀹炲ぇ閮芥畩閫斿悓褰掞紝娌℃湁榪瘋礬鐨勪漢鍙鏈変笉鑳藉潥鎸佺殑浜恆傝櫧鐒跺惉涓婂幓鏈夌偣楦℃堡錛屼絾鏄榪欐槸浜嬪疄銆
甯屾湜鎯沖 Python 鎯沖︾紪紼嬬殑鍚屽︼紝涓嶈佺姽璞浜嗭紝鐪嬪畬榪欑瘒鏂囩珷錛孞ust getting started鍀
『肆』 如何系統地自學 Python
按照這個大綱按部就班的學習,就能系統的學習Python了!
階段一:Python開發基礎
Python全棧開發與人工智慧之Python開發基礎知識學習內容包括:Python基礎語法、數據類型、字元編碼、文件操作、函數、裝飾器、迭代器、內置方法、常用模塊等。
階段二:Python高級編程和資料庫開發
Python全棧開發與人工智慧之Python高級編程和資料庫開發知識學習內容包括:面向對象開發、Socket網路編程、線程、進程、隊列、IO多路模型、Mysql資料庫開發等。
階段三:前端開發
Python全棧開發與人工智慧之前端開發知識學習內容包括:Html、CSS、JavaScript開發、Jquery&bootstrap開發、前端框架VUE開發等。
階段四:WEB框架開發
Python全棧開發與人工智慧之WEB框架開發學習內容包括:Django框架基礎、Django框架進階、BBS+Blog實戰項目開發、緩存和隊列中間件、Flask框架學習、Tornado框架學習、Restful API等。
階段五:爬蟲開發
Python全棧開發與人工智慧之爬蟲開發學習內容包括:爬蟲開發實戰。
階段六:全棧項目實戰
Python全棧開發與人工智慧之全棧項目實戰學習內容包括:企業應用工具學習、CRM客戶關系管理系統開發、路飛學城在線教育平台開發等。
階段七:演算法&設計模式
階段八:數據分析
Python全棧開發與人工智慧之數據分析學習內容包括:金融量化分析。
階段九:機器學習、圖像識別、NLP自然語言處理
Python全棧開發與人工智慧之人工智慧學習內容包括:機器學習、圖形識別、人工智慧玩具開發等。
階段十:Linux系統&百萬級並發架構解決方案
階段十一:高並發語言GO開發
Python全棧開發與人工智慧之高並發語言GO開發學習內容包括:GO語言基礎、數據類型與文件IO操作、函數和面向對象、並發編程等。
『伍』 放棄手工標記數據,斯坦福大學開發弱監督編程範式Snorkel
手工標記大量數據始終是開發機器學習的一大瓶頸。斯坦福AI Lab的研究人員探討了一種通過編程方式生成訓練數據的「弱監督」範式,並介紹了他們的開源Snorkel框架。
近年來,機器學習 (ML) 對現實世界的影響越來越大。這在很大程度上是由於深度學習模型的出現,使得從業者可以在基準數據集上獲得 state-of-the-art 的分數,而無需任何手工特徵設計。考慮到諸如 TensorFlow 和 PyTorch 等多種開源 ML 框架的可用性,以及大量可用的最先進的模型,可以說,高質量的 ML 模型現在幾乎成為一種商品化資源了。然而,有一個隱藏的問題:這些模型依賴於大量手工標記的訓練數據。
這些手工標記的訓練集創建起來既昂貴又耗時 —— 通常需要幾個月甚至幾年的時間、花費大量人力來收集、清理和調試 —— 尤其是在需要領域專業知識的情況下。除此之外,任務經常會在現實世界中發生變化和演變。例如,標記指南、粒度或下游用例都經常發生變化,需要重新標記 (例如,不要只將評論分類為正面或負面,還要引入一個中性類別)。
由於這些原因,從業者越來越多地轉向一種較弱的監管形式,例如利用外部知識庫、模式 / 規則或其他分類器啟發式地生成訓練數據。從本質上來講,這些都是以編程方式生成訓練數據的方法,或者更簡潔地說,編程訓練數據 (programming training data)。
在本文中,我們首先回顧了 ML 中由標記訓練數據驅動的一些領域,然後描述了我們對建模和整合各種監督源的研究。我們還討論了為大規模多任務機制構建數據管理系統的設想,這種系統使用數十或數百個弱監督的動態任務,以復雜、多樣的方式交互。
回顧:如何獲得更多有標簽的訓練數據?
ML 中的許多傳統研究方法也同樣受到對標記訓練數據的需求的推動。我們首先將這些方法與弱監督方法 (weak supervision) 區分開來:弱監督是利用來自主題領域專家(subject matter experts,簡稱 SME) 的更高級別和 / 或更嘈雜的輸入。
目前主流方法的一個關鍵問題是,由領域專家直接給大量數據加標簽是很昂貴的:例如,為醫學成像研究構建大型數據集更加困難,因為跟研究生不同,放射科醫生可不會接受一點小恩小惠就願意為你標記數據。因此,在 ML 中,許多經過深入研究的工作線都是由於獲取標記訓練數據的瓶頸所致:
在主動學習 (active learning) 中,目標是讓領域專家為估計對模型最有價值的數據點貼標簽,從而更有效地利用領域專家。在標準的監督學習設置中,這意味著選擇要標記的新數據點。例如,我們可以選擇靠近當前模型決策邊界的乳房 X 線照片,並要求放射科醫生僅給這些照片進行標記。但是,我們也可以只要求對這些數據點進行較弱的監督,在這種情況下,主動學習與弱監督是完美互補的;這方面的例子可以參考 (Druck, settle, and McCallum 2009)。
在半監督學習 (semi-supervised learning ) 設置中,我們的目標是用一個小的標記訓練集和一個更大的未標記數據集。然後使用關於平滑度、低維結構或距離度量的假設來利用未標記數據 (作為生成模型的一部分,或作為一個判別模型的正則項,或學習一個緊湊的數據表示);參考閱讀見 (Chapelle, Scholkopf, and Zien 2009)。從廣義上講,半監督學習的理念不是從 SME 那裡尋求更多輸入,而是利用領域和任務不可知的假設來利用未經標記的數據,而這些數據通常可以以低成本大量獲得。最近的方法使用生成對抗網路 (Salimans et al. 2016)、啟發式轉換模型 (Laine and Aila 2016) 和其他生成方法來有效地幫助規范化決策邊界。
在典型的遷移學習 (transfer learning )設置 中,目標是將一個或多個已經在不同數據集上訓練過的模型應用於我們的數據集和任務;相關的綜述見 (Pan 和 Yang 2010)。例如,我們可能已經有身體其他部位腫瘤的大型訓練集,並在此基礎上訓練了分類器,然後希望將其應用到我們的乳房 X 光檢查任務中。在當今的深度學習社區中,一種常見的遷移學習方法是在一個大數據集上對模型進行 「預訓練」,然後在感興趣的任務上對其進行 「微調」。另一個相關的領域是多任務學習 (multi-task learning),其中幾個任務是共同學習的 (Caruna 1993; Augenstein, Vlachos, and Maynard 2015)。
上述範例可能讓我們得以不用向領域專家合作者尋求額外的訓練標簽。然而,對某些數據進行標記是不可避免的。如果我們要求他們提供各種類型的更高級、或不那麼精確的監督形式,這些形式可以更快、更簡便地獲取,會怎麼樣呢?例如,如果我們的放射科醫生可以花一個下午的時間來標記一組啟發式的資源或其他資源,如果處理得當,這些資源可以有效地替代成千上萬的訓練標簽,那會怎麼樣呢 ?
將領域知識注入 AI
從 歷史 的角度來看,試圖 「編程」 人工智慧 (即注入領域知識) 並不是什麼新鮮想法,但現在提出這個問題的主要新穎之處在於,AI 從未像現在這樣強大,同時在可解釋性和可控制性方面,它還是一個 「黑盒」。
在 20 世紀 70 年代和 80 年代,AI 的重點是專家系統,它將來自領域專家的手工策劃的事實和規則的知識庫結合起來,並使用推理引擎來應用它們。20 世紀 90 年代,ML 開始作為將知識集成到 AI 系統的工具獲得成功,並承諾以強大而靈活的方式從標記的訓練數據自動實現這一點。
經典的 (非表示學習)ML 方法通常有兩個領域專家輸入埠。首先,這些模型通常比現代模型的復雜度要低得多,這意味著可以使用更少的手工標記數據。其次,這些模型依賴於手工設計的特性,這些特性為編碼、修改和與模型的數據基本表示形式交互提供了一種直接的方法。然而,特性工程不管在過去還是現在通常都被認為是 ML 專家的任務,他們通常會花費整個博士生涯來為特定的任務設計特性。
進入深度學習模型:由於它們具有跨許多領域和任務自動學習表示的強大能力,它們在很大程度上避免了特性工程的任務。然而,它們大部分是完整的黑盒子,除了標記大量的訓練集和調整網路架構外,普通開發人員對它們幾乎沒有控制權。在許多意義上,它們代表了舊的專家系統脆弱但易於控制的規則的對立面 —— 它們靈活但難以控制。
這使我們從一個略微不同的角度回到了最初的問題:我們如何利用我們的領域知識或任務專業知識來編寫現代深度學習模型?有沒有辦法將舊的基於規則的專家系統的直接性與這些現代 ML 方法的靈活性和強大功能結合起來?
代碼作為監督:通過編程訓練 ML
Snorkel 是我們為支持和 探索 這種與 ML 的新型交互而構建的一個系統。在 Snorkel中,我們不使用手工標記的訓練數據,而是要求用戶編寫標記函數 (labeling functions, LF),即用於標記未標記數據子集的黑盒代碼片段。
然後,我們可以使用一組這樣的 LF 來為 ML 模型標記訓練數據。因為標記函數只是任意的代碼片段,所以它們可以對任意信號進行編碼:模式、啟發式、外部數據資源、來自群眾工作者的嘈雜標簽、弱分類器等等。而且,作為代碼,我們可以獲得所有其他相關的好處,比如模塊化、可重用性和可調試性。例如,如果我們的建模目標發生了變化,我們可以調整標記函數來快速適應!
一個問題是,標記函數會產生有雜訊的輸出,這些輸出可能會重疊和沖突,從而產生不太理想的訓練標簽。在 Snorkel 中,我們使用數據編程方法對這些標簽進行去噪,該方法包括三個步驟:
1. 我們將標記函數應用於未標記的數據。
2. 我們使用一個生成模型來在沒有任何標記數據的條件下學習標記函數的准確性,並相應地對它們的輸出進行加權。我們甚至可以自動學習它們的關聯結構。
3. 生成模型輸出一組概率訓練標簽,我們可以使用這些標簽來訓練一個強大、靈活的判別模型 (如深度神經網路),它將泛化到標記函數表示的信號之外。
可以認為,這整個 pipeline 為 「編程」ML 模型提供了一種簡單、穩健且與模型無關的方法!
標記函數 (Labeling Functions)
從生物醫學文獻中提取結構化信息是最能激勵我們的應用之一:大量有用的信息被有效地鎖在數百萬篇科學論文的密集非結構化文本中。我們希望用機器學習來提取這些信息,進而使用這些信息來診斷遺傳性疾病。
考慮這樣一個任務:從科學文獻中提取某種化學 - 疾病的關系。我們可能沒有足夠大的標記訓練數據集來完成這項任務。然而,在生物醫學領域,存在著豐富的知識本體、詞典等資源,其中包括各種化學與疾病名稱數據、各種類型的已知化學 - 疾病關系資料庫等,我們可以利用這些資源來為我們的任務提供弱監督。此外,我們還可以與生物學領域的合作者一起提出一系列特定於任務的啟發式、正則表達式模式、經驗法則和負標簽生成策略。
作為一種表示載體的生成模型
在我們的方法中,我們認為標記函數隱含地描述了一個生成模型。讓我們來快速復習一下:給定數據點 x,以及我們想要預測的未知標簽 y,在判別方法中,我們直接對P(y|x) 建模,而在生成方法中,我們對 P(x,y) = P(x|y)P(y) 建模。在我們的例子中,我們建模一個訓練集標記的過程 P(L,y),其中 L 是由對象 x 的標記函數生成的標簽,y 是對應的 (未知的) 真實標簽。通過學習生成模型,並直接估計 P(L|y),我們本質上是在根據它們如何重疊和沖突來學習標記函數的相對准確性 (注意,我們不需要知道 y!)
我們使用這個估計的生成模型在標簽函數上訓練一個雜訊感知版本的最終判別模型。為了做到這一點,生成模型推斷出訓練數據的未知標簽的概率,然後我們最小化關於這些概率的判別模型的預期損失。
估計這些生成模型的參數可能非常棘手,特別是當使用的標記函數之間存在統計依賴性時。在 Data Programming: Creating Large Training Sets, Quickly(https://arxiv.org/abs/1605.07723) 這篇論文中,我們證明了給定足夠的標記函數的條件下,可以得到與監督方法相同的 asymptotic scaling。我們還研究了如何在不使用標記數據的情況下學習標記函數之間的相關性,以及如何顯著提高性能。
Snorkel:一個開源的框架
在我們最近發表的關於 Snorkel 的論文 (https://arxiv.org/abs/1711.10160) 中,我們發現在各種實際應用中,這種與現代 ML 模型交互的新方法非常有效!包括:
1. 在一個關於 Snorkel 的研討會上,我們進行了一項用戶研究,比較了教 SMEs 使用Snorkel 的效率,以及花同樣的時間進行純手工標記數據的效率。我們發現,使用Snorkel 構建模型不僅快了 2.8 倍,而且平均預測性能也提高了 45.5%。
2. 在與斯坦福大學、美國退伍軍人事務部和美國食品和葯物管理局的研究人員合作的兩個真實的文本關系提取任務,以及其他四個基準文本和圖像任務中,我們發現,與baseline 技術相比,Snorkel 平均提高了 132%。
3. 我們 探索 了如何對用戶提供的標記函數建模的新的權衡空間,從而得到了一個基於規則的優化器,用於加速迭代開發周期。
下一步:大規模多任務弱監管
我們實驗室正在進行各種努力,將 Snorkel 設想的弱監督交互模型擴展到其他模式,如格式豐富的數據和圖像、使用自然語言的監督任務和自動生成標簽函數!
在技術方面,我們感興趣的是擴展 Snorkel 的核心數據編程模型,使其更容易指定具有更高級別介面(如自然語言) 的標記函數,以及結合其他類型的弱監督 (如數據增強)。
多任務學習 (MTL) 場景的普及也引發了這樣一個問題:當嘈雜的、可能相關的標簽源現在要標記多個相關任務時會發生什麼?我們是否可以通過對這些任務進行聯合建模來獲益?我們在一個新的多任務感知版本的 Snorkel,即 Snorkel MeTaL 中解決了這些問題,它可以支持多任務弱監管源,為一個或多個相關任務提供雜訊標簽。
我們考慮的一個例子是設置具有不同粒度的標簽源。例如,假設我們打算訓練一個細粒度的命名實體識別 (NER) 模型來標記特定類型的人和位置,並且我們有一些細粒度的嘈雜標簽,例如標記 「律師」 與 「醫生」,或 「銀行」 與 「醫院」;以及有些是粗粒度的,例如標記 「人」 與 「地點」。通過將這些資源表示為標記不同層次相關的任務,我們可以聯合建模它們的准確性,並重新加權和組合它們的多任務標簽,從而創建更清晰、智能聚合的多任務訓練數據,從而提高最終 MTL 模型的性能。
我們相信,為 MTL 構建數據管理系統最激動人心的方面將圍繞大規模多任務機制(massively multi-task regime),在這種機制中,數十到數百個弱監督 (因而高度動態)的任務以復雜、多樣的方式交互。
雖然迄今為止大多數 MTL 工作都考慮最多處理由靜態手工標記訓練集定義的少數幾項任務,但世界正在迅速發展成組織 (無論是大公司、學術實驗室還是在線社區) 都要維護數以百計的弱監督、快速變化且相互依賴的建模任務。此外,由於這些任務是弱監督的,開發人員可以在數小時或數天內 (而不是數月或數年) 添加、刪除或更改任務 (即訓練集),這可能需要重新訓練整個模型。
在最近的一篇論文 The Role of Massively Multi-Task and Weak Supervision in Software 2.0 (http://cidrdb.org/cidr2019/papers/p58-ratner-cidr19.pdf) 中,我們概述了針對上述問題的一些初步想法,設想了一個大規模的多任務設置,其中 MTL 模型有效地用作一個訓練由不同開發人員弱標記的數據的中央存儲庫,然後組合在一個中央「mother」 多任務模型中。
不管確切的形式因素是什麼,很明顯,MTL 技術在未來有許多令人興奮的進展 —— 不僅是新的模型架構,而且還與遷移學習方法、新的弱監督方法、新的軟體開發和系統範例日益統一。
原文:
https://ai.stanford.e/blog/weak-supervision/
Snorkel:
http://snorkel.stanford.e/
歡迎同時關注微信公眾號: IT 科技 森
每天分享IT小技巧、 科技 數碼新聞!