https://m.toutiao.com/is/e6YgxXQ/
數(shù)學(xué)對我們每一個程序員來說,都是最熟悉的陌生人。你從小就開始學(xué)習(xí)數(shù)學(xué),那些熟悉的數(shù)學(xué)定理和公式陪伴你走過好多年。但是,自從當(dāng)了程序員,你可能早就將數(shù)學(xué)拋在了腦后。
數(shù)學(xué)學(xué)得好不好將會直接決定一個程序員有沒有發(fā)展?jié)摿?。往大了說,數(shù)學(xué)是一種思維模式,考驗的是一個人歸納、總結(jié)和抽象的能力。將這個能力放到程序員的世界里,其實就是解決問題的能力。往小了說,不管是數(shù)據(jù)結(jié)構(gòu)與算法還是程序設(shè)計,其實底層很多原理或者思路都源自數(shù)學(xué),所以很多大公司在招人時也會優(yōu)先考慮數(shù)學(xué)專業(yè)的畢業(yè)生,因為這些人的數(shù)學(xué)基礎(chǔ)很好,學(xué)起編程來也容易上手。
如果編程語言是血肉,那么數(shù)學(xué)的思想和知識就是靈魂。它可以幫助你選擇合適的數(shù)據(jù)結(jié)構(gòu)和算法,提升系統(tǒng)效率,并且賦予機(jī)器智慧。在大數(shù)據(jù)和智能化的時代更是如此。舉個例子,我們在小學(xué)就學(xué)過的余數(shù),其實在編程的世界里也有很多應(yīng)用。你經(jīng)常用到的分頁功能,根據(jù)記錄的總條數(shù)和每頁展示的條數(shù)來計算整體的頁數(shù),這里面就有余數(shù)的思想。再難一點,奇偶校驗、循環(huán)冗余檢驗、散列函數(shù)、密碼學(xué)等都有余數(shù)相關(guān)的知識。遇到這些問題的時候,你能說你不懂余數(shù)嗎?我想你肯定懂,只是很多時候沒有想到可以用余數(shù)的思想來解決相關(guān)問題罷了。
按照這樣的講解路線,既能讓你鞏固基礎(chǔ)的概念和知識,同時又能讓你明白這些基礎(chǔ)性的內(nèi)容,對計算機(jī)編程和算法究竟意味著什么。不過話又說回來,我認(rèn)為數(shù)學(xué)理論和編程實踐的結(jié)合其實是“決裂”的,所以學(xué)習(xí)數(shù)學(xué)的時候,你不能太功利,覺得今天學(xué)完明天就能用得著,我覺得這個學(xué)習(xí)思路可以用在其他課程中,但放在數(shù)學(xué)里絕對不合適。因為數(shù)學(xué)知識總是比較抽象,特別是概率統(tǒng)計和線性代數(shù)中的概率、數(shù)據(jù)分布、矩陣、向量等概念。它們真的很不好理解,需要我們花時間琢磨,但是對高級一點的程序設(shè)計而言,特別是和數(shù)據(jù)相關(guān)的算法,這些概念就非常重要了,它們都是前人總結(jié)出來的經(jīng)驗。
如果你能夠?qū)⑦@些基本概念和核心理論都搞懂、搞透,那么面對系統(tǒng)框架設(shè)計、性能優(yōu)化、準(zhǔn)確率提升這些難題的時候,你就能從更高的角度出發(fā)去解決問題,而不只是站在一個“熟練工”的視角,去增刪改查。最后,我希望數(shù)學(xué)能夠成為你的一種基礎(chǔ)能力,希望這本書能幫你用數(shù)學(xué)思維來分析問題和解決問題。數(shù)學(xué)思想是啟發(fā)我們思維的中樞,如果你對數(shù)學(xué)有更好的理解,遇到問題的時候就能追本溯源,快、準(zhǔn)、穩(wěn)地找到解決方案。伽利略曾經(jīng)說過,“宇宙這本書是用數(shù)學(xué)語言寫成的”,數(shù)學(xué)是人類科學(xué)進(jìn)步的重要基礎(chǔ),所以,你我都要懷著敬畏之心去學(xué)習(xí)、思考數(shù)學(xué)。編程的世界遠(yuǎn)不止條件和循環(huán)語句,程序員的人生應(yīng)當(dāng)是創(chuàng)造的舞臺。最后,我希望,通過這本書的學(xué)習(xí),能夠讓你切實感受到數(shù)學(xué)這個古老學(xué)科的活力和魅力。
第 一篇 基礎(chǔ)思想1
第 1章 二進(jìn)制、余數(shù)和布爾代數(shù)2
1.1 二進(jìn)制2
1.1.1 二進(jìn)制計數(shù)法2
1.1.2 二進(jìn)制的位操作3
1.1.3 負(fù)數(shù)的二進(jìn)制表示11
1.2 余數(shù)15
1.2.1 求余和同余定理15
1.2.2 哈希16
1.2.3 奇偶校驗17
1.2.4 交叉驗證19
1.3 布爾代數(shù)19
1.3.1 邏輯19
1.3.2 集合23
第 2章 迭代、數(shù)學(xué)歸納和遞歸30
2.1 迭代法30
2.1.1 迭代法簡介30
2.1.2 迭代法的應(yīng)用31
2.2 數(shù)學(xué)歸納法37
2.3 遞歸41
2.3.1 從數(shù)學(xué)歸納法到遞歸42
2.3.2 分而治之44
2.4 迭代法、數(shù)學(xué)歸納法和遞歸的關(guān)聯(lián)56
第3章 排列、組合和動態(tài)規(guī)劃58
3.1 排列58
3.2 組合62
3.3 動態(tài)規(guī)劃65
3.3.1 編輯距離66
3.3.2 狀態(tài)轉(zhuǎn)移67
3.3.3 狀態(tài)轉(zhuǎn)移方程和編程實現(xiàn)70
3.3.4 動態(tài)規(guī)劃解決最優(yōu)組合72
第4章 樹和圖74
4.1 圖和樹的概念74
4.2 樹的常見應(yīng)用77
4.2.1 WordNet中的關(guān)聯(lián)詞77
4.2.2 二叉樹81
4.3 樹的深度優(yōu)先搜索和遍歷83
4.3.1 前綴樹的構(gòu)建和查詢83
4.3.2 深度優(yōu)先的實現(xiàn)88
4.4 樹和圖的廣度優(yōu)先搜索和遍歷94
4.4.1 社交網(wǎng)絡(luò)中的好友問題94
4.4.2 實現(xiàn)社交好友推薦99
4.4.3 如何更高效地求兩個用戶間的最短路徑104
4.4.4 更有效的嵌套型聚合111
4.5 圖中的最短路徑114
4.5.1 基于廣度優(yōu)先或深度優(yōu)先搜索的方法115
4.5.2 一個優(yōu)化的版本:Dijkstra算法116
第5章 編程中的數(shù)學(xué)思維126
5.1 數(shù)據(jù)結(jié)構(gòu)、編程語言和基礎(chǔ)算法126
5.1.1 數(shù)據(jù)結(jié)構(gòu)126
5.1.2 編程語句128
5.1.3 基礎(chǔ)算法128
5.2 算法復(fù)雜度分析129
5.2.1 復(fù)雜度分析的原理和法則130
5.2.2 復(fù)雜度分析的案例134
第二篇 概率統(tǒng)計138
第6章 概率和統(tǒng)計基礎(chǔ)139
6.1 概論和統(tǒng)計對于編程的意義139
6.1.1 概率和統(tǒng)計的概念139
6.1.2概率和統(tǒng)計可以做什么140
6.2 隨機(jī)變量、概率分布和期望值141
6.2.1 隨機(jī)變量141
6.2.2 概率分布142
6.2.3 期望值157
6.3 聯(lián)合概率、條件概率和貝葉斯定理159
6.3.1 聯(lián)合概率、條件概率和邊緣概率159
6.3.2 貝葉斯定理162
6.3.3 隨機(jī)變量之間的獨立性163
第7章 樸素貝葉斯分類165
7.1 原始信息的轉(zhuǎn)換165
7.2 樸素貝葉斯的核心思想166
7.3 基于樸素貝葉斯算法的文本分類170
7.3.1 文本分類系統(tǒng)的基本框架170
7.3.2 自然語言的預(yù)處理171
7.3.3 樸素貝葉斯模型的構(gòu)建174
7.3.4 樸素貝葉斯模型的預(yù)測176
7.3.5 樸素貝葉斯分類的實現(xiàn)177
第8章 馬爾可夫過程181
8.1 語言模型181
8.1.1 鏈?zhǔn)椒▌t181
8.1.2 馬爾可夫假設(shè)181
8.1.3 模型推導(dǎo)182
8.2 語言模型的應(yīng)用183
8.2.1 信息檢索183
8.2.2 中文分詞184
8.3 馬爾可夫模型184
8.4 隱馬爾可夫模型188
8.4.1 模型的原理188
8.4.2 模型的求解192
8.4.3 模型的實現(xiàn)195
第9章 信息熵200
9.1信息熵和信息增益200
9.1.1 性格測試中的信息熵200
9.1.2 信息增益203
9.2 通過信息增益進(jìn)行決策204
9.2.1 通過信息熵挑選合適的問題204
9.2.2 幾種決策樹算法207
9.3 特征選擇209
9.3.1 特征選擇209
9.3.2 利用信息熵進(jìn)行特征選擇209
9.3.3 利用卡方檢驗進(jìn)行特征選擇210
第 10章 數(shù)據(jù)分布212
10.1 特征變換212
10.1.1 為什么需要特征變換212
10.1.2 兩種常見的特征變換方法214
10.2 統(tǒng)計意義217
10.2.1 顯著性差異219
10.2.2 統(tǒng)計假設(shè)檢驗和顯著性檢驗220
10.2.3 P值220
10.2.4 不同的檢驗方法221
10.3 擬合、欠擬合和過擬合及其處理229
10.3.1 擬合、欠擬合和過擬合229
10.3.2欠擬合和過擬合的處理233
第三篇 線性代數(shù)235
第 11章 線性代數(shù)基礎(chǔ)236
11.1 向量和向量空間236
11.1.1 向量的概念236
11.1.2 向量的運(yùn)算239
11.1.3 向量空間244
11.2 矩陣250
11.2.1 矩陣的運(yùn)算250
11.2.2 矩陣運(yùn)算的幾何意義252
第 12章 文本處理中的向量空間模型256
12.1 信息檢索256
12.1.1 信息檢索的概念256
12.1.2 信息檢索中的向量空間模型257
12.2 文本聚類259
12.2.1 聚類算法的概念259
12.2.2 使用向量空間進(jìn)行聚類260
12.3 文本分類263
第 13章 對象間關(guān)系的刻畫——矩陣267
13.1 PageRank的矩陣實現(xiàn)267
13.1.1 PageRank算法的回顧267
13.1.2 簡化PageRank公式267
13.1.3 考慮隨機(jī)跳轉(zhuǎn)269
13.1.4 代碼的實現(xiàn)270
13.2 用矩陣實現(xiàn)推薦系統(tǒng)272
13.2.1 用矩陣實現(xiàn)推薦系統(tǒng)的核心思想272
13.2.2 基于用戶的過濾272
13.2.3 基于物品的過濾277
第 14章 矩陣的特征279
14.1 主成分分析(PCA)279
14.1.1 PCA的主要步驟279
14.1.2 PCA背后的核心思想286
14.2 奇異值分解(SVD)288
14.2.1 方陣的特征分解288
14.2.2 矩陣的奇異值分解289
14.2.3 潛在語義分析和SVD291
第 15章 回歸分析294
15.1 線性方程組294
15.1.1 高斯消元法295
15.1.2 使用矩陣實現(xiàn)高斯消元法296
15.2 最小二乘法299
15.2.1 通過觀測值的擬合300
15.2.2 最小二乘法302
15.2.3 補(bǔ)充證明和解釋303
15.2.4 演算示例305
第 16章 神經(jīng)網(wǎng)絡(luò)311
16.1 神經(jīng)網(wǎng)絡(luò)的基本原理311
16.2 基于TensorFlow的實現(xiàn)317
16.3 Word2Vec327
本書緊貼計算機(jī)領(lǐng)域,從程序員的需求出發(fā),精心挑選了程序員真正用得上的數(shù)學(xué)知識,通過生動的案例來解讀知識中的難點,使程序員更容易對實際問題進(jìn)行數(shù)學(xué)建模,進(jìn)而構(gòu)建出更優(yōu)化的算法和代碼。
本書共分為三大模塊:“基礎(chǔ)思想”篇梳理編程中常用的數(shù)學(xué)概念和思想,既由淺入深地精講數(shù)據(jù)結(jié)構(gòu)與數(shù)學(xué)中基礎(chǔ)、核心的數(shù)學(xué)知識,又闡明數(shù)學(xué)對編程和算法的真正意義;“概率統(tǒng)計”篇以概率統(tǒng)計中核心的貝葉斯公式為基點,向上講解隨機(jī)變量、概率分布等基礎(chǔ)概念,向下講解樸素貝葉斯,并分析其在生活和編程中的實際應(yīng)用,使讀者真正理解概率統(tǒng)計的本質(zhì),跨越概念和應(yīng)用之間的鴻溝;“線性代數(shù)”篇從線性代數(shù)中的核心概念向量、矩陣、線性方程入手,逐步深入分析這些概念是如何與計算機(jī)融會貫通以解決實際問題的。除了理論知識的闡述,本書還通過Python語言,分享了通過大量實踐積累下來的寶貴經(jīng)驗和編碼,使讀者學(xué)有所用。
本書的內(nèi)容從概念到應(yīng)用,再到本質(zhì),層層深入,不但注重培養(yǎng)讀者養(yǎng)成良好的數(shù)學(xué)思維,而且努力使讀者的編程技術(shù)實現(xiàn)進(jìn)階,非常適合希望從本質(zhì)上提升編程質(zhì)量的中級程序員閱讀和學(xué)習(xí)。