日本免费精品视频,男人的天堂在线免费视频,成人久久久精品乱码一区二区三区,高清成人爽a毛片免费网站

在線客服
Spark MLlib機(jī)器學(xué)習(xí)實(shí)踐(第2版)圖書
人氣:40

Spark MLlib機(jī)器學(xué)習(xí)實(shí)踐(第2版)

Spark MLlib機(jī)器學(xué)習(xí)案例精彩講解,讓您輕松掌握

內(nèi)容簡(jiǎn)介

Spark作為新興的、應(yīng)用范圍為廣泛的大數(shù)據(jù)處理開源框架引起了廣泛的關(guān)注,它吸引了大量程序設(shè)計(jì)和開發(fā)人員進(jìn)行相關(guān)內(nèi)容的學(xué)習(xí)與開發(fā),其中MLlib是Spark框架使用的核心。本書是一本細(xì)致介紹Spark MLlib程序設(shè)計(jì)的圖書,入門簡(jiǎn)單,示例豐富。 本書分為13章,從Spark基礎(chǔ)安裝和配置開始,依次介紹MLlib程序設(shè)計(jì)基礎(chǔ)、MLlib的數(shù)據(jù)對(duì)象構(gòu)建、MLlib中RDD使用介紹,各種分類、聚類、回歸等數(shù)據(jù)處理方法,后還通過一個(gè)完整的實(shí)例,回顧了前面的學(xué)習(xí)內(nèi)容,并通過代碼實(shí)現(xiàn)了一個(gè)完整的分析過程。 本書理論內(nèi)容由淺而深,采取實(shí)例和理論相結(jié)合的方式,講解細(xì)致直觀,適合Spark MLlib初學(xué)者、大數(shù)據(jù)分析和挖掘人員,也適合高校和培訓(xùn)學(xué)習(xí)相關(guān)專業(yè)的師生教學(xué)參考。

編輯推薦

MLlib是Apache Spark機(jī)器學(xué)習(xí)庫。本書入門簡(jiǎn)單,實(shí)例豐富,詳解協(xié)同過濾、線性回歸、分類、決策樹、保序回歸、聚類、關(guān)聯(lián)、數(shù)據(jù)降維、特征提取和轉(zhuǎn)換等MLlib主要算法,用實(shí)例說明MLlib大數(shù)據(jù)機(jī)器學(xué)習(xí)算法的運(yùn)用。

作者簡(jiǎn)介

王曉華,高校博學(xué)計(jì)算機(jī)專業(yè)講師,主要研究方向?yàn)樵朴?jì)算、數(shù)據(jù)挖掘;曾主持和參與多項(xiàng)國家和省級(jí)科研課題,發(fā)表過多篇論文,有一項(xiàng)專利。

目錄

目 錄

第1章 星星之火 1

1.1 大數(shù)據(jù)時(shí)代 1

1.2 大數(shù)據(jù)分析時(shí)代 2

1.3 簡(jiǎn)單、優(yōu)雅、有效——這就是Spark 3

1.4 核心——MLlib 4

1.5 星星之火,可以燎原 6

1.6 小結(jié) 6

第2章 Spark安裝和開發(fā)環(huán)境配置 7

2.1 Windows單機(jī)模式Spark安裝和配置 7

2.1.1 Windows 7安裝Java 7

2.1.2 Windows 7安裝Scala 10

2.1.3 Intellij IDEA下載和安裝 13

2.1.4 Intellij IDEA中Scala插件的安裝 14

2.1.5 HelloJava——使用Intellij IDEA創(chuàng)建Java程序 18

2.1.6 HelloScala——使用Intellij IDEA創(chuàng)建Scala程序 21

2.1.7 一腳——Spark單機(jī)版安裝 26

2.2 經(jīng)典的WordCount 29

2.2.1 Spark實(shí)現(xiàn)WordCount 29

2.2.2 MapReduce實(shí)現(xiàn)WordCount 31

2.3 小結(jié) 34

第3章 RDD詳解 35

3.1 RDD是什么 35

3.1.1 RDD名稱的秘密 35

3.1.2 RDD特性 36

3.1.3 與其他分布式共享內(nèi)存的區(qū)別 37

3.1.4 RDD缺陷 37

3.2 RDD工作原理 38

3.2.1 RDD工作原理圖 38

3.2.2 RDD的相互依賴 38

3.3 RDD應(yīng)用API詳解 39

3.3.1 使用aggregate方法對(duì)給定的數(shù)據(jù)集進(jìn)行方法設(shè)定 39

3.3.2 提前計(jì)算的cache方法 42

3.3.3 笛卡爾操作的cartesian方法 43

3.3.4 分片存儲(chǔ)的coalesce方法 44

3.3.5 以value計(jì)算的countByValue方法 45

3.3.6 以key計(jì)算的countByKey方法 45

3.3.7 除去數(shù)據(jù)集中重復(fù)項(xiàng)的distinct方法 46

3.3.8 過濾數(shù)據(jù)的filter方法 47

3.3.9 以行為單位操作數(shù)據(jù)的flatMap方法 47

3.3.10 以單個(gè)數(shù)據(jù)為目標(biāo)進(jìn)行操作的map方法 48

3.3.11 分組數(shù)據(jù)的groupBy方法 48

3.3.12 生成鍵值對(duì)的keyBy方法 49

3.3.13 同時(shí)對(duì)兩個(gè)數(shù)據(jù)進(jìn)行處理的reduce方法 50

3.3.14 對(duì)數(shù)據(jù)進(jìn)行重新排序的sortBy方法 51

3.3.15 合并壓縮的zip方法 52

3.4 小結(jié) 53

第4章 MLlib基本概念 54

4.1 MLlib基本數(shù)據(jù)類型 54

4.1.1 多種數(shù)據(jù)類型 54

4.1.2 從本地向量集起步 55

4.1.3 向量標(biāo)簽的使用 56

4.1.4 本地矩陣的使用 58

4.1.5 分布式矩陣的使用 59

4.2 MLlib數(shù)理統(tǒng)計(jì)基本概念 62

4.2.1 基本統(tǒng)計(jì)量 62

4.2.2 統(tǒng)計(jì)量基本數(shù)據(jù) 63

4.2.3 距離計(jì)算 64

4.2.4 兩組數(shù)據(jù)相關(guān)系數(shù)計(jì)算 65

4.2.5 分層抽樣 67

4.2.6 假設(shè)檢驗(yàn) 69

4.2.7 隨機(jī)數(shù) 70

4.3 小結(jié) 71

第5章 協(xié)同過濾算法 72

5.1 協(xié)同過濾 72

5.1.1 協(xié)同過濾概述 72

5.1.2 基于用戶的推薦 73

5.1.3 基于物品的推薦 74

5.1.4 協(xié)同過濾算法的不足 75

5.2 相似度度量 75

5.2.1 基于歐幾里得距離的相似度計(jì)算 75

5.2.2 基于余弦角度的相似度計(jì)算 76

5.2.3 歐幾里得相似度與余弦相似度的比較 77

5.2.4 及時(shí)個(gè)例子——余弦相似度實(shí)戰(zhàn) 77

5.3 MLlib中的交替最小二乘法(ALS算法) 80

5.3.1 最小二乘法(LS算法)詳解 81

5.3.2 MLlib中交替最小二乘法(ALS算法)詳解 82

5.3.3 ALS算法實(shí)戰(zhàn) 83

5.4 小結(jié) 85

第6章 MLlib線性回歸理論與實(shí)戰(zhàn) 86

6.1 隨機(jī)梯度下降算法詳解 86

6.1.1 道士下山的故事 87

6.1.2 隨機(jī)梯度下降算法的理論基礎(chǔ) 88

6.1.3 隨機(jī)梯度下降算法實(shí)戰(zhàn) 88

6.2 MLlib回歸的過擬合 89

6.2.1 過擬合產(chǎn)生的原因 90

6.2.2 lasso回歸與嶺回歸 91

6.3 MLlib線性回歸實(shí)戰(zhàn) 91

6.3.1 MLlib線性回歸基本準(zhǔn)備 91

6.3.2 MLlib線性回歸實(shí)戰(zhàn):商品價(jià)格與消費(fèi)者收入之間的關(guān)系 94

6.3.3 對(duì)擬合曲線的驗(yàn)證 95

6.4 小結(jié) 97

第7章 MLlib分類實(shí)戰(zhàn) 98

7.1 邏輯回歸詳解 98

7.1.1 邏輯回歸不是回歸算法 98

7.1.2 邏輯回歸的數(shù)學(xué)基礎(chǔ) 99

7.1.3 一元邏輯回歸示例 100

7.1.4 多元邏輯回歸示例 101

7.1.5 MLlib邏輯回歸驗(yàn)證 103

7.1.6 MLlib邏輯回歸實(shí)例:腎癌的轉(zhuǎn)移判斷 104

7.2 支持向量機(jī)詳解 106

7.2.1 三角還是圓 106

7.2.2 支持向量機(jī)的數(shù)學(xué)基礎(chǔ) 108

7.2.3 支持向量機(jī)使用示例 109

7.2.4 使用支持向量機(jī)分析腎癌轉(zhuǎn)移 110

7.3 樸素貝葉斯詳解 111

7.3.1 穿褲子的男生or女生 111

7.3.2 貝葉斯定理的數(shù)學(xué)基礎(chǔ)和意義 112

7.3.3 樸素貝葉斯定理 113

7.3.4 MLlib樸素貝葉斯使用示例 114

7.3.5 MLlib樸素貝葉斯實(shí)戰(zhàn):“僵尸粉”的鑒定 115

7.4 小結(jié) 117

第8章 決策樹與保序回歸 118

8.1 決策樹詳解 118

8.1.1 水晶球的秘密 119

8.1.2 決策樹的算法基礎(chǔ):信息熵 119

8.1.3 決策樹的算法基礎(chǔ)——ID3算法 121

8.1.4 MLlib中決策樹的構(gòu)建 122

8.1.5 MLlib中決策樹示例 123

8.1.6 隨機(jī)雨林與梯度提升算法(GBT) 125

8.2 保序回歸詳解 127

8.2.1 何為保序回歸 128

8.2.2 保序回歸示例 128

8.3 小結(jié) 129

第9章 MLlib中聚類詳解 130

9.1 聚類與分類 130

9.1.1 什么是分類 130

9.1.2 什么是聚類 131

9.2 MLlib中的Kmeans算法 131

9.2.1 什么是kmeans算法 131

9.2.2 MLlib中Kmeans算法示例 133

9.2.3 Kmeans算法中細(xì)節(jié)的討論 134

9.3 高斯混合聚類 135

9.3.1 從高斯分布聚類起步 135

9.3.2 混合高斯聚類 137

9.3.3 MLlib高斯混合模型使用示例 137

9.4 快速迭代聚類 138

9.4.1 快速迭代聚類理論基礎(chǔ) 138

9.4.2 快速迭代聚類示例 139

9.5 小結(jié) 140

第10章 MLlib中關(guān)聯(lián)規(guī)則 141

10.1 Apriori頻繁項(xiàng)集算法 141

10.1.1 啤酒與尿布 141

10.1.2 經(jīng)典的Apriori算法 142

10.1.3 Apriori算法示例 144

10.2 FP-growth算法 145

10.2.1 Apriori算法的局限性 145

10.2.2 FP-growth算法 145

10.2.3 FP樹示例 148

10.3 小結(jié) 149

第11章 數(shù)據(jù)降維 150

11.1 奇異值分解(SVD) 150

11.1.1 行矩陣(RowMatrix)詳解 150

11.1.2 奇異值分解算法基礎(chǔ) 151

11.1.3 MLlib中奇異值分解示例 152

11.2 主成分分析(PCA) 153

11.2.1 主成分分析(PCA)的定義 154

11.2.2 主成分分析(PCA)的數(shù)學(xué)基礎(chǔ) 154

11.2.3 MLlib中主成分分析(PCA)示例 155

11.3 小結(jié) 156

第12章 特征提取和轉(zhuǎn)換 157

12.1 TF-IDF 157

12.1.1 如何查找所要的新聞 157

12.1.2 TF-IDF算法的數(shù)學(xué)計(jì)算 158

12.1.3 MLlib中TF-IDF示例 159

12.2 詞向量化工具 160

12.2.1 詞向量化基礎(chǔ) 160

12.2.2 詞向量化使用示例 161

12.3 基于卡方檢驗(yàn)的特征選擇 162

12.3.1 “吃貨”的苦惱 162

12.3.2 MLlib中基于卡方檢驗(yàn)的特征選擇示例 163

12.4 小結(jié) 164

第13章 MLlib實(shí)戰(zhàn)演練——鳶尾花分析 166

13.1 建模說明 166

13.1.1 數(shù)據(jù)的描述與分析目標(biāo) 166

13.1.2 建模說明 168

13.2 數(shù)據(jù)預(yù)處理和分析 171

13.2.1 微觀分析——均值與方差的對(duì)比分析 171

13.2.2 宏觀分析——不同種類特性的長度計(jì)算 174

13.2.3 去除重復(fù)項(xiàng)——相關(guān)系數(shù)的確定 176

13.3 長與寬之間的關(guān)系——數(shù)據(jù)集的回歸分析 180

13.3.1 使用線性回歸分析長與寬之間的關(guān)系 180

13.3.2 使用邏輯回歸分析長與寬之間的關(guān)系 183

13.4 使用分類和聚類對(duì)鳶尾花數(shù)據(jù)集進(jìn)行處理 184

13.4.1 使用聚類分析對(duì)數(shù)據(jù)集進(jìn)行聚類處理 184

13.4.2 使用分類分析對(duì)數(shù)據(jù)集進(jìn)行分類處理 187

13.5 最終的判定——決策樹測(cè)試 188

13.5.1 決定數(shù)據(jù)集的歸類——決策樹 188

13.5.2 決定數(shù)據(jù)集歸類的分布式方法——隨機(jī)雨林 190

13.6 小結(jié) 191

在線預(yù)覽

回歸分析(regression analysis)是一種用來確定兩種或兩種以上變量間相互依賴的定量關(guān)系的統(tǒng)計(jì)分析方法,運(yùn)用十分廣泛。回歸分析可以按以下要素分類:? 按照涉及的自變量的多少,分為回歸和多重回歸分析;? 按照自變量的多少,可分為一元回歸分析和多元回歸分析;? 按照自變量和因變量之間的關(guān)系類型,可分為線性回歸分析和非線性回歸分析。如果在回歸分析中,只包括一個(gè)自變量和一個(gè)因變量,且二者的關(guān)系可用一條直線近似表示,這種回歸分析稱為一元線性回歸分析。如果回歸分析中包括兩個(gè)或兩個(gè)以上的自變量,且因變量和自變量之間是線性關(guān)系,則稱為多重線性回歸分析。回歸分析是最常用的機(jī)器學(xué)習(xí)算法之一,可以說回歸分析理論與實(shí)際研究的建立使得機(jī)器學(xué)習(xí)作為一門系統(tǒng)的計(jì)算機(jī)應(yīng)用學(xué)科得以確認(rèn)。MLlib中,線性回歸是一種能夠較為預(yù)測(cè)具體數(shù)據(jù)的回歸方法,它通過給定的一系列訓(xùn)練數(shù)據(jù),在預(yù)測(cè)算法的幫助下預(yù)測(cè)未知的數(shù)據(jù)。本章將向讀者介紹線性回歸的基本理論與MLlib中使用的預(yù)測(cè)算法,以及為了防止過度擬合而進(jìn)行的正則化處理,這些不僅僅是回歸算法的核心,也是MLlib的最核心部分。本章主要知識(shí)點(diǎn):? 隨機(jī)梯度下降算法詳解? MLlib回歸的過擬合? MLlib線性回歸實(shí)戰(zhàn)6.1 隨機(jī)梯度下降算法詳解機(jī)器學(xué)習(xí)中回歸算法的種類有很多,例如神經(jīng)網(wǎng)絡(luò)回歸算法、蟻群回歸算法、支持向量機(jī)回歸算法等,這些都可以在一定程度上達(dá)成回歸擬合的目的。MLlib中使用的是較為經(jīng)典的隨機(jī)梯度下降算法,它充分利用了Spark框架的迭代計(jì)算特性,通過不停地判斷和選擇當(dāng)前目標(biāo)下的路徑,從而能夠在最短路徑下達(dá)到的結(jié)果,繼而提高大數(shù)據(jù)的計(jì)算效率。6.1.1 道士下山的故事在介紹隨機(jī)梯度下降算法之前,給大家講一個(gè)道士下山的故事。請(qǐng)讀者看圖6-1。 圖6-1 模擬隨機(jī)梯度下降算法的演示圖這是一個(gè)模擬隨機(jī)梯度下降算法的演示圖。為了便于理解,筆者將其比喻成道士想要出去游玩的一座山。設(shè)想道士有24小時(shí)和道友一起到一座不太熟悉的山上去玩,在興趣盎然中很快登上了山頂。但是天有不測(cè),下起了雨。如果這時(shí)需要道士和其同來的道友以最快的速度下山,那該怎么辦呢?如果想以最快的速度下山,那么最快的辦法就是順著坡度最陡峭的地方走下去。但是由于不熟悉路,道士在下山的過程中,每走過一段路程需要停下來觀望,從而選擇最陡峭的下山路線。這樣一路走下來的話,可以在最短時(shí)間內(nèi)走到山腳。這個(gè)最短的路線從圖上可以近似的表示為:① → ② → ③ → ④ → ⑤ → ⑥ → ⑦每個(gè)數(shù)字代表每次停頓的地點(diǎn),這樣只需要在每個(gè)停頓的地點(diǎn)上選擇最陡峭的下山路即可。這個(gè)就是一個(gè)道士下山的故事。隨機(jī)梯度下降算法和這個(gè)類似,如果想要使用最迅捷的方法,那么最簡(jiǎn)單的辦法就是在下降一個(gè)梯度的階層后,尋找一個(gè)當(dāng)前獲得的較大坡度繼續(xù)下降。這就是隨機(jī)梯度算法的原理。6.1.2 隨機(jī)梯度下降算法的理論基礎(chǔ)從上一小節(jié)的例子可以看到,隨機(jī)梯度下降算法就是不停地尋找某個(gè)節(jié)點(diǎn)中下降幅度較大的那個(gè)趨勢(shì)進(jìn)行迭代計(jì)算,直到將數(shù)據(jù)收縮到符合要求的范圍為止。它可以用數(shù)學(xué)公式表達(dá)如下: 在上一章介紹最小二乘法的時(shí)候,筆者通過最小二乘法說明了直接求解化變量的方法,也介紹了在求解過程中的前提條件是要求計(jì)算值與實(shí)際值的偏差的平方最小。但是在隨機(jī)梯度下降算法中,對(duì)于系數(shù)需要通過不停地求解出當(dāng)前位置下化的數(shù)據(jù)。這句話通過數(shù)學(xué)方式表達(dá)的話就是不停地對(duì)系數(shù)θ求偏導(dǎo)數(shù)。即公式如下: 公式中θ會(huì)向著梯度下降的最快方向減少,從而推斷出θ的解。因此可以說隨機(jī)梯度下降算法最終被歸結(jié)為通過迭代計(jì)算特征值從而求出最合適的值。θ求解的公式如下: 公式中α是下降系數(shù),用較為通俗的話來說就是用以計(jì)算每次下降的幅度大小。系數(shù)越大則每次計(jì)算中差值越大,系數(shù)越小則差值越小,但是計(jì)算時(shí)間也相對(duì)延長。6.1.3 隨機(jī)梯度下降算法實(shí)戰(zhàn)隨機(jī)梯度下降算法將梯度下降算法通過一個(gè)模型來表示的話,如圖6-2所示: 圖6-2 隨機(jī)梯度下降算法過程從圖中可以看到,實(shí)現(xiàn)隨機(jī)梯度下降算法的關(guān)鍵是擬合算法的實(shí)現(xiàn)。而本例的擬合算法實(shí)現(xiàn)較為簡(jiǎn)單,通過不停地修正數(shù)據(jù)值從而達(dá)到數(shù)據(jù)的值。具體實(shí)現(xiàn)代碼如程序6-1所示:代碼位置://SRC//C06// SGD.scala程序6-1 隨機(jī)梯度下降算法import scala.collection.mutable.HashMap

object SGD { val data = HashMap[Int,Int]() //創(chuàng)建數(shù)據(jù)集 def getData():HashMap[Int,Int] = { //生成數(shù)據(jù)集內(nèi)容 for(i (12i)) //寫入公式y(tǒng)=2x } data //返回?cái)?shù)據(jù)集 }

var θ:Double = 0 //及時(shí)步假設(shè)θ為0 var α:Double = 0.1 //設(shè)置步進(jìn)系數(shù)

def sgd(x:Double,y:Double) = { //設(shè)置迭代公式 θ = θ - α ( (θx) - y) //迭代公式 } def main(args: Array[String]) { val dataSource = getData() //獲取數(shù)據(jù)集 dataSource.foreach(myMap =>{ //開始迭代 sgd(myMap._1,myMap._2) //輸入數(shù)據(jù) }) println(“最終結(jié)果θ值為 ” θ) //顯示結(jié)果 }}最終結(jié)果請(qǐng)讀者自行驗(yàn)證完成。讀者在重復(fù)運(yùn)行本程序的時(shí)候,可以適當(dāng)?shù)卦龃髷?shù)據(jù)量和步進(jìn)系數(shù)。當(dāng)增大數(shù)據(jù)量的時(shí)候可以看到,θ值會(huì)開始偏離一定的距離,請(qǐng)讀者考慮為何會(huì)這樣。6.2 MLlib回歸的過擬合有計(jì)算就有誤差,誤差不可怕,我們需要的是采用何種方法消除誤差。回歸分析在計(jì)算過程中,由于特定分析數(shù)據(jù)和算法選擇的原因,結(jié)果會(huì)對(duì)分析數(shù)據(jù)產(chǎn)生非常強(qiáng)烈的擬合效果;而對(duì)于測(cè)試數(shù)據(jù),卻表現(xiàn)得不理想,這種效果和原因稱為過擬合。本節(jié)將分析過擬合產(chǎn)生的原因和效果,并給出一個(gè)處理手段供讀者學(xué)習(xí)和掌握。6.2.1 過擬合產(chǎn)生的原因在上一節(jié)的,我們建議和鼓勵(lì)讀者對(duì)數(shù)據(jù)的量進(jìn)行調(diào)整從而獲得更多的擬合修正系數(shù)。相信讀者也發(fā)現(xiàn),隨著數(shù)據(jù)量的增加,擬合的系數(shù)在達(dá)到一定值后會(huì)發(fā)生較大幅度的偏轉(zhuǎn)。在上一節(jié)程序6-1的例子中,步進(jìn)系數(shù)在0.1的程度下,數(shù)據(jù)量達(dá)到70以后就發(fā)生偏轉(zhuǎn)。產(chǎn)生這樣原因就是MLlib回歸會(huì)產(chǎn)生過擬合現(xiàn)象。對(duì)于過擬合的例子請(qǐng)讀者參看圖6-3。 圖6-3 擬合與過擬合從圖6-3所示A圖和B圖的對(duì)比來看,如果測(cè)試數(shù)據(jù)過于側(cè)重某些具體的點(diǎn),則會(huì)對(duì)整體的曲線形成構(gòu)成很大的影響,從而影響到待測(cè)數(shù)據(jù)的測(cè)試精準(zhǔn)度。這種對(duì)于測(cè)試數(shù)據(jù)過于接近而實(shí)際數(shù)據(jù)擬合程度不夠的現(xiàn)象稱為過擬合,而解決辦法就是對(duì)數(shù)據(jù)進(jìn)行處理,而處理過程稱為回歸的正則化。正則化使用較多的一般有兩種方法,lasso回歸(L1回歸)和嶺回歸(L2回歸)。其目的是通過對(duì)最小二乘估計(jì)加入處罰約束,使某些系數(shù)的估計(jì)為0。從6-3圖中A圖和B圖回歸曲線上看,A和B的差異較多地集中在回歸系數(shù)的選取上。這里可以近似地將A假設(shè)為如下公式: 而B公式可以近似的表示為: 從A和B公式的比較來看,B公式更多的是增加了系數(shù)。因此解決辦法就是通過對(duì)增加的系數(shù)進(jìn)行消除從而使之消除過擬合。更加直觀的理解就是,防止通過擬合算法計(jì)算出的回歸公式比較大地響應(yīng)和依賴某些特定的特征值,從而影響回歸曲線的率。6.2.2 lasso回歸與嶺回歸由前面對(duì)過擬合產(chǎn)生的原因分析來看,如果能夠消除擬合公式中多余的擬合系數(shù),那么產(chǎn)生的曲線可以較好地對(duì)數(shù)據(jù)進(jìn)行擬合處理。因此可以認(rèn)為對(duì)擬合公式過擬合的消除最直接的辦法就是去除其多余的公式,那么通過數(shù)學(xué)公式表達(dá)如下: 從公式可以看到,f(B')是f(B)的變形形式,其通過增加一個(gè)新的系數(shù)公式J(θ)從而使原始數(shù)據(jù)公式獲得了正則化表達(dá)。這里J(θ)又稱為損失函數(shù),它通過回歸擬合曲線的范數(shù)L1和L2與一個(gè)步進(jìn)數(shù)α相乘得到。范數(shù)L1和范數(shù)L2是兩種不同的系數(shù)懲罰項(xiàng),首先來看L1范數(shù)。L1范數(shù)指的是回歸公式中各個(gè)元素的值之和,其又稱為“稀疏規(guī)則算子(Lasso regularization)”。其一般公式如下: 即可以通過這個(gè)公式計(jì)算使得f(B')能夠取得最小化。而L2范數(shù)指的是回歸公式中各個(gè)元素的平方和,其又稱為“嶺回歸(Ridge Regression)”可以用公式表示為: MLlib中SGD算法支持L1和L2正則化方法,而LBFGS只支持L2正則化,不支持L1正則化。L1范數(shù)和L2范數(shù)相比較而言,L1能夠在步進(jìn)系數(shù)α在一定值的情況下將回歸曲線的某些特定系數(shù)修正為0。而L1回歸由于其平方的處理方法從而使得回歸曲線獲得較高的計(jì)算精度。6.3 MLlib線性回歸實(shí)戰(zhàn)6.3.1 MLlib線性回歸基本準(zhǔn)備在前面的章節(jié)中,我們?yōu)樽x者介紹了線性回歸的一些基本知識(shí),這些知識(shí)將伴隨讀者的整個(gè)機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的工作生涯。本節(jié)將帶領(lǐng)讀者開始學(xué)習(xí)及時(shí)個(gè)回歸算法,即線性回歸。首先需要完成線性回歸的數(shù)據(jù)準(zhǔn)備工作。MLlib中,線性回歸的基本數(shù)據(jù)是嚴(yán)格按照數(shù)據(jù)格式進(jìn)行設(shè)置。例如,如果想求得公式y(tǒng)=2x1 3x2系數(shù),那么需要在數(shù)據(jù)基礎(chǔ)中設(shè)置2個(gè)x值,并且在其前部設(shè)置y值。數(shù)據(jù)整理規(guī)則如下:數(shù)據(jù)位置://DATA//D06//lpsa.data1,0 12,0 23,0 35,1 47,6 19,4 56,3 3這里逗號(hào)(,)前面的數(shù)值是根據(jù)不同的數(shù)據(jù)求出的結(jié)果值,而每個(gè)系數(shù)的x值依次地被排列在其后。這些就是數(shù)據(jù)的收集規(guī)則:Y = a bX其次是對(duì)既定的MLlib回歸算法中數(shù)據(jù)格式的要求,我們可以從回歸算法的源碼來分析,源碼代碼段如下:def train( input: RDD[LabeledPoint], numIterations: Int, stepSize: Double): LinearRegressionModel = { train(input, numIterations, stepSize, 1.0)}從上面代碼段可以看到,整理的訓(xùn)練數(shù)據(jù)集需要輸入一個(gè)LabeledPoint格式的數(shù)據(jù),因此在讀取來自數(shù)據(jù)集中的數(shù)據(jù)時(shí),需要將其轉(zhuǎn)化為既定的格式。本例子數(shù)據(jù)轉(zhuǎn)化的格式如下:val parsedData = data.map { line => val parts = line.split(',') LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))}.cache()從中可以看到,程序首先對(duì)讀取的數(shù)據(jù)集進(jìn)行分片處理,根據(jù)逗號(hào)將其分解為因變量與自變量,即線性回歸中的y和x值。其后將其轉(zhuǎn)換為LabeledPoint格式的數(shù)據(jù),這里part(0)和part(1)分別代表數(shù)據(jù)分開的y和x值,并根據(jù)需要將x值轉(zhuǎn)化成一個(gè)向量數(shù)組。其次是訓(xùn)練模型的數(shù)據(jù)要求。numIterations是整體模型的迭代次數(shù),理論上迭代的次數(shù)越多則模型的擬合程度越高,但是隨之而來的是迭代需要的時(shí)間越長。而stepSize是上面章節(jié)中隨機(jī)梯度下降算法中的步進(jìn)系數(shù),代表每次迭代過程中模型的整體修正程度。一部分就是根據(jù)數(shù)據(jù)集訓(xùn)練的線性回歸模型預(yù)測(cè)數(shù)據(jù)。MLlib中線性回歸模型預(yù)測(cè)方法有2種,其代碼如下:def predict(testData: RDD[Vector]): RDD[Double] = {

def predict(testData: Vector): Double = {表示分別要求輸入一個(gè)向量或者一個(gè)RDD化后的向量作為數(shù)據(jù)變量,這里可以通過RDD內(nèi)建的方法對(duì)數(shù)據(jù)進(jìn)行處理。一個(gè)完整的線性回歸程序如程序6-2所示。代碼位置://SRC//C06// LinearRegression.scala程序6-2 線性回歸程序import org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}

object LinearRegression { val conf = new SparkConf() //創(chuàng)建環(huán)境變量 .setMaster("local") //設(shè)置本地化處理 .setAppName("LinearRegression ") //設(shè)定名稱 val sc = new SparkContext(conf) //創(chuàng)建環(huán)境變量實(shí)例

def main(args: Array[String]) { val data = sc.textFile("c:/lpsa.data") //獲取數(shù)據(jù)集路徑 val parsedData = data.map { line => //開始對(duì)數(shù)據(jù)集處理 val parts = line.split(',') //根據(jù)逗號(hào)進(jìn)行分區(qū) LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble))) }.cache() //轉(zhuǎn)化數(shù)據(jù)格式 //建立模型 val model = LinearRegressionWithSGD.train(parsedData, 100,0.1) val prediction= model.predict(parsedData.map((_.features))) //檢驗(yàn)測(cè)試集數(shù)據(jù) prediction.foreach(obj => println(obj)) //打印原測(cè)試集數(shù)據(jù)使用模型后得出的結(jié)果 println(model.predict(Vectors.dense(0,1))) //提供新的待測(cè)數(shù)據(jù) }

}這里順帶提示一下,讀者在一步看到的Vectors.dense(0,1)代碼是人為的創(chuàng)建一個(gè)MLLib數(shù)據(jù)向量輸入到已構(gòu)成的數(shù)據(jù)模型中。請(qǐng)讀者自行輸入數(shù)據(jù)和計(jì)算回歸結(jié)果。6.3.2 MLlib線性回歸實(shí)戰(zhàn):商品價(jià)格與消費(fèi)者收入之間的關(guān)系本小節(jié)我們做一個(gè)MLlib線性回歸的實(shí)例。某種商品的需求量(y,噸)、價(jià)格(x1,元/千克)和消費(fèi)者收入(x2,元)觀測(cè)值如表6-1所示。表6-1 消費(fèi)和需求對(duì)應(yīng)表yx1x2yx1x2

100 5 1000 65 7 40075 7 600 90 5 130080 6 1200 100 4 110070 6 500 110 3 130050 8 30 60 9 300要求:建立需求函數(shù): ;從要求可以看到,我們需要建立一個(gè)需求回歸公式,首先需要對(duì)數(shù)據(jù)進(jìn)行處理,而數(shù)據(jù)的處理可以如圖6-4所示。數(shù)據(jù)位置://DATA//D06//lr.txt 圖6-4 數(shù)據(jù)示例從圖6-4可以看到,“|”分割了y值與x值,而不同的x之間通過“,”進(jìn)行分割。具體程序如程序6-3所示。代碼位置://SRC//C06// LinearRegression2.scala程序6-3 線性回歸實(shí)戰(zhàn)import org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}

object LinearRegression { val conf = new SparkConf() //創(chuàng)建環(huán)境變量 .setMaster("local") //設(shè)置本地化處理 .setAppName("LinearRegression2 ") //設(shè)定名稱 val sc = new SparkContext(conf) //創(chuàng)建環(huán)境變量實(shí)例

def main(args: Array[String]) { val data = sc.textFile("c:/lr.txt") //獲取數(shù)據(jù)集路徑 val parsedData = data.map { line => //開始對(duì)數(shù)據(jù)集處理 val parts = line.split('|') //根據(jù)逗號(hào)進(jìn)行分區(qū) LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(',').map(_.toDouble))) }.cache() //轉(zhuǎn)化數(shù)據(jù)格式 //建立模型 val model = LinearRegressionWithSGD.train(parsedData, 200,0.1) val prediction = model.predict(parsedData.map((_.features)))//檢驗(yàn)測(cè)試集數(shù)據(jù)prediction.foreach(obj => println(obj)) //打印原測(cè)試集數(shù)據(jù)使用模型后得出的結(jié)果 println(model.predict(Vectors.dense(0,1))) //提供新的待測(cè)數(shù)據(jù) }

}結(jié)果請(qǐng)讀者自行驗(yàn)證完成。6.3.3 對(duì)擬合曲線的驗(yàn)證上一節(jié)中,筆者通過數(shù)據(jù)擬合出了每個(gè)元素對(duì)應(yīng)系數(shù),根據(jù)系數(shù)的確定可以定義出回歸曲線公式。而至于根據(jù)系數(shù)擬合出的公式是否符合真實(shí)的數(shù)據(jù)表現(xiàn)則需要另外一個(gè)檢驗(yàn)標(biāo)準(zhǔn)。均方誤差(Mean Squared Error,MSE)是衡量“平均誤差”的一種較方便的方法,可以評(píng)價(jià)數(shù)據(jù)的變化程度。均方根誤差是均方誤差的算術(shù)平方根。標(biāo)準(zhǔn)誤差定義為各測(cè)量值誤差的平方和的平均值的平方根。設(shè)n個(gè)測(cè)量值的誤差為θ1、θ2……θn,則這組測(cè)量值的標(biāo)準(zhǔn)誤差σ計(jì)算公式如下: 數(shù)理統(tǒng)計(jì)中均方誤差是指參數(shù)估計(jì)值與參數(shù)真值之差平方的期望值,記為MSE。MSE是衡量“平均誤差”的一種較方便的方法,MSE可以評(píng)價(jià)數(shù)據(jù)的變化程度,MSE的值越小,說明預(yù)測(cè)模型描述實(shí)驗(yàn)數(shù)據(jù)具有更好的度。與此相對(duì)應(yīng)的,還有均方根誤差RMSE、平均百分誤差等。因此,為了衡量數(shù)據(jù)預(yù)測(cè)結(jié)果與真實(shí)結(jié)果之間的差異,可以使用MSE來計(jì)算相關(guān)的預(yù)測(cè)誤差。代碼如下:val valuesAndPreds = parsedData.map { point => { val prediction = model.predict(point.features) (point.label, prediction) }}

val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2)}.mean()我們可以將這些代碼添加到已有的程序代碼中計(jì)算回歸曲線的MSE,具體程序如程序6-4所示。代碼位置://SRC//C06// LinearRegression3.scala程序6-4 計(jì)算回歸曲線的MSEimport org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint,

網(wǎng)友評(píng)論(不代表本站觀點(diǎn))

來自匿名用**的評(píng)論:

書的內(nèi)容講得不錯(cuò)

2017-05-30 13:49:03
來自匿名用**的評(píng)論:

好書,質(zhì)量很高

2017-07-01 10:46:31
來自匿名用**的評(píng)論:

包裝有破損

2017-09-27 20:06:29
來自無昵稱**的評(píng)論:

第一版就賣的不錯(cuò),,, 好書

2017-09-30 09:46:43

免責(zé)聲明

更多出版社