典機器學(xué)習(xí)算法代碼庫解析)
簡介《集體智慧編程》是一本經(jīng)典的機器學(xué)習(xí)與數(shù)據(jù)挖掘入門書籍。這份配套資源收錄了基于 Python 3.6 重新編寫的代碼和數(shù)據(jù)集適合正在閱讀原書、想要動手實踐推薦算法、聚類分析、搜索排序等章節(jié)的 Python 學(xué)習(xí)者。壓縮包中一共有 107 個文件大小約為 14.52MB其中主要包含 38 個 Python 腳本、8 個 Jupyter 筆記本以及文本、CSV、數(shù)據(jù)庫等數(shù)據(jù)文件腳本部分對應(yīng)書中各個核心算法的實現(xiàn)筆記本適合邊看邊運行數(shù)據(jù)文件則是案例中所需要的原始輸入。目前已有 244 人學(xué)習(xí)或下載可以配合原書按章節(jié)逐步進行驗證。資源中還保留了多份經(jīng)典評分與匹配數(shù)據(jù)集能夠直接用于電影推薦、相似性匹配等實驗?zāi)夸浗Y(jié)構(gòu)非常清晰README 和 Markdown 說明可以幫助快速定位代碼節(jié)省自己整理數(shù)據(jù)的時間把更多精力放在理解算法原理和運行結(jié)果上。 《集體智慧編程》這本書在我的技術(shù)書架上是少數(shù)幾本“賣了又買、買了還舍不得賣”的經(jīng)典。它在機器學(xué)習(xí)還沒像今天這么“卷”的時候就把推薦系統(tǒng)、聚類、搜索排序這些聽著唬人的概念用最樸素的Python代碼攤開在讀者面前。我這次整理的這套基于Python 3.6的代碼和數(shù)據(jù)集Programming-Collective就是當(dāng)年一邊啃書一邊手工重寫、后來又在實際項目中反復(fù)翻用的成果。很多人看這本書最大的攔路虎是原版代碼停留在Python 2的時代print是語句而不是函數(shù)字典遍歷順序不確定還有一堆Unicode編碼的暗坑。我做的這件事本質(zhì)上就是“掃雷式”地重寫全部代碼不改變原書的算法邏輯和參數(shù)設(shè)定只把語法遷移到Python 3.6并把網(wǎng)盤里散落的數(shù)據(jù)集歸好類、整理成可以直接喂給代碼的格式。這套資源適合誰剛?cè)腴T機器學(xué)習(xí)、想理解算法底層原理的自學(xué)者備賽數(shù)據(jù)科學(xué)崗、需要快速梳理經(jīng)典算法實現(xiàn)的求職者以及在真實項目中想避開重復(fù)踩坑的開發(fā)者——都可以在這套代碼里找到自己想要的東西。整件事做下來最有價值的其實不是“代碼能跑了”這個結(jié)果而是過程中對每個算法實現(xiàn)細(xì)節(jié)的反復(fù)推敲。這篇文章我打算從書的內(nèi)容結(jié)構(gòu)、代碼庫設(shè)計思路、數(shù)據(jù)集的坑、環(huán)境搭建、遷移避坑幾個維度把整套東西講透希望能給你省下實實在在的幾周時間。1. 這本書的技術(shù)脈絡(luò)與代碼重寫的價值《集體智慧編程》全書的組織結(jié)構(gòu)是典型的“每章一個獨立算法模塊”從協(xié)同過濾推薦開始逐步過渡到聚類、搜索排序、決策樹、神經(jīng)網(wǎng)絡(luò)、支持向量機等經(jīng)典方法最后以核方法和股票預(yù)測收尾。這本書最大的特點是不堆數(shù)學(xué)公式而是用幾百行Python把每個算法的來龍去脈交代得一清二楚。1.1 從推薦系統(tǒng)到核方法各章節(jié)解決的問題第二章講協(xié)同過濾通過用戶對物品的評分?jǐn)?shù)據(jù)用歐氏距離和皮爾遜相關(guān)系數(shù)計算用戶相似度實現(xiàn)“看了還看”“買了還買”的推薦邏輯這是整本書最容易被理解也最實用的一章。第三到四章是聚類從層次聚類到KMeans用博客訂閱源的數(shù)據(jù)集把相似用戶或文章自動分組。第五章是搜索排序核心是倒排索引和PageRank的思想在垂直搜索場景下的應(yīng)用第六章則引入了貝葉斯分類器解決垃圾信息過濾的問題。第七章決策樹建模把“是否點擊廣告”這類分類問題轉(zhuǎn)化為樹形規(guī)則可解釋性極強。第八章是數(shù)值預(yù)測基于線性回歸和核平滑方法適合類似房價預(yù)測的場景。第九到十章是支持向量機和神經(jīng)網(wǎng)絡(luò)雖然代碼實現(xiàn)相對簡潔但概念密度很高值得反復(fù)咀嚼。第十一章引入核方法進一步拓寬了SVM的應(yīng)用邊界最后一章是股票預(yù)測案例把前面所有技術(shù)串聯(lián)起來。1.2 為什么必須做Python 3.6遷移原書的代碼大多是基于Python 2.x語法這在2010年左右完全沒問題但放到今天基本跑不動。Python 2到3的核心差異說大不大說小不小真正動手改的時候才會發(fā)現(xiàn)一個個坑print關(guān)鍵字變成函數(shù)、dict的keys()方法從列表變成視圖對象、reduce被移動到functools模塊、異常捕獲語法變化等。最煩人的其實是Unicode處理。原書在讀取數(shù)據(jù)文件時習(xí)慣用普通字符串處理在Python 2里只要不碰到特殊字符就相安無事Python 3里則常常出現(xiàn)編碼轉(zhuǎn)換錯誤。我統(tǒng)一在代碼入口處用utf-8編碼打開文件并將所有文件讀取操作封裝成工具函數(shù)這樣后續(xù)再往代碼里加數(shù)據(jù)文件只需要調(diào)用這一層封裝不必每次處理編碼的臟活累活。原作者寫代碼時的風(fēng)格非常簡潔有些變量命名隨意、邏輯壓縮在一行里。我在保持算法思路一致的前提下適當(dāng)補充了注釋尤其是每個函數(shù)輸入輸出說明和核心算法的關(guān)鍵步驟解釋。不過我沒有做大規(guī)模的“重構(gòu)式”改名因為那樣會讓對照原書閱讀的體驗變差讀者要的是算法邏輯原汁原味而不是一個面目全非的新程序。1.3 重寫后代碼庫的適用人群與場景這套代碼不是工業(yè)級的工程代碼沒有復(fù)雜的類繼承和設(shè)計模式但它非常適合做算法入門和基礎(chǔ)面試準(zhǔn)備。如果你正在準(zhǔn)備推薦算法、搜索排序相關(guān)的面試把第二章的協(xié)同過濾和第五章的PageRank代碼吃透比背十篇面試總結(jié)都管用。另外有一類人群也很適合工作中需要做算法POC概念驗證的工程師。我經(jīng)常遇到的情況是一個功能用scikit-learn一行搞定但領(lǐng)導(dǎo)想知道“這個效果的底層邏輯是什么”這時候翻開這本書對應(yīng)的章節(jié)用這套代碼跑一遍馬上就能講清楚原理和實現(xiàn)邊界。我自己曾經(jīng)在做一個垂直搜索排序優(yōu)化項目時就是用第五章的倒排索引代碼當(dāng)成基準(zhǔn)(baseline)對比快速驗證了新排序方案的提效空間。2. 代碼庫設(shè)計與模塊規(guī)劃整個項目我按照原書的章節(jié)結(jié)構(gòu)劃分目錄一個章節(jié)一個文件夾每個文件夾都包含可獨立運行的Python文件和對應(yīng)的數(shù)據(jù)文件。這樣的組織方式有幾個明顯的好處可以按章節(jié)順序?qū)W習(xí)也可以直接跳到感興趣的算法每個模塊不依賴其他章節(jié)的代碼減少環(huán)境配置的復(fù)雜程度數(shù)據(jù)文件跟著章節(jié)走避免找數(shù)據(jù)的額外成本。2.1 各章節(jié)代碼模塊的功能劃分以下是代碼庫的核心目錄結(jié)構(gòu)和主要模塊chapter2推薦系統(tǒng)recommendations.py、data/評分?jǐn)?shù)據(jù)集chapter3聚類clusters.py、data/博客訂閱源數(shù)據(jù)chapter4搜索與排名search.py、data/網(wǎng)頁索引數(shù)據(jù)chapter5優(yōu)化optimization.py、data/航班數(shù)據(jù)與偏好數(shù)據(jù)chapter6文檔過濾docfilter.py、data/垃圾郵件數(shù)據(jù)集chapter7決策樹treepredict.py、data/用戶行為數(shù)據(jù)集chapter8數(shù)值預(yù)測numpredict.py、data/葡萄酒價格數(shù)據(jù)集chapter9SVMsvm.py、data/分類測試數(shù)據(jù)chapter10神經(jīng)網(wǎng)絡(luò)neuralnet.py、data/手寫數(shù)字和圖像數(shù)據(jù)chapter11核方法kernel.py、data/測試數(shù)據(jù)chapter12股票預(yù)測stock.py、data/歷史股價數(shù)據(jù)每個模塊我都保留了一段與書籍代碼聯(lián)動的測試代碼通常在文件末尾的main函數(shù)中這樣運行單個文件就能看到結(jié)果不必額外編寫測試腳本。例如chapter2的recommendations.py里不僅有核心的sim_distance和sim_pearson函數(shù)還包含獲取推薦函數(shù)getRecommendations可以直接對內(nèi)置數(shù)據(jù)集進行驗證。2.2 代碼風(fēng)格與兼容性設(shè)計策略因為這本書的定位是算法原理解析代碼質(zhì)量的第一優(yōu)先級不是性能或者極致工程化而是可讀性和與正文描述的對應(yīng)關(guān)系。我在重寫過程中遵循了幾條原則保證這套代碼既能跑通又不失去“教學(xué)代碼”的初心。一是保留原有的函數(shù)名和變量名比如recommendations.py里的critics字典、clusters.py里的pearson距離計算函數(shù)確保讀者對照原書可以輕松定位代碼位置。二是所有Python 2特有的語法糖會做等價替換比如用列表推導(dǎo)替代局部的filter和map但算法主體不用過度“Pythonic”的重寫避免引入新bug。三是統(tǒng)一處理輸入輸出編碼。我在代碼庫根目錄放了一個common.py工具模塊封裝了文件讀取、數(shù)據(jù)清洗和結(jié)果輸出三個常用函數(shù)。所有章節(jié)的代碼在讀取數(shù)據(jù)文件時都統(tǒng)一調(diào)用這個模塊的方法好處是只要有數(shù)據(jù)文件出現(xiàn)編碼問題只需改動一個地方不用逐個文件打補丁。四是Python版本限制問題。代碼基于Python 3.6因此可以使用f-string、dataclasses這些新特性但這套代碼的閱讀對象有很多初學(xué)者我盡量少用過于“高級”的語法保持代碼的普適性。實際驗證發(fā)現(xiàn)除了依賴第三方庫比如numpy和matplotlib的章節(jié)大部分代碼可以直接在Python 3.10以上的高版本跑通沒有明顯的兼容性問題。2.3 依賴管理與虛擬環(huán)境配置建議項目依賴的主要Python庫包括numpy、matplotlib、PIL和BeautifulSoup4。numpy用在聚類和數(shù)值計算章節(jié)matplotlib用在可視化聚類樹和繪制測試結(jié)果PIL是實現(xiàn)神經(jīng)網(wǎng)絡(luò)章節(jié)圖像數(shù)據(jù)讀取的基礎(chǔ)BeautifulSoup4則用于第四章搜索功能中抓取網(wǎng)頁的預(yù)處理。我不建議把依賴包直接裝進系統(tǒng)全局環(huán)境比較容易出現(xiàn)包版本沖突。推薦用venv創(chuàng)建一個項目獨立的虛擬環(huán)境然后安裝一個包含所有依賴的requirements.txt。具體的安裝命令在第三節(jié)會有詳細(xì)說明這里先給一個關(guān)鍵的提醒如果你的網(wǎng)絡(luò)環(huán)境安裝第三方庫很慢可以臨時切換為國內(nèi)的鏡像源但生產(chǎn)環(huán)境建議還是用官方源以保證包的完整性。3. 數(shù)據(jù)集的獲取、格式與使用說明《集體智慧編程》每一章節(jié)都配套了相應(yīng)的數(shù)據(jù)集這些數(shù)據(jù)有些是原書作者從公開數(shù)據(jù)源整理的有些是示例用途的模擬數(shù)據(jù)但它們的格式都不太一樣有純文本格式的有帶表頭的CSV格式還有特殊的JSON格式。在重寫代碼時我把這些數(shù)據(jù)全部轉(zhuǎn)成了統(tǒng)一的、容易解析的格式并重新整理了數(shù)據(jù)目錄讓初學(xué)者可以直接把數(shù)據(jù)集拿來練習(xí)。3.1 關(guān)鍵數(shù)據(jù)文件與格式解析各章節(jié)數(shù)據(jù)格式差異比較大這里先做一個整體說明避免在運行代碼時因為格式不了解而導(dǎo)致報錯。第二章的評分?jǐn)?shù)據(jù)是Python字典的字面量格式這是最簡單的一種直接用賦值即可不需要文件解析。第三章的博客訂閱源數(shù)據(jù)是三個文本文件每行代表一篇文章的詞頻統(tǒng)計格式為“標(biāo)題單詞”詞與詞之間用空格分隔這部分?jǐn)?shù)據(jù)在做聚類之前需要預(yù)先解析成向量。第四章的搜索數(shù)據(jù)是html目錄下的多個網(wǎng)頁文件代碼會讀取網(wǎng)頁內(nèi)容建立索引所以數(shù)據(jù)文件本身沒有統(tǒng)一的文本格式。第六章的文檔過濾數(shù)據(jù)是多個文本文件分為正常郵件和垃圾郵件兩個目錄每個文件對應(yīng)一封郵件的正文內(nèi)容。第十二章的股票數(shù)據(jù)是從雅虎財經(jīng)下載的歷史價格數(shù)據(jù)格式是標(biāo)準(zhǔn)的CSV列分別為日期、開盤價、最高價、最低價、收盤價和成交量代碼可直接讀取。我在整理數(shù)據(jù)時做了兩件事一是確保每個數(shù)據(jù)文件的編碼統(tǒng)一為utf-8避免Windows平臺和Mac平臺間的亂碼問題二是對缺失的股票數(shù)據(jù)做了簡單的過濾刪除異常行和全部為空的行確保后續(xù)數(shù)值計算不會因為空值報錯。另外如果讀者想擴充自己的數(shù)據(jù)集完全可以替換這些數(shù)據(jù)文件只需要保持同樣的格式就能跑通算法這也是我改進過的代碼相比原版更方便的方面之一。建議讀者在第一次運行代碼時先通過print(len(data))之類的語句查看一下數(shù)據(jù)長度確保數(shù)據(jù)被正確加載再進行后續(xù)訓(xùn)練這樣可以很快地區(qū)分“代碼問題”和“數(shù)據(jù)問題”提高排查效率。3.2 數(shù)據(jù)清洗與預(yù)處理的優(yōu)化細(xì)節(jié)對于非結(jié)構(gòu)化的數(shù)據(jù)原書大致采用正則表達(dá)式和分詞方式提取特征。我在實現(xiàn)時在中文場景下做了個小調(diào)整由于原書的數(shù)據(jù)集是英文文本如果后續(xù)有中文需求直接套用原書的分詞邏輯可能會出問題比如英文按空格分隔、中文卻需要按詞語切分。鑒于這本書面向的是算法邏輯本身我沒有額外加入中文分詞功能而是把這個擴展作為讀者練習(xí)的一部分如果你真的需要處理中文文本直接在文件讀取階段換成jieba分詞其他邏輯都可以復(fù)用。對于數(shù)值型數(shù)據(jù)比如葡萄酒價格數(shù)據(jù)集和股票數(shù)據(jù)原書中已經(jīng)做了歸一化處理。我在整理過程中進一步檢查了數(shù)據(jù)的分布情況發(fā)現(xiàn)個別特征存在異常高的離群值比如年份字段不小心被讀成了當(dāng)前的年份。這類異常通常會導(dǎo)致預(yù)測結(jié)果嚴(yán)重偏離建議在學(xué)習(xí)到第八章數(shù)值預(yù)測、第十二章股票預(yù)測時先打印出數(shù)據(jù)的基本統(tǒng)計信息比如最大值、最小值和均值確保數(shù)據(jù)質(zhì)量再做后續(xù)操作。這也是實際項目中做特征工程的第一步養(yǎng)成習(xí)慣會很有幫助。3.3 數(shù)據(jù)集使用的常見誤區(qū)有些讀者可能會在數(shù)據(jù)集使用上進入幾個誤區(qū)。第一個誤區(qū)是直接拿原書的數(shù)據(jù)集去跑現(xiàn)代的深度學(xué)習(xí)模型這完全沒有必要原書的數(shù)據(jù)規(guī)模很小是為理解算法原理服務(wù)的并不適合直接作為深度學(xué)習(xí)benchmark。第二個誤區(qū)是試圖在Anaconda的環(huán)境里直接import book的數(shù)據(jù)模塊而忽略相對路徑問題這個在第五節(jié)會詳細(xì)說明這里先提醒一下運行代碼前需要先在終端中進入對應(yīng)的章節(jié)文件夾。其次關(guān)于原書中的部分?jǐn)?shù)據(jù)來自動態(tài)網(wǎng)頁抓取比如第四章的搜索索引數(shù)據(jù)如果找不全代碼可能會報錯“找不到文件”。我整理的版本包含了完整的示例網(wǎng)頁數(shù)據(jù)即使處于無網(wǎng)環(huán)境也可以直接跑代碼這一點請放心。如果有讀者希望更新或擴充數(shù)據(jù)建議保留原始數(shù)據(jù)的文件名否則需要同步修改代碼中的數(shù)據(jù)加載路徑。4. Python 3.6環(huán)境搭建與實操運行4.1 虛擬環(huán)境創(chuàng)建與依賴安裝我以macOS/Linux環(huán)境為例Windows平臺的操作本質(zhì)一樣只是激活虛擬環(huán)境的命令有所不同。打開終端進入代碼庫目錄執(zhí)行以下命令創(chuàng)建并激活虛擬環(huán)境cd Programming-Collective python3.6 -m venv venv source venv/bin/activate # Windows下為 venv\Scripts\activate pip install --upgrade pip pip install -r requirements.txt如果本機沒有安裝Python 3.6建議通過pyenv或conda來安裝對應(yīng)版本。因為你只是運行教學(xué)代碼Python版本不必要求非常嚴(yán)格實測Python 3.7到3.10的大部分代碼也能正常運行只是f-string語法需要Python 3.6以上所以低于3.6就不建議了。4.2 各章節(jié)目錄下的運行示例依賴裝完之后直接進入某一章節(jié)的文件夾運行對應(yīng)腳本即可。以協(xié)同過濾為例cd chapter2 python recommendations.py正常情況下你應(yīng)該會看到針對用戶“Toby”的推薦結(jié)果輸出。我在這里加了一個小的演示函數(shù)運行后除了打印推薦結(jié)果還會打印出與Toby最相似的兩個用戶及其相似度分?jǐn)?shù)方便初學(xué)者觀察協(xié)同過濾的中間過程。其他章節(jié)的運行方式一樣只需修改文件夾和文件名。對于會在屏幕輸出圖片的章節(jié)比如第三章的聚類樹狀圖和第九章的SVM分類結(jié)果請確保運行環(huán)境支持圖形界面顯示。如果你用的是純命令行的服務(wù)器可以將matplotlib的backend切換為Agg或者在代碼中把圖片保存到本地文件這一點在代碼注釋中有注明。4.3 運行過程中遇到常見依賴問題的快修方案實測中最容易遇到的問題有兩個一是提示缺少PIL模塊這是歷史遺留問題曾經(jīng)的包名是PIL現(xiàn)在則統(tǒng)一用Pillow代替。安裝方法很簡單直接執(zhí)行pip install pillow即可。二是matplotlib中文顯示亂碼這個問題在本書代碼中其實不太會出現(xiàn)因為原書案例基本都是英文標(biāo)簽但如果讀者在做自己的數(shù)據(jù)時需要顯示中文標(biāo)題需要額外配置中文字體否則會變成方塊。我更想強調(diào)的是一個容易被忽略的細(xì)節(jié)確保當(dāng)前的工作目錄是在對應(yīng)的章節(jié)文件夾內(nèi)。不少初學(xué)者把代碼文件放在Programming-Collective根目錄下直接運行然后報錯“找不到數(shù)據(jù)文件”。這不是代碼的問題而是相對路徑的問題。解決方法是先cd到章節(jié)目錄再運行腳本或者代碼內(nèi)部用os.path.dirname(os.path.abspath(file))獲取腳本所在目錄實現(xiàn)路徑無關(guān)化加載我提供的版本已經(jīng)統(tǒng)一用后者處理。5. 常見問題與排查技巧實錄5.1 代碼遷移中典型的Python 2到3的坑我在重寫這套代碼時統(tǒng)計了一下最常見的報錯類型其中一大半來自Python 2到3的語法變化。比如print函數(shù)報錯Python 2中print hello在Python 3中會直接語法錯誤需要在字符串外面加括號。這大概是最容易排查也最容易修復(fù)的問題。更深一點的坑在于字典的遍歷順序。Python 3.7開始字典保持了插入順序但Python 3.6還屬于實現(xiàn)細(xì)節(jié)如果在代碼中對字典先插入再遍歷邏輯一般是穩(wěn)定的但如果要跨字典按鍵排序建議明確使用sorted(dict.items())不要依賴解釋器行為。原書代碼中有些位置為了解決“每次結(jié)果不一樣”的問題把數(shù)據(jù)轉(zhuǎn)成了set再遍歷這會導(dǎo)致結(jié)果順序不可預(yù)測我在重寫時統(tǒng)一改為list排序保證結(jié)果可復(fù)現(xiàn)。5.2 數(shù)據(jù)文件缺失或損壞時的排查流程遇到“文件不存在”或“數(shù)據(jù)為空”的報錯建議按照四個步驟排查第一步檢查文件路徑是否在正確的目錄下第二步檢查文件大小是否合理如果文件大小為0或者異常小大概率是下載或者同步出了問題第三步用文本編輯器打開文件查看首行數(shù)據(jù)內(nèi)容是否符合預(yù)期格式第四步檢查是否因為文件開頭包含BOMByte Order Mark導(dǎo)致首列數(shù)據(jù)被讀入了不可見字符這個問題在Windows平臺用記事本保存CSV時特別常見直接在代碼讀取時補充encodingutf-8-sig就可以解決。在數(shù)據(jù)預(yù)處理環(huán)節(jié)如果報“l(fā)ist index out of range”的錯誤不管是Python列表還是numpy數(shù)組大概率是讀取的數(shù)據(jù)行中有空行或者列數(shù)不一致。建議在讀取數(shù)據(jù)的循環(huán)中增加if len(row) expected_cols這樣的判斷把不符合規(guī)則的行打印出來這樣你能快速定位到具體是哪一行數(shù)據(jù)異常然后手動修復(fù)。5.3 實操心得三個值得反復(fù)調(diào)試的算法在我的學(xué)習(xí)經(jīng)歷里有三個代碼實現(xiàn)是值得反復(fù)運行和打斷點調(diào)試的即使在今天看來依然收獲巨大。第一個是第三章的層次聚類代碼。它用字典構(gòu)建聚類樹遞歸生成樹狀圖代碼量雖小但數(shù)據(jù)結(jié)構(gòu)很精妙理解了它你對遞歸和字典在算法中的應(yīng)用就上了一層臺階。我在代碼中加入了一些打印語句每次合并兩個聚類時都會輸出是哪兩個聚類、距離是多少配合matplotlib畫出的樹狀圖靠這個可視化反饋能非常直觀理解層次聚類的合并邏輯。第二個是第七章的決策樹代碼。原書實現(xiàn)了信息熵、基尼不純度兩種分支標(biāo)準(zhǔn)又用遞歸的方式生成樹結(jié)構(gòu)最終展示可讀性很好的規(guī)則樹。這段代碼是學(xué)習(xí)樹形模型最好的起點比sklearn的DecisionTreeClassifier可視化更容易“長”在腦子里因為它每一步都顯式地暴露了規(guī)則的選擇過程。我在實現(xiàn)時補充了print樹葉節(jié)點規(guī)則的邏輯每一步都可見可懂。第三個是第九章的支持向量機代碼。這里用的是簡化的SMO序列最小優(yōu)化算法細(xì)節(jié)很多初看很容易繞進去但只要把坐標(biāo)上升和KKT條件梳理清楚整個算法就不再神秘。我的代碼里包含了每次迭代參數(shù)變化的打印信息可以幫助讀者理解SVM訓(xùn)練過程中目標(biāo)函數(shù)是如何一步步下降的。這三個算法花一個周末吃透比啃三周機器學(xué)習(xí)理論更有效這也是我屢次推薦這本書的一個深層原因。5.4 擴展建議從示例代碼到實際項目如果把這套書里的代碼學(xué)扎實了下一步可以把它當(dāng)成自己的“算法工具箱”。我曾經(jīng)用第二章的協(xié)同過濾做電視節(jié)目推薦性能雖比不上深度的推薦模型但做冷啟動階段的baseline非常合適用第四章的搜索排序做企業(yè)內(nèi)部文檔檢索幾百篇文檔的規(guī)模完全夠用使用第八章的數(shù)值預(yù)測算法做商品價格的趨勢判斷在數(shù)據(jù)量幾千的場景下精度也可接受。學(xué)算法不應(yīng)只停留在看完、跑通而是嘗試替換成自己的數(shù)據(jù)和場景讓這些代碼在職場上真正產(chǎn)生價值。有一點必須說明這本書本身的年代決定了它沒有涉及深度學(xué)習(xí)、大規(guī)模分布式訓(xùn)練這些現(xiàn)代概念如果你希望用它來了解目前如火如荼的大型語言模型那并不是合適的教材。但正因為它的算法足夠底層一旦掌握了這些基礎(chǔ)后續(xù)理解更復(fù)雜的模型通常會順手得多。最后這套代碼和數(shù)據(jù)集的完整內(nèi)容我建議你下載后先用兩天時間老老實實把前三個章節(jié)跑通在此基礎(chǔ)上再決定是否需要深入后期章節(jié)。如果你在運行過程中遇到問題很有可能也是我踩過的坑先檢查編碼、再檢查路徑、最后檢查代碼版本大概率能解決絕大多數(shù)問題。本文還有配套的精品資源點擊獲取