近年來關注計算機學習的相關算法的用戶越來越多,小編整理了關于左程云:程序員該如何學習算法?,機器學習必學算法??,供您參考
1.左程云:程序員該如何學習算法?
大家好,我是左程云。我本科就讀于華中科技*、碩士畢業(yè)于在芝加哥*。先后在IBM、百度、GrowingIO和亞馬遜工作,是一個刷題7年的算法愛好者,也是??途W(wǎng)的老師。2014年起專職做程序員算法和數(shù)據(jù)結構培訓,代碼面試培訓,刷題交流等相關工作。 我是《程序員代碼面試指南--IT名企算法與數(shù)據(jù)結構題目*解》的作者 ,書籍涉及算法與數(shù)據(jù)結構編程題目240道以上,并且個人實現(xiàn)出*解,大部分題目為面試高頻。這篇我想寫寫算法的重要性、我個人是如何學習算法以及一些如何學習算法的建議。 算法在求職以及工作后的重要性 求職面試必考(校招+社招),且國內工資越高的面試中算法比重就越大。 我分別說一下國內和國外的行情?! ぁ鴥鹊脑?,一般來講,工資高的公司在面試時算法和數(shù)據(jù)結構題目的比重較大,工資一般的公司比重較小。當然同樣公司的不同崗位,要求也會不同,但總體趨勢就是 國內好公司愛考算法和數(shù)據(jù)結構 。這是目前國內互聯(lián)網(wǎng)公司的情況。 國外的互聯(lián)網(wǎng)公司呢,幾乎只考算法和數(shù)據(jù)結構,很多年前就是這樣了,一直如此。我相信國內會逐漸變得像國外一樣,并不是崇洋媚外,而是算法和數(shù)據(jù)結構題目真的能考出東西。先拋開算法,我們來說說面試以及如何準備。面試中都會考什么呢? 面試中會考察算法,操作系統(tǒng),數(shù)據(jù)庫,計算機網(wǎng)絡,編程語言,項目(校招涉及)/經(jīng)歷(社招中涉及的更多)如何準備? · 操作系統(tǒng),數(shù)據(jù)庫,計算機網(wǎng)絡,編程語言這些都是平時學習,記住了,理解了,不忘記就可以了項目或者經(jīng)歷是平時準備的,如果馬上面試了再去準備也是很難的,作假在面試中會直接被面試官看穿,所以這個平時就要準備好,如果是校招,那平時就要做一做有用的項目,如果是社招,平時在工作中就要用心做。 算法和數(shù)據(jù)結構,是真的需要好好寫代碼才能掌握,不是說看了理解了就真正會的了。算法筆試面試的特點就是沒有特點,什么樣的題都可能遇到,因為根本沒有考綱,面試官就是普通的程序員,他們在工作中或者在網(wǎng)絡上遇到什么題不錯,就可能考,所以內容真的太多了,而且也無窮盡。這不是一個標準考試,這是能力考試。 所以,我建議大家面試或者筆試前抽出20%的時間去理解和記憶非算法和數(shù)據(jù)結構的題目,剩下的時間就是去刷題。今天學習算法變得越來越重要,雖然每個公司行業(yè)不同、崗位復雜,但算法能力強是分析能力和解決問題能力的提現(xiàn)。雖然計算機的處理能力越來越強,但好算法的代碼執(zhí)行效率相比起沒有優(yōu)化的代碼,已經(jīng)不能用快多少倍來描述了。計算機科學有自己的衡量標準,也就我們常說的復雜度標準。同時,學習算法對理解底層實現(xiàn)是非常重要的,優(yōu)秀的程序員專注細節(jié)和底層,具備算法能力是起點更是基礎。包括今天很多的領域,比如機器學習,深度學習,還有大熱的AI領域,想要研究透徹,都離不開算法好的大腦。還有很重要的,加薪和跳槽,算法都起著非常重要的作用。學習算法可不僅僅是刷題,這一過程中自己的思維和想法的提升才是學習算法的*好處。我是如何學習算法的? 本科在華中科技*計算機,這一期間能在學業(yè)上讓自己滿意的可能就是沒有掛科而已。碩士在芝加哥*,出國之前就了解到想要在國外找工作的話,面試時幾乎只考算法和數(shù)據(jù)結構的題目,于是開始了刷題,也就是搜集這方面的題,并且用代碼實現(xiàn)出來,不斷看題解和與高手討論。 就這樣從2010年到今天,刷了7年算法和數(shù)據(jù)結構的面試題。剛開始其實只是為了找工作才開始刷題,但是半年之后就變成了興趣。剛開始刷題的過程中很不順利,因為很多算法和數(shù)據(jù)結構,教材也不會講。而且去網(wǎng)上搜各種各樣的分析文章也讀不懂,感覺基礎差的很遠。當時網(wǎng)上的分析文章,也不會像今天這么易懂,高手都是把最核心的點說出來,但是我沒摸到人家想說的點之前,就已經(jīng)不會了。于是就把很多很厚的書拿來啃,書上也看不懂就盡可能的找到高手向人家請教。對書上的題目實現(xiàn)了好幾遍,才發(fā)現(xiàn)入了門,頭腦也開始活泛起來。遇到不會的就查,發(fā)現(xiàn)一大片知識不知道就練。在網(wǎng)上發(fā)帖被嘲笑的日子,其實非常的漲見識,我很珍視那段歲月。當時在國外,學費也貴,因為錢的刺激和好勝心,居然沒有讓我變態(tài),而是變成了一種斗志,用了大量的時間好好刷題。剛開始代碼實現(xiàn)算法和數(shù)據(jù)結構的題目真的非常痛苦,因為這部分的內容相比其他方面的知識絕對算高門檻,而我最開始的基礎也并不好。現(xiàn)在我經(jīng)常在網(wǎng)上給同學們講題,看到同學們表達的抱怨,那簡直就是當年的我。暗暗發(fā)下心愿,如果有一天講課,絕對做一個人人都能聽懂的好老師。但不管怎么引導,算法學習都是一個脫皮換骨的痛苦過程,但好在會迅速上癮,堅持半年之后就能一直堅持下去了。算法和數(shù)據(jù)結構問題的技術累積需要長時間的投入,因為內容又多又雜又難,很多算法是那種你很懷疑自己再來一輩子也可能想不到的解法。當時作為一個小白,一個算法的意思看懂了,實現(xiàn)起來是如此的難,測試用例總能指出我的幼稚;寫了很多代碼終于過了這一題,看到高手寫的實現(xiàn),自己又幻滅了,高手寫的好棒,自己寫的……然后收拾起碎裂一地的三觀,重新出發(fā)。解了很多題目之后,類似的題目出現(xiàn),自己還是會想很久。這讓我意識到,自己缺乏總結,于是開始了總結的過程,也萌生了寫書的沖動。刷完一道題其實是一件很難的事情,因為普通解法很容易,但是*解真得去耐著性子研究好久,去查資料,去做優(yōu)化,這個過程很漫長但是足夠迷人。到底應該怎樣學習算法,作為過來人,給大家的建議 先跟大家聊聊算法吧。在網(wǎng)絡上流行一句話:算法分三種,競賽的算法、面試的算法、算法。雖然我覺得這么分非常讓人無語,但其實可以去這么理解,因為競賽、面試和純理論的要求和限制是不同的,所以算法在不同的要求中展現(xiàn)了不同的樣子。對于競賽來說,每道題對輸入?yún)?shù)和樣本量的要求都是非常明確的,同時規(guī)定的非常明確的還有空間的限制和運行時間的限制。每一個競賽選手都非常熟練怎么根據(jù)這些提前給好的限制,反推出自己需要實現(xiàn)一個什么樣復雜度的解法才能通過。每一行代碼包含著前輩和自己思考過的優(yōu)化。而對于面試來說,限制往往并不明確,造成這個現(xiàn)象的原因也很好理解。競賽中當然是分數(shù)最重要。在面試的過程中,與面試官的交流和體現(xiàn)自己想事情的方式、體現(xiàn)自己邏輯的嚴密更重要。所以同一道題,在競賽中必須寫清楚限制,而在面試中一道題剛開始的限制沒那么多,目的就是縮短你理解題目的時間,讓面試者先寫出一點什么,然后和面試官展開討論,隨著討論的深入,再逐漸的把限制聊清楚??傊诿嬖嚨膱龊暇褪窍肟纯茨阆雴栴}的習慣、軌跡以及表達能力是否符合要求。當然,不管是什么要求下的算法,經(jīng)常練習算法和數(shù)據(jù)結構題目對一個人在邏輯上的提升都是顯而易見的,在學校參加ACM并取得很好成績的同學,如果不是表達能力特別差的話,是一定會收獲很多offer的,因為思維被鍛煉的很好。對于算法,我給大家的建議: 先找到線團,然后進入線團里學著怎么玩。為了進入線團,需要先把基礎知識掌握好。《算法和數(shù)據(jù)結構》(教材),你一定要看完+理解。這里面講的都是不能再基礎的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅持不下來,你后面就受罪去吧。然后有一些很經(jīng)典的書可以迅速讓你進入狀態(tài),比如我這本《程序員代碼面試指南》,還有《劍指offer》,配合在線練習: 對于很龐大的算法,我個人的習慣是找例子來引導自己的思路,一點一點的接近算法的核心。*需要注意的是,一定要寫代碼,光看沒有用的。對于經(jīng)典算法的學習,大體上分成幾個階段:*階段:對于某一個具體的算法,首先要搞清楚這個算法解決的問題是什么,可能是實現(xiàn)一個具體的功能,也可能是在某些方面,比如時間復雜度或者空間復雜度方面很卓越,總之搞清楚這個算法被研究出來的目的是什么。 第二階段:然后就要弄清楚這個算法的生存環(huán)境了,也就是看看你此時研究的東西是不是對別的知識有依賴,應該先把底層依賴的知識理解并掌握。這些問題都解決之后,就進入到算法本身的學習,理解一個算法是一件辛苦的事情,剛開始看必然會產(chǎn)生很多的困惑,比如經(jīng)常會懷疑作者講述的內容的重要性?這些內容和這個算法有什么聯(lián)系呢?經(jīng)常會有這種摸不著頭腦的感覺,其實作者做的鋪墊都是為了建立起描述算法主要內容的基礎,只有接受和理解這些基礎,才能逐漸觸碰到算法的精髓,所以耐心是很重要的。 第三階段:算法的主要過程看完之后,往往還是會感到困惑,主要是不知道這個過程好在哪,這就進入了下一個階段,理解作者對這個過程在功能性或者效率卓越這件事上的解釋和證明。這才真正觸碰到算法最精髓的部分,也就是深度的理解算法的主要過程所帶來的好處,這才是最鍛煉人理解能力的地方。 第四階段:上面幾點是算法學習階段的過程了,接下來就是研究算法的代碼實現(xiàn),自己設計測試用例親自跑一下代碼,以及從代碼運行時間的角度分析這個算法的優(yōu)勢,這也是加深對算法的理解的過程。 第五階段:*是配合相應的題目練習,讓自己通過題目練習的方式,會用、善用學習到的算法,并對這個算法產(chǎn)生一定的敏感程度,具體是指看到某些題目時,能夠根據(jù)題目的特點,產(chǎn)生與該算法的對應,也就是具備舉一反三的能力。 學習永無止境,不管是算法小白,還是有一定的算法基礎,提升算法永遠都是剛需,我正好要在牛客網(wǎng)即將開一個算法班,針對算法小白的初級班和有一定算法基礎的進階班,如果你想跟我一起學習,也歡迎你報名跟我一起探討算法,希望所有努力和上心的人都能成為大牛。課程報名: 初級班: 進階班: 當然,正值雙十一,正好??途W(wǎng)上有個雙十一的活動,這樣買會比較優(yōu)惠:
2.機器學習必學算法
本文介紹了 10 大常用機器學習算法,包括線性回歸、Logistic 回歸、線性判別分析、樸素貝葉斯、KNN、隨機森林等。選自Medium,作者:,機器之心編譯,參與:Geek AI、路。1. 線性回歸在統(tǒng)計學和機器學習領域,線性回歸可能是最廣為人知也最易理解的算法之一。預測建模主要關注的是在犧牲可解釋性的情況下,盡可能最小化模型誤差或做出最準確的預測。我們將借鑒、重用來自許多其它領域的算法(包括統(tǒng)計學)來實現(xiàn)這些目標。線性回歸模型被表示為一個方程式,它為輸入變量找到特定的權重(即系數(shù) B),進而描述一條*擬合了輸入變量(x)和輸出變量(y)之間關系的直線。線性回歸例如: y = B0 + B1 * x我們將在給定輸入值 x 的條件下預測 y,線性回歸學習算法的目的是找到系數(shù) B0 和 B1 的值。我們可以使用不同的技術來從數(shù)據(jù)中學習線性回歸模型,例如普通最小二乘法的線性代數(shù)解和梯度下降優(yōu)化。線性回歸大約有 200 多年的歷史,并已被廣泛地研究。在使用此類技術時,有一些很好的經(jīng)驗規(guī)則:我們可以刪除非常類似(相關)的變量,并盡可能移除數(shù)據(jù)中的噪聲。線性回歸是一種運算速度很快的簡單技術,也是一種適合初學者嘗試的經(jīng)典算法。2. Logistic 回歸Logistic 回歸是機器學習從統(tǒng)計學領域借鑒過來的另一種技術。它是二分類問題的*方法。像線性回歸一樣,Logistic 回歸的目的也是找到每個輸入變量的權重系數(shù)值。但不同的是,Logistic 回歸的輸出預測結果是通過一個叫作「logistic 函數(shù)」的非線性函數(shù)變換而來的。logistic 函數(shù)的形狀看起來像一個大的「S」,它會把任何值轉換至 0-1 的區(qū)間內。這十分有用,因為我們可以把一個規(guī)則應用于 logistic 函數(shù)的輸出,從而得到 0-1 區(qū)間內的捕捉值(例如,將閾值設置為 0.5,則如果函數(shù)值小于 0.5,則輸出值為 1),并預測類別的值。Logistic 回歸由于模型的學習方式,Logistic 回歸的預測結果也可以用作給定數(shù)據(jù)實例屬于類 0 或類 1 的概率。這對于需要為預測結果提供更多理論依據(jù)的問題非常有用。與線性回歸類似,當刪除與輸出變量無關以及彼此之間非常相似(相關)的屬性后,Logistic 回歸的效果更好。該模型學習速度快,對二分類問題十分有效。3. 線性判別分析Logistic 回歸是一種傳統(tǒng)的分類算法,它的使用場景僅限于二分類問題。如果你有兩個以上的類,那么線性判別分析算法(LDA)是*的線性分類技術。LDA 的表示方法非常直接。它包含為每個類計算的數(shù)據(jù)統(tǒng)計屬性。對于單個輸入變量而言,這些屬性包括:每個類的均值。所有類的方差。線性判別分析預測結果是通過計算每個類的判別值、并將類別預測為判別值*的類而得出的。該技術假設數(shù)據(jù)符合高斯分布(鐘形曲線),因此*預先從數(shù)據(jù)中刪除異常值。LDA 是一種簡單而有效的分類預測建模方法。4. 分類和回歸樹決策樹是一類重要的機器學習預測建模算法。決策樹可以被表示為一棵二叉樹。這種二叉樹與算法設計和數(shù)據(jù)結構中的二叉樹是一樣的,沒有什么特別。每個節(jié)點都代表一個輸入變量(x)和一個基于該變量的分叉點(假設該變量是數(shù)值型的)。決策樹決策樹的葉子結點包含一個用于做出預測的輸出變量(y)。預測結果是通過在樹的各個分叉路徑上游走,直到到達一個葉子結點并輸出該葉子結點的類別值而得出。決策樹的學習速度很快,做出預測的速度也很快。它們在大量問題中往往都很準確,而且不需要為數(shù)據(jù)做任何特殊的預處理準備。5. 樸素貝葉斯樸素貝葉斯是一種簡單而強大的預測建模算法。該模型由兩類可直接從訓練數(shù)據(jù)中計算出來的概率組成:1)數(shù)據(jù)屬于每一類的概率;2)給定每個 x 值,數(shù)據(jù)從屬于每個類的條件概率。一旦這兩個概率被計算出來,就可以使用貝葉斯定理,用概率模型對新數(shù)據(jù)進行預測。當你的數(shù)據(jù)是實值的時候,通常假設數(shù)據(jù)符合高斯分布(鐘形曲線),這樣你就可以很容易地估計這些概率。貝葉斯定理樸素貝葉斯之所以被稱為「樸素」,是因為它假設每個輸入變量相互之間是獨立的。這是一種很強的、對于真實數(shù)據(jù)并不現(xiàn)實的假設。不過,該算法在大量的復雜問題中十分有效。6. K 最近鄰算法K 最近鄰(KNN)算法是非常簡單而有效的。KNN 的模型表示就是整個訓練數(shù)據(jù)集。這很簡單吧?對新數(shù)據(jù)點的預測結果是通過在整個訓練集上搜索與該數(shù)據(jù)點最相似的 K 個實例(近鄰)并且總結這 K 個實例的輸出變量而得出的。對于回歸問題來說,預測結果可能就是輸出變量的均值;而對于分類問題來說,預測結果可能是眾數(shù)(或最常見的)的類的值。關鍵之處在于如何判定數(shù)據(jù)實例之間的相似程度。如果你的數(shù)據(jù)特征尺度相同(例如,都以英寸為單位),那么最簡單的度量技術就是使用歐幾里得距離,你可以根據(jù)輸入變量之間的差異直接計算出該值。K 最近鄰KNN 可能需要大量的內存或空間來存儲所有數(shù)據(jù),但只有在需要預測時才實時執(zhí)行計算(或學習)。隨著時間的推移,你還可以更新并管理訓練實例,以保證預測的準確率。使用距離或接近程度的度量方法可能會在維度非常高的情況下(有許多輸入變量)崩潰,這可能會對算法在你的問題上的性能產(chǎn)生負面影響。這就是所謂的維數(shù)災難。這告訴我們,應該僅僅使用那些與預測輸出變量最相關的輸入變量。7. 學習向量量化KNN 算法的一個缺點是,你需要處理整個訓練數(shù)據(jù)集。而學習向量量化算法(LVQ)允許選擇所需訓練實例數(shù)量,并確切地學習這些實例。學習向量量化LVQ 的表示是一組碼本向量。它們在開始時是隨機選擇的,經(jīng)過多輪學習算法的迭代后,最終對訓練數(shù)據(jù)集進行*的總結。通過學習,碼本向量可被用來像 K 最近鄰那樣執(zhí)行預測。通過計算每個碼本向量與新數(shù)據(jù)實例之間的距離,可以找到最相似的鄰居(最匹配的碼本向量)。然后返回最匹配單元的類別值(分類)或實值(回歸)作為預測結果。如果將數(shù)據(jù)重新放縮放到相同的范圍中(例如 0 到 1 之間),就可以獲得*的預測結果。如果你發(fā)現(xiàn) KNN 能夠在你的數(shù)據(jù)集上得到不錯的預測結果,那么不妨試一試 LVQ 技術,它可以減少對內存空間的需求,不需要像 KNN 那樣存儲整個訓練數(shù)據(jù)集。8. 支持向量機支持向量機(SVM)可能是目前*、被討論地最多的機器學習算法之一。超平面是一條對輸入變量空間進行劃分的「直線」。支持向量機會選出一個將輸入變量空間中的點按類(類 0 或類 1)進行*分割的超平面。在二維空間中,你可以把他想象成一條直線,假設所有輸入點都可以被這條直線完全地劃分開來。SVM 學習算法旨在尋找最終通過超平面得到*類別分割的系數(shù)。支持向量機超平面與最近數(shù)據(jù)點之間的距離叫作間隔(margin)。能夠將兩個類分開的*超平面是具有*間隔的直線。只有這些點與超平面的定義和分類器的構建有關,這些點叫作支持向量,它們支持或定義超平面。在實際應用中,人們采用一種優(yōu)化算法來尋找使間隔*化的系數(shù)值。支持向量機可能是目前可以直接使用的最強大的分類器之一,值得你在自己的數(shù)據(jù)集上試一試。9. 袋裝法和隨機森林隨機森林是*也最強大的機器學習算法之一,它是一種集成機器學習算法。自助法是一種從數(shù)據(jù)樣本中估計某個量(例如平均值)的強大統(tǒng)計學方法。你需要在數(shù)據(jù)中取出大量的樣本,計算均值,然后對每次取樣計算出的均值再取平均,從而得到對所有數(shù)據(jù)的真實均值更好的估計。Bagging 使用了相同的方法。但是最常見的做法是使用決策樹,而不是對整個統(tǒng)計模型進行估計。Bagging 會在訓練數(shù)據(jù)中取多個樣本,然后為每個數(shù)據(jù)樣本構建模型。當你需要對新數(shù)據(jù)進行預測時,每個模型都會產(chǎn)生一個預測結果,Bagging 會對所有模型的預測結果取平均,以便更好地估計真實的輸出值。隨機森林隨機森林是這種方法的改進,它會創(chuàng)建決策樹,這樣就不用選擇*分割點,而是通過引入隨機性來進行次優(yōu)分割。因此,為每個數(shù)據(jù)樣本創(chuàng)建的模型比在其它情況下創(chuàng)建的模型更加獨特,但是這種獨特的方式仍能保證較高的準確率。結合它們的預測結果可以更好地估計真實的輸出值。如果你使用具有高方差的算法(例如決策樹)獲得了良好的結果,那么你通??梢酝ㄟ^對該算法執(zhí)行 Bagging 獲得更好的結果。10. Boosting 和 是一種試圖利用大量弱分類器創(chuàng)建一個強分類器的集成技術。要實現(xiàn) Boosting 方法,首先你需要利用訓練數(shù)據(jù)構建一個模型,然后創(chuàng)建第二個模型(它企圖修正*個模型的誤差)。直到*模型能夠對訓練集進行完美地預測或加入的模型數(shù)量已達上限,我們才停止加入新的模型。AdaBoost 是*個為二分類問題開發(fā)的真正成功的 Boosting 算法。它是人們入門理解 Boosting 的*起點。當下的 Boosting 方法建立在 AdaBoost 基礎之上,最著名的就是隨機梯度提升機。 使用淺層決策樹。在創(chuàng)建*棵樹之后,使用該樹在每個訓練實例上的性能來衡量下一棵樹應該對每個訓練實例賦予多少權重。難以預測的訓練數(shù)據(jù)權重會增大,而易于預測的實例權重會減小。模型是一個接一個依次創(chuàng)建的,每個模型都會更新訓練實例權重,影響序列中下一棵樹的學習。在構建所有的樹之后,我們就可以對新的數(shù)據(jù)執(zhí)行預測,并根據(jù)每棵樹在訓練數(shù)據(jù)上的準確率來對其性能進行加權。由于算法在糾正錯誤上投入了如此多的精力,因此刪除數(shù)據(jù)中的異常值在數(shù)據(jù)清洗過程中是非常重要的。原文鏈接:
如果以上內容沒有幫到您,歡迎電話聯(lián)系我們,或者聯(lián)系在線客服咨詢