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