天天看點

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

畢 業 設 計(論 文)

題   目:    基于Spark機器學習的電商推薦系統的設計與實作

這是我去年大學畢業時做的畢業設計論文,全文三萬多字,知網查重對重複率1%,由于大學論文不會被發表到知網上,再加上我已畢業近一年,現在将論文發表到CSDN。如有需要做畢設論文可引用本文對内容,先到先得(内容純原創,少有重複)。

由于作者對水準有限,文章中難免有錯誤對内容或作者對相關技術有錯誤對見解,望讀者予以諒解,謝謝!

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

接上篇文章:電商推薦系統(下):實時推薦服務、實時架構、實時推薦算法、擷取使用者的K次最近評分、商品推薦優先級、實時系統聯調、更新實時推薦結果

摘要

本論文作者在2019年11月到2020年5月期間在中國民營企業500強(2019年胡潤榜)公司“深圳傳音控股股份有限公司(上海)”參加大資料平台開發實習,主要負責資料倉庫上層資料的ETL、解析等開發任務。作者所在的公司是一家移動網際網路行業的公司,主營業務為非洲智能手機研發、生産、銷售、智能軟體研發等,公司在2019年間完成了全球1.37億部智能手機的出貨量,該年的智能手機銷量位居世界第四。在這個年代,大資料正随着網際網路使用者資料的興起而蓬勃發展。智能手機裝置每天會産生大量的資料,而智能手機使用者每天的各種資料也随着使用者量和使用者對手機的使用頻率而劇增。作者在參加實習前就曾通過學校或自學網課視訊學習了大資料相關技術棧,研讀過很多大資料技術資料。在實習期間通過實習鞏固了大資料技術,有一定的海量資料批處理、實時計算和資料挖掘經驗。此外,作者還曾對電商行業的一些業務有深入研究。電商行業是當今時代的熱門行業,作者希望通過大資料技術實作電商推薦系統,以幫助推動電商行業的發展。

近些年來,電商、大資料逐漸成為當今時代資訊技術發展的主題,基于大資料應用技術實作的電商推薦系統逐漸成為各大電商平台研究推薦系統服務的重點。阿裡巴巴集團創始人馬雲也多次對外界強調阿裡巴巴是一家大資料公司而不是電商企業,這足以說明資料是電商行業的命脈,可見大資料在電商行業中的重要性。然而,如何處理海量的使用者行為資料,從使用者行為中挖掘出使用者的商品購買偏好是所有電商平台的重點難題,至今沒有一家公司能做到推薦服務100%準确。在新的大資料時代裡,一款名為Spark的大資料計算架構如同它的名字一樣讓星星之火照亮整個大資料世界,Spark以高效的海量資料處理能力等諸多優點,現已成為衆多電商平台實作推薦服務的首選技術架構。SparkMLlib是Spark的機器學習庫,本文會重點介紹SparkMLlib在電商行業中的具體實作,此外還對SparkSQL、SparkStreaming、微服務、非關系型資料庫等技術做簡單介紹,通過使用多項技術,查閱大量相關開源貢獻資料,綜合完成基于Spark機器學習的電商推薦系統的設計與實作。

關鍵詞:Java;電商;Scala;微服務;大資料;機器學習;Spark;推薦系統;資料挖掘 

(此處省略英文翻譯)

目錄

第1章 緒論    1

1.1 選題背景    1

1.2 本課題研究的意義    1

1.3 國内外研究現狀    2

1.3.1 國外研究現狀    2

1.3.2 國内研究現狀    2

1.4 論文的主要内容及組織結構    3

第2章 相關理論及技術    4

2.1 JavaEE技術    4

2.1.1 SpringBoot後端架構    4

2.1.2 AngularJS前端架構    4

2.2 資料庫    4

2.2.1 MongoDB    4

2.2.2 Redis    5

2.3 日志采集與消息緩沖    5

2.3.1 Flume-ng    5

2.3.2 Kafka    5

2.4 Spark技術棧    5

2.4.1 Scala    6

2.4.2 SparkSQL    6

2.4.3 SparkMLlib    6

2.4.4 SparkStreaming    6

2.5 推薦算法    6

2.5.1 統計分析算法    7

2.5.2 ALS交替最小二乘算法    7

2.5.3 過拟合與欠拟合    7

2.5.4 正則化項    8

2.5.5 協同過濾算法    8

2.5.6 實時推薦算法    9

2.5.7 其他推薦算法    9

2.6 Linux系統    9

2.6.1 CentOS虛拟機    9

2.6.2 雲主機    9

2.7 未來技術選型    10

2.7.1 EMR-Hadoop    10

2.7.2 Hive    10

2.7.3 Flink    11

2.7.4 Dubbo與SpringCloud    11

2.7.5 使用者畫像    12

第3章 系統可行性分析和需求分析    14

3.1 系統可行性分析    14

3.1.1 技術可行性    14

3.1.2 經濟可行性    14

3.1.3 操作可行性    15

3.2 系統需求分析    15

3.2.1 JavaEE業務功能需求    15

3.2.2 商品推薦服務功能需求    16

第4章 系統方案的設計    17

4.1 系統功能設計原則    17

4.1.1 微服務    17

4.1.2 MVC架構    18

4.1.3 系統的可靠性    18

4.1.4 系統的維護性    19

4.2 項目架構設計    19

4.3 JavaEE子產品的設計    20

4.3.1 前端子產品的設計    20

4.3.2 後端子產品的設計    21

4.4 資料倉庫設計    21

4.4.1 業務資料庫    21

4.4.2 緩存資料庫    22

4.4.3 業務資料表的設計    22

4.4.4 系統資料流程設計    25

4.5 離線推薦子產品的設計    26

4.5.1 離線統計推薦子產品的設計    26

4.5.2 離線個性化智能推薦子產品的設計    26

4.6 實時推薦子產品的設計    27

第5章 推薦算法設計    1

5.1 離線統計推薦算法設計    1

5.1.1 曆史熱門商品統計推薦算法設計    1

5.1.2 近期熱門商品統計推薦算法設計    1

5.1.3 商品平均評分統計推薦算法設計    2

5.2 離線個性化智能推薦算法設計    2

5.2.1 計算使用者商品推薦清單    2

5.2.2 模型評估和參數選取    4

5.2.3 計算商品相似度矩陣    4

5.3 實時推薦算法設計    4

5.3.1 實時推薦算法思想    5

5.3.2 初步計算備選商品的推薦優先級    6

5.3.3 計算偏移項    6

5.3.4 計算備選商品的最終推薦優先級    6

5.4 其他推薦算法    6

5.4.1 基于内容的相似推薦算法    6

5.4.2 基于物品的協同過濾相似推薦算法    7

5.4.3 使用者畫像系統算法    7

第6章 系統實作    8

6.1 前端使用者系統實作    8

6.1.1 登入注冊子產品的實作    8

6.1.2 商品頁功能的實作    8

6.2 推薦系統服務環境搭建    9

6.2.1 環境準備    9

6.2.2 Linux虛拟機搭建    10

6.2.3 安裝架構元件    10

6.2.4 建立微服務項目    12

6.2.5 建立推薦服務子子產品    14

6.3 離線統計推薦系統實作    16

6.3.1 曆史熱門商品統計    17

6.3.2 最近熱門商品統計    17

6.3.3 商品平均得分統計    18

6.4 基于隐語義模型的協同過濾推薦    20

6.4.1 計算使用者商品推薦清單    20

6.4.2 模型評估和參數選取    21

6.4.3 計算商品相似度矩陣    22

6.5 實時推薦系統實作    24

6.5.1 實時推薦功能的實作    26

6.5.2 商品推薦優先級計算    26

6.5.3 更新實時推薦結果    28

6.6 背景服務系統實作    28

6.6.1 背景系統注冊登入子產品實作    28

6.6.2 背景商品模糊查詢功能實作    28

6.6.3 背景使用者評分日志子產品的實作    29

6.7 系統測試    30

6.7.1 系統示範    31

6.7.2 冷啟動問題    33

第7章 總結    34

7.1 課題總結    34

7.2 項目亮點    35

7.2.1 使用高效率的JavaEE架構    35

7.2.2 使用Spark作為推薦服務工具    35

7.2.3 使用多種智能推薦算法    35

7.2.4 使用非關系型資料庫替換傳統資料庫    36

7.3 存在的問題    36

7.3.1 研究更準确的推薦算法    36

7.3.2 研究更高效的實時推薦架構    36

7.3.3 提升系統性能    36

緻謝    38

參考文獻    39

第1章緒論

1.1選題背景

截止2020年1月1日,阿裡巴巴集團宣布淘寶使用者已突破8億,并且中國新零售市場月活躍使用者超過8.24億。網絡資源在日益豐富,電商使用者尤其是有“選擇困難症”的人群要在海量的商品中挑選出自己喜歡的商品已經是一件非常困難的事。随着電商行業現在的“資訊過載”現象日益嚴峻,使用電商推薦系統如何給使用者精準推薦商品已經成為電商平台的重要難題。電商推薦系統的出現就是為了解決電商行業難以實作精準營銷的情況,即使用技術幫助使用者在海量商品中挑選出最合适、最喜歡的商品,為使用者節省浏覽商品的時間,豐富使用者的個性化消費購物體驗,同時為賣家提升商品的銷量[1]。電商推薦系統現今日益受到各大電商平台開發者的青睐,也受到越來越多專家學者和推薦系統研究者的關注。

而實作電商推薦系統的技術選型也尤為重要,需要考慮系統的運作效率、推薦結果的準确性。經過對比後,本課題選用目前最為先進的推薦技術,即Spark架構,SparkMLlib就是Spark機器學習庫,它本次課題項目實作的核心元件。

1.2本課題研究的意義

本課題采用Spark全棧技術實作商品的個性化推薦,借助大資料項目常用的一些工具,使JavaEE系統部署業務服務,将個性化推薦作為電商網絡營銷的一種新的手段,能為電商公司帶來巨大的利潤。國内最大的電商平台——阿裡巴巴(淘寶)自從使用了電商推薦服務以後,淘寶的商品關聯支付轉化率提升了近100%,商品的客單價提升了29%,可見推薦系統在電子商務實作精準營銷[2]技術研究中的重要意義。

電商推薦系統的目标是根據使用者浏覽商品以及對商品評分等行為,以此推測使用者對其他相似商品的喜好程度,智能預測符合使用者口味偏好的商品,并将推薦結果展示給使用者[3]。可想而知,系統僅僅可通過使用者近期浏覽過的商品和對商品的評分情況就能知道使用者喜歡什麼樣的口味、價位、品質等因素的商品,可以減少使用者浏覽商品的時間,而這樣的推薦系統,一定會受到電商平台和電商使用者的青睐。是以,有了電商個性化推薦系統和準确度較高的推薦算法,能為電商企業和消費者提升粘合度,達到商品的“精準營銷”的目的,不僅能給電商平台提升市場競争力,而且給使用者提升網上購物的消費體驗,實作電商交易的“雙赢”。

1.3國内外研究現狀

電商的概念最先起源于國外,而自從20世紀末以來電商在國内開始發展。直到現在,國外的亞馬遜、EBay,國内的淘寶、天貓商城、京東、拼多多等電商大廠都賺的盆滿缽滿。

1.3.1國外研究現狀

國外早在1994年就有人設計了新聞推薦系統,随後,全球著名的電商巨頭亞馬遜Amazon公司将推薦系統應用在了電商中,通過使用者近期購買、浏覽商品的行為猜測使用者喜歡什麼樣的商品并推薦給使用者[1],這為今後二十多年的推薦系統發展産生了巨大的影響。

2006年Netflix通過懸賞百萬美金大賽尋求将推薦算法的準确度提升10%以上的參賽者,重賞之下必有勇夫,從那以後各種高準确度的推薦算法就如同雨後春筍般湧現出來。雖然現在推薦系統在全球範圍都在使用,在國外的電商推薦系統中主要是基于使用者的點選、浏覽、購買商品等行為預測使用者是否喜歡該商品[4]。但是,如何提高推薦的準确度是各大電商公司都在思考的話題,是以,無論什麼年代都要研究準确度更高的推薦算法。

1.3.2國内研究現狀

與國外相比,雖然國内電商推薦系統的研究起步較晚,但是國内電商推薦系統發展速度較快,再加上目前使用者的資料量過大以及技術的不斷更新與疊代,國内各大電商企業對電商推薦系統的研究也越來越多。自從亞馬遜公司将個性化電商推薦系統的成功應用以後,全球的電商推薦系統開始蓬勃發展,國内以阿裡巴巴為首的電商巨頭逐漸将商品推薦服務有原來的推薦算法發展到現今的“千人千面”的個性化精準智能推薦[2]。此外,國内的其他巨頭企業如百度、騰訊、頭條等公司都在發展電商業務,也在研究電商推薦系統。

2006年,國内的當當網首次使用個性化圖書商品推薦系統,将書籍的給類資訊智能推薦給使用者,當時就收到很多讀者使用者的青睐;2008年,淘寶網也推出自己的電商個性化推薦服務子產品“i淘寶”,這款産品可以根據使用者對商品的浏覽情況,短時間為使用者找到自己喜歡的商品以及可能感興趣的東西[4],這就是淘寶電商推薦系統的雛形;2011年,百度也推出了搜尋引擎的個性化推薦技術“一人一世界”,這個功能為百度積累使用者的行為資料,友善于機器學習進行模型訓練,為不同使用者推薦不同的個性化内容;2016年,阿裡巴巴的算法團隊YunOS在ACM大賽上獲得金牌。由此可見,國内在電商推薦系統的研究現今已經不遜色于國外。

1.4論文的主要内容及組織結構

本文将在第二章介紹實作基于Spark機器學習的電商推薦系統的設計原理與架構介紹,包括項目的整體架構、JavaEE介紹、資料庫介紹、日志采集技術介紹、Spark技術棧介紹、Linux介紹等。由于電商推薦系統的原理包含多個方面,第二章結尾還将介紹項目的未來技術選型以及發展規劃。在第三章中,本文将對電商推薦系統項目進行系統可行性分析與需求分析,以了解使用者的需求和系統實作的可行性。在第四章裡将介紹系統的設計方案,并在第五章中,文章會詳細介紹系統的實作流程,包括JavaEE項目實作、統計推薦實作、基于隐語義模型協同過濾算法的實作、實時推薦以及其他推薦算法等等。在第六章對搭建商推薦系統的設計與實作進行全文總結,并在第七章對本次畢業設計畢業設計期間為我提供幫助的老師、同學們、實習公司以及全球開發者的開源貢獻表示感謝。

本文不講解大資料、人工智能、資料庫相關的理論概念,若讀者對相關技術概念還很陌生的話,請讀者先參考其他相關的文章了解大資料與人工智能相關的技術理論。

在文章的結尾列舉了設計與實作電商推薦系統的一些參考文獻,需要特别聲明的是,大資料、機器學習資料挖掘、資料采集等相關技術棧是近期來新興起的技術,電商推薦系統目前還僅僅是一些電商網際網路巨頭企業才用得起的技術,當今無論國内還是國外都鮮有此類文獻發表,學習相關技術主要依賴于官網的開源貢獻文檔。是以,本論文作者希望讀者多參考如Apache Spark官網這樣網站。在此,本文筆者祈願能有更多的開發者或相關文獻作者能早日在“大資料與機器學習”這塊“新大陸”上創造出相關文獻資料,為全球大資料、人工智能與電商行業的發展添磚加瓦。

第2章

相關理論及技術

2.1JavaEE技術

作為連續幾年蟬聯全球開發者使用頻率最高的一門語言,Java是衆多企業進行企業級項目開發的首選。由于其跨平台性、高效的計算性能,以及全球衆多開發者在類庫和架構方面的開源貢獻,Java語言是本次課題項目實作處理系統綜合業務的首選,此次選擇的微服務架構是SpringBoot。

2.1.1SpringBoot後端架構

SpringBoot是Spring全家桶中的架構成員之一,也是當今最流行的JavaEE架構之一。它相當于以前流行的Spring架構的簡化版,使用SpringBoot開發JavaEE項目實作成本低,項目運作效率高,并且支援高并發的運作環境,現在深受企業級Java項目開發者的喜愛。

2.1.2AngularJS前端架構

AngularJS是谷歌公司的開源架構之一,主要被用于前端開發,底層采用JS語言編寫,由于本文項目采用的是微服務技術,前後端分離,是以可選擇AngularJS作為前端架構,由前端程式員開發。

2.2資料庫

本課題項目選擇非關系型一來是非關系型資料庫逐漸有取代關系型資料庫的趨勢,二來是大資料環境下業務的需要,具體會在文章後文進行說明。

2.2.1MongoDB

MongoDB是采用C++語言編寫的文檔型非結構化資料庫,由于它存儲的資料是JSON格式,并且性能比較好,現在逐漸被衆多公司所采用。本課題項目的電商推薦系統摒棄了傳統的關系型資料庫(如Oracle、MySQL、SQL Server)而采用MongoDB作為業務資料庫,不僅是考慮到MongoDB能存儲大量的小檔案,并且對存儲海量資料有着非常好的支援,還考慮後期将業務資料導入到Hadoop、Hive表(底層資料存儲在Hadoop-HDFS或AWS-S3上)的簡便性,同時,MongoDB在安裝和運維上也相對傳統的關系型資料庫更為簡單。

2.2.2Redis

與MongoDB相同,Redis也是一種非結構化資料庫,但是Redis是一種基于記憶體的緩存資料庫,它的讀寫性能極高。現在衆多企業也在使用Redis,本文的電商推薦系統就是借助Redis存儲和傳輸實時資料用于實時推薦子產品。

2.3日志采集與消息緩沖

在大資料實時計算中,資料的實時性非常重要,是以需要有日志采集與消息緩沖服務,在大資料環境中常用的日志采集與消息緩沖服務元件分别是Flume與Kafka。

2.3.1Flume-ng

Flume是一種被用于資料采集的架構,主要通過類似管道的形式采集與發送資料,它具有很強的拓展性與良好的容錯性等諸多優點[5],成為大資料行業中必備的工具之一。本文的電商推薦系統通過Flume采集Nginx收集到的埋點資料,實時發送給Kafka。

2.3.2Kafka

與Flume不同的是,Kafka更做适合下遊的資料消費,而Flume更做适合上遊的資料采集,但是也有公司使用Kafka采集資料發送到Flume。本文的電商推薦系統使用Kafka廣播資料傳到SparkStreaming進行實時計算。

2.4Spark技術棧

Spark于2014年被加州大學開源捐贈給Apache基金會,随後其火熱程度就如它的名字一樣以星星之火迅速燎原,不到一年就成為Apache的頂級項目[6]。從被開源至今僅6年的發展曆史,它雖然非常火爆,但是迄今為止Spark相關的期刊論文還是極少,研究相關的技術主要依賴于官網及其他開發者的部落格貢獻,是以本文的參考文獻以Apache Spark官網為主。

在Spark Core的基礎上,Spark技術棧包含的元件有SparkSQL、SparkStreaming、SparkMLlib和GraphX,它們分别被用于離線互動式計算、實時流失計算、機器學習、圖計算[7]。由于本課題電商推薦系統沒有使用到圖計算相關的技術,是以本次不介紹和使用GraphX。

2.4.1Scala

Scala是一種類似于Java但文法比Java簡單的語言。Scalac會通過類似Javac編譯器将Scala語言編譯成.class檔案,是以,Scala可以是一種能“運作在JVM上的語言(說法不準确)”,它的運作效率和Java相當[7],主要被用在大資料行業。此外,本文的電商推薦系統使用的Spark架構正是用Scala編寫的,是以,本課題項目使用Scala語言寫電商推薦系統的推薦服務。

2.4.2SparkSQL

SparkSQL是Spark架構的元件之一,它可以充當分布式SQL查詢引擎,也可以通過使用DataFrame或DataSet對大資料進行開發,主要被用于互動式計算[7]。本課題項目選擇SparkSQL來處理電商推薦系統的統計推薦服務,一方面是因為SparkSQL開發起來比Hadoop的MapReduce簡單,二是因為Spark(基于記憶體)的運作速度比MapReduce(基于磁盤,有頻繁的I/O操作)更快[7],Spark是衆多公司的大資料開發處理資料的首選。

2.4.3SparkMLlib

SparkMLlib也是Spark架構的元件之一,全稱為“Spark machine learning library”,即Spark的機器學習庫[9],它降低大資料與人工智能技術之間的技術成本。雖然Hadoop也提供了機器學習庫——Mahout[10],但是人們更喜歡用SparkMLlib。SparkMLlib包含了一些如聚類、分類、回歸、協同過濾、分類等機器學習算法[8],本文的電商推薦系統的個性化推薦服務主要借助于SparkMLlib的協同過濾算法實作。

2.4.4SparkStreaming

SparkStreaming也是Spark架構的元件之一,它被用于大資料的流式處理實時計算[11]。課題項目電商推薦系統就是借助SparkStreaming接收Kafka的實時資料,再借助推薦算法完成實時推薦服務。

2.5推薦算法

推薦算法是實作電商推薦系統的推薦功能的核心,也是本課題項目的關鍵所在,本項目包含統計分析、機器學習智能推薦和實時推薦算法,下面将對相關算法做簡要說明。

2.5.1統計分析算法

統計推薦子產品使用SparkSQL進行統計分析實作,僅僅需要在Spark腳本程式中寫SQL和UDF函數(用于處理資料的自定義函數)即可,具體的算法實作有SparkSQL封裝的函數完成,在此不對該算法做重點介紹,讀者感興趣的話可以研讀SparkSession.sql()函數中具體算法的實作流程。

2.5.2ALS交替最小二乘算法

ALS(alternating least squares,交替最小二乘法)是一種常常被用于推薦系統中的算法,該算法的核心原理就是将一個矩陣分解成兩個包含隐特征的矩陣。與傳統的矩陣分解算法SVD相比,ALS算法能解決資料中的缺失項問題。

電商推薦系統會使用ALS算法進行模型訓練,通過計算将使用者(行)-商品(列)-評分(值)矩陣R(m×n)分解成兩個低次元的使用者對商品隐特征偏好矩陣X(m×k)和商品包含的隐特征矩陣Y(n×k),在計算的過程中,為使分解後的矩陣X與Y相乘後更接近于R,需要計算損失函數,具體算法會在後文中介紹。

2.5.3過拟合與欠拟合

計算損失函數的算法就是計算方差,即真實值減去預測值後計算平方取平均值以後再開方。但是這個方內插補點并不是越低越好:若損失函數值偏大,則拟合度不夠;若損失函數過小(趨近于0),則出現過拟合問題。

什麼是過拟合與欠拟合?過拟合就是特征集過大,導緻系統不能很好地識别資料,如果一味地追求預測能力,則很容易出現過拟合問題;而欠拟合就是特征集過小,模型不能很好地拟合資料。

如圖2-1所示,“人工智能之父”艾倫·圖靈曾以一片樹葉做形象地比喻:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 2-1過拟合與欠拟合

套用毛澤東的話說:“每片樹葉都不同”。通俗地講,在人工智能領域裡,若模型訓練出現過拟合問題,則機器學習識别人臉的時候,若此人化妝了,或者是雙胞胎兄弟姐妹,程式就識别不出來,此時僅能識别本人剛剛被拍照的樣子。若模型訓練出現欠拟合的問題,則機器學習識别人臉的時候,會把猴子、大猩猩甚至其他動物識别成人,這樣的識别效果自然不言而喻。

2.5.4正則化項

正則化是風險最小化的實作,它是模型複雜度的單調遞增函數,即在風險上增加一個正則化項或者罰項,模型越複雜,正則化項的值也就也大。

通俗地講,電商推薦系統的訓練模型越複雜,就越有可能出現過拟合的問題,是以正則化項系數也就越大。那麼此時損失函數的計算結果就不可能小,是以使用正則化項可以降低複雜模型的複雜度,進而避免出現過拟合的現象。

2.5.5協同過濾算法

協作過濾算法通常用于推薦系統。這些技術旨在填充使用者項關聯矩陣的缺失條目。 SparkMLlib目前支援基于模型的協作過濾,其中通過一小部分潛在因素來描述使用者和産品,這些潛在因素可用于預測缺少的條目。SparkMLlib使用交替最小二乘(ALS)算法來學習這些潛在因素,本課題項目使用基于隐語義模型協同過濾算法計算使用者推薦清單和商品推薦清單,具體實作算法将在後文說明。

2.5.6實時推薦算法

實時推薦算法主要依托于離線推薦的計算結果,推薦清單具備實時性,并且更新推薦結果的速度快。推薦原理是根據離線智能推薦計算的商品預測評分與使用者對商品的真實評分相乘再取平均值,進而得出候選商品的推薦優先級。此外,還要考慮使用者對商品的好評與差評對商品實時推薦清單優先級的影響。

2.5.7其他推薦算法

其他的混合推薦算法主要包含基于内容的推薦、基于物品的協同過濾推薦和借助使用者畫像系統實作推薦。除使用者畫像系統以外,具體算法将在後文中簡單地做介紹。

2.6Linux系統

Linux有基于商業開發版如Redhat Linux和社群開發版如CentOS(RedHat簡化免費版),由于其免費、開源、穩定等諸多優點,Linux系統是衆多企業部署項目的首選,而本課題項目電商推薦系統的大部分元件(如Flume、Kafka)更适合在Linux系統中運作,項目的開發環境在Windows系統中,Spark生态系統元件運作在Linux系統中。

2.6.1CentOS虛拟機

由于CentOS是一款免費、開源的Linux社群版,本課題項目選擇CentOS6.8版本的Linux作業系統部署電商推薦系統項目。本課題項目目前僅需在本地部署實作運作,無需部署上線,是以,需要在Window作業系統中搭建CentOS Linux虛拟機用來部署電商推薦系統。

2.6.2雲主機

雲主機産品來自于雲計算平台,主要包含公有雲和私有雲。在公司的大資料平台中,推薦使用亞馬遜雲或私有雲,但是本課題項目電商推薦系統對使用者資訊資料安全比較重要,而使用者使用者行為資料安全就沒那麼重要了。是以,可以使用私有雲存儲使用者資訊資料,使用公有雲存儲使用者使用者行為資料。

2.7未來技術選型

大資料、人工智能資料挖掘這些技術是近幾年開始火起來的新技術,由于時代的發展和技術的更新疊代,勢必将會使用新技術來取代舊技術,下面就以目前時間背景下的電商推薦系統的未來技術選型做簡單的介紹。

注意本課題項目設計時間為2019年9月,論文送出時間為2020年5月,本文中的“未來”是以論文送出時間為起點,以下技術也許将在多年以後被淘汰,僅以目前時間點為參考。

2.7.1EMR-Hadoop

盡管Spark生态系統先進已經非常強大,甚至可以獨立于Hadoop運作,但是如果本課題項目采用Yarn排程Spark任務的話,Spark的運作效率可能會比部署在本地(local)更高一些。此外,Spark目前還沒有像HDFS(即Hadoop Distributed File System)那樣的資料存儲系統[12],本課題項目電商推薦系統的業務資料目前還存儲在MongoDB中,在未來的電商推薦系統架構中,本課題項目需要将資料存儲在多台不同的機器上,未來會用到Hadoop或EMR。

Yarn、HDFS都是Hadoop架構的元件,此外還有MapReduce[13],在現今衆多企業中還在使用HDFS存儲資料。是以,使用Hadoop架構還是很有必要的。

Amazon EMR是全球領先的雲計算大資料平台,它能和Apache Spark、Hive、HBase、Flink等大資料元件相容,Amazon S3可以取代Hadoop的HDFS來存儲海量分布式資料,是以,本文的電商推薦系統在未來可以選取EMR雲大資料服務。

EMR-Hadoop是Amazon EMR對Hadoop的封裝,保留Hadoop的功能不變,使用Amazon S3存儲資料,使用Hadoop的Yarn作為排程器。

2.7.2Hive

Hive是由FaceBook公司開發的一款大資料分析工具,Hive通過建立映射關系存儲資料,它的底層通過将Hive SQL轉換成MapReduce程式處理和分析資料,具有低延遲高效率等優點。在本文的電商系統的未來架構規劃中,免不了要使用Hive建表和資料分析,是以,未來需要使用Hive。

2.7.3Flink

本文的電商推薦系統既然使用Spark架構,為什麼還要使用Flink?因為Flink是一款純流式計算架構,而Spark的流式處理架構SparkStreaming還隻是微批處理思想[14],在實時性要求更高的情況下,使用Flink處理實時計算任務效率更高。此外,Flink還對離線計算、機器學習這方面技術有着很好的支援。

既然Flink這麼優秀,為什麼現在不使用Flink呢?Apache Flink是一款新架構,在穩定性以及安全性等多方面目前還有待考證,未知Bug可能比較多。另一方面,在對資料量大的資料處理和曆史資料互動查詢計算方面,Spark的表現還是非常優秀的,是以,本課題項目推薦系統目前使用Spark架構。

2.7.4Dubbo與SpringCloud

Apache Dubbo是阿裡巴巴公司開發并捐給Apache的一款開源RPC架構,它在分布式與微服務系統中被廣泛應用,曾經風靡國内乃至全球。Dubbo曾在2014年停止更新,一度讓Dubbo開發者和愛好者失落,而在2018年Dubbo傳來繼續更新的消息,Dubbo再次吸引了衆多開發者的關注,Dubbo是電商推薦系統的未來技術架構選型之一。

SpringCloud是一款微服務架構,本課題的電商推薦系統是使用SpringBoot作為業務服務,而SpringCloud對SpringBoot靈活地架構支援,項目後期會使用SpringCloud。

與Dubbo相比,盡管SpringCloud目前對資源的消耗更高,效率更低,但是SpringCloud支援的核心功能比Dubbo多,且開發難度比Dubbo小,目前很多公司的微服務架構都從Dubbo往SpringCloud方向遷移。

在未來的架構設計中,将設計電商微服務系統,現在的電商推薦系統将作為電商系統的一個子子產品為電商業務服務,其中的使用者對商品的偏好資訊主要來源于使用者對商品的浏覽以及使用者對商品的購買情況,采用代理鍊條模式,借助SpringCloud實作微服務電商系統,未來的電商微服務系統設計圖如圖2-2所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 2-2未來架構:SpringCloud代理鍊條設計模式

在未來的電商微服務系統中,采用Consumer管理注冊中心,分别管理User服務、Product服務、Recommend服務、Order服務、Trade服務。每個服務子產品功能高度内聚,分别負責各自的服務子產品,不同的服務子產品之間借助Consumer通信。當使用者使用電商微服務系統時,通過User服務實作注冊登入,完成以後方可浏覽Product服務中的商品;使用者浏覽商品以後将浏覽行為資訊通知給Recommend服務實作浏覽推薦功能;若使用者對商品下訂單,Order子產品将通知Recommend子產品實作購買推薦;若使用者通過Trade子產品完成了對訂單支付,則Trade子產品通知Order子產品更新訂單支付結果,并通知Recommend子產品提升已支付訂單中商品的推薦優先級。

2.7.5使用者畫像

使用者畫像技術是一種能有效預測使用者對商品的喜好的技術,它能根據使用者的衆多行為虛構出使用者的“形象”,如圖2-3所示。比如:性别、年齡、婚否、育否、收入、消費能力、消費價位、消費口味等等标簽,即使用者資訊“标簽化”,進而提升電商推薦系統的推薦準确度[15]。比如使用者為男性、青少年,使用者在搜尋“服裝”的時候就不會被推薦到女裝、老年服裝等等商品。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 2-3使用使用者畫像對使用者進行聚類分析

在後期的電商推薦系統設計中,将會對使用者進行聚類分析,給每位使用者建構一個虛拟的“模型”,進而提升電商推薦系統的推薦準确度。此外,使用使用者畫像技術在使用者首次注冊時手機使用者的購物偏好标簽,進而解決電商推薦系統的“冷啟動”問題(文章後面會介紹),使電商推薦系統能懂使用者的“初心”,由于課題主題與使用者畫像無關,本文不對使用者畫像技術的具體實作做介紹。

第3章

系統可行性分析和需求分析

本課題項目要明确電商平台的使用者需求,對使用者的需求進行合理性的分析,如果需求合理,方可對推薦系統進行開發。

3.1系統可行性分析

系統的可行性分析是衡量系統是否可實作的重要名額,主要包含以下三點:

3.1.1技術可行性

系統目前借助Angular實作使用者的可視化,由于項目前後端分離,未來會考慮微信與支付寶小程式、安卓、IOS等使用者可視化服務的開發;綜合業務層采用JavaEE的SpringBoot微服務實作,部署在Tomcat上;資料存儲部分借助于MongoDB和Redis;離線推薦部分采用SparkSQL與SparkMLlib實作;實時推薦部分采用Flume-ng對使用者評分行為資料進行采集,采用Kafka作為流式消息緩沖,将資料推送到SparkStreaming進行實時推薦。

在研究這個課題的時候,作者使用的開發環境是Windows10作業系統,最終将項目部署到單節點僞分布式Linux作業系統中,Linux系統采用8G記憶體+8核16線程的CPU+500G磁盤,系統運作正常。

這些技術是當今前沿新技術,尚存在很多未知Bug,但項目選擇比較穩定的版本,是以在開發中很少存在問題。

3.1.2經濟可行性

系統的經濟可行性分析是衡量系統能否實作的重要标準,是企業開發資訊系統對經濟花費進行評估的前提,包括人力、物力、投資成本等諸多方面,同時考慮使用系統以後可能帶來的收益。是以,務必在系統實施之前對系統進行經濟可行性分析後方可進行系統開發。

本課題項目雖然使用了很多新技術架構,如Apache基金會的項目、SpringFrameWork,但是這些架構全部都是開源的,在選擇項目架構上完全是“0成本”。由于使用電商推薦系統的過程中可能會有系統運維上的成本,但由于大資料技術可以使用Zookeeper(上述架構中未描述)搭建高可用,在分布式系統中某個節點當機後,系統還能正常運作而不受任何影響,以確定系統的穩定性,降低運維成本。

在技術可行性分析中提到,目前采用的單節點Linux伺服器成本并不高,但随着後期将電商推薦系統項目上線後,未來會搭建分布式系統,擴大系統可用磁盤空間、記憶體空間、CPU核數等等,也會搭建分布式檔案系統、記憶體叢集與CPU叢集等等,這些開銷将會根據公司上線項目的具體業務進行計算,但總體成本遠比項目收入低。

盡管現在國内外很多大公司(如阿裡巴巴、亞馬遜)的電商推薦系統做得已非常成熟,但我此次研究推薦系統的在一方面可以幫助衆電商平台尤其是中小企業降低個性化推薦系統的實作成本。

3.1.3操作可行性

本次課題電商推薦系統選用選用B/S的架構模式開發,由于采用了微服務技術,前後端分離,未來僅需開發小程式界面、安卓應用界面等即可實作C/S的架構模式,而不需要再次進行後端開發。是以,項目不僅降低了前端開發成本,也可以提供多個流量入口,既豐富了使用者的購物體驗,又給電商平台增加了使用者流量。

在B/S架構的基礎上,顯示層用JavaEE前端技術的AngularJS架構,使用者隻需要打開浏覽器輸入網址即可即可通路Web頁面,使用非常友善。

在未來的C/S架構的基礎上,使用者的操作更簡單了,隻需要打開電商平台APP或者打開微信、支付寶使用小程式進行本課題項目的電商平台就可以“一鍵”登入系統。

3.2系統需求分析

系統包含了多個子產品,需要對不同的子產品進行需求分析,下面簡單地介紹系統需求。

3.2.1JavaEE業務功能需求

JavaEE子產品主要用于處理使用者前後端業務互動的需求,不是本課題項目的重點,在JavaEE子產品中僅需要提供使用者注冊、登入、采集使用者行為資料和商品查詢功能。

(1)使用者注冊和登入

電商推薦系統目前隻設計使用者注冊和登入功能,使用者首次使用電商推薦系統時,使用者需要先注冊方可登入。由于新使用者尚未對任何商品有過評分和浏覽行為,系統無法預測使用者的商品口味偏好,是以需要收集使用者的偏好标簽。

(2)使用者可視化

電商推薦系統服務的使用者是普通消費者,是以需要提供JavaEE(或微信小程式、安卓界面等等)前端界面展示。

(3)埋點資料采集

使用者的每次浏覽商品、對商品進行評分等行為都會被系統記錄下來,系統将使用者的行為資料發送給推薦子產品和資料庫方可實作電商推薦系統的推薦功能[11]。

(4)商品模糊查詢

使用者登入作業系統後除了檢視推薦商品以外,還可以根據自己的購物需求查找商品。使用者不需要知道商品的詳細資訊,僅需輸入商品名稱關鍵字即可,商品模糊查詢功能可為使用者檢視商品提供便利。

3.2.2商品推薦服務功能需求

項目的核心在推薦服務功能子產品上,推薦功能主要包含離線推薦與實時推薦功能需求,項目中的資料需要被持久化,是以需要考慮資料存儲需求。

(1)資料存儲部分

存儲資料主要需要使用業務資料庫和緩存資料庫,主要有有兩點需求:

一是業務資料庫需要存儲對海量資料頻繁增删改查的支援。

二是緩存資料庫需要高效率,是其滿足實時計算的需求。

(2)離線推薦部分

離線推薦要求海量資料處理能力比較強,并且推薦準确度要高,主要有有兩點需求:

一是統計推薦需要使用能進行互動式計算處理海量資料架構。

二是機器學習個性化推薦要求推薦的準确度較高[8]。

(3)實時推薦部分

實時推薦要求高效率而不要求特别高的準确率,主要有有兩點需求:

一是日志采集和消息緩沖服務要求傳輸效率高、延遲低,避免低效率的處理速度影響使用者的購物體驗感[16]。

二是實時推薦計算架構要求計算效率高,計算的複雜度低,使計算結果能盡快被推送到前端界面。

第4章

系統方案的設計

4.1系統功能設計原則

通過以上的分析,綜合目前JavaEE開發和大資料開發行業的原則,本課題電商推薦系統設計主要遵循以下幾點原則:

4.1.1微服務

項目采用SpringBoot搭建微服務項目,微服務系統主要設計原則如下圖4-1所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 4-1商品表資料樣例

以下是微服務六大設計原則概述:

(1)高内聚低耦合

高内聚主要展現在系統的功能強度内聯系,保證系統的某個功能的各個元素之間緊密聯系[3]。除了功能内聚以外,還要保證通信、順序、邏輯等多個内聚名額。

耦合性主要展現在系統的各個子產品之間的聯系,若系統的不同子產品之間聯系很緊密,則耦合性就強,系統開發不需要這麼強的耦合性,各個子產品之間要要松耦合。

(2)高度自治

高度自治原則便于服務進行拓展開發和運作,使項目團隊對整個生命周期負責,對于不同團隊開發的子產品由各自所在的團隊進行維護和開發。

(3)以業務為中心

以業務為中心原則認為不同的服務代表不同的業務邏輯,使整個服務能快速響應和更新業務的變化。

(4)彈性設計

彈性設計原則使系統的可容錯性提高,使系統具有更強的自我保護能力。

(5)日志與監控

日志與監控原則在監控系統的時候,如果發現系統出現異常或者錯誤,能夠快速定位出錯的位置,友善排查錯誤,并且檢測可能發生的意外和錯誤,使運維人員能提前做好防範。

(6)自動化

自動化原則可以淘汰傳統的手工運維,使運維變得自動化,這樣就能極大地節約電商平台的運維成本。

4.1.2MVC架構

MVC即模型、視圖、控制器,是現今JavaEE項目開發的常用架構,在開發電商推薦系統的時候可以根據不同的技術人員的專項擅長技術進行開發。

在資料模型層模型需要将代碼實作多個視圖的複用,減少代碼的重複。

在視圖層可以開發不同的圖形界面,如JavaWeb前端、微信支付寶小程式、安卓,而實作電商推薦系統的功能主要依賴于調用後端程式API,這樣前端開發人員不用處理後端代碼,後端開發人員也不用處理前端代碼。

在業務邏輯層使用Controller控制器接受使用者不同的操作行為來處理使用者請求即可。

4.1.3系統的可靠性

在企業級JavaEE大資料項目中,經常會出現通信中斷、高并發、伺服器當機等情況,是以,務必要保證系統的可靠性。

(1)微服務的可靠性

在微服務的設計原則中提到,使用日志與監控原則能提高系統的可靠性。此外,還要對資料鍊路進行檢測,以杜絕網絡通訊時出現故障;使用斷鍊重連機制在系統斷開與用戶端連接配接後自動重連;使用消息緩存重發實作異步地發送消息;使用高并發技術使系統能承閱聽人多使用者的請求等等。

(2)大資料平台的可靠性

本課題項目電商推薦系統目前雖然是單節點僞分布式項目,如果遇到問題很容易追溯問題位置并解決問題,而在電商公司的企業級項目中,使用單節點項目是完全不可以的。在企業級電商項目中,通常使用分布式系統存儲資料和處理資料,因為資料量實在是太大了。在前面的分析中,為了保證環境系統環境的可靠性,部署分布式系統時考慮到部署HA(高可用);在此之外為了保證記憶體、CPU的可靠性,可以根據業務實際情況搭建記憶體、CPU叢集;為了保證明時推薦的可靠性,使用基于記憶體的緩存資料庫Redis作為輔助資料庫。

4.1.4系統的維護性

系統的可維護性是衡量系統在出現故障或者錯誤以後可改進的難易程度。目前電商推薦系統的可維護性包括JavaEE微服務項目的可維護性與Linux伺服器Spark生态系統的可維護性。

JavaEE子產品可由Java開發團隊進行維護,誰開發由誰維護。Spark生态系統的維護則有點複雜,如果電商企業對資料安全要求不高,可以選用公有雲如阿裡雲、百度雲、騰訊雲等公有雲平台部署項目,如果對資料安全要去較高則應當使用公司的私有雲;在技術選型上,如果電商企業有雄厚的專業運維團隊,可選取Apache Hadoop搭建Hadoop生态系統,該架構開源但維護成本高。若果如果電商企業沒有專業的運維團隊,可選取CDH(Cloudera’s Distribution Including Apache Hadoop)版本的Hadoop搭建Hadoop生态系統,該發行版部分閉源且免費,運維簡單,但如果出現故障需要Cloudare公司維護則需要支付維護費用。

4.2項目架構設計

電商推薦系統的架構主要包含四大子產品,分别是JavaEE子產品、資料庫子產品、離線推薦服務子產品、實時推薦服務子產品,電商推薦系統架構設計圖如圖42所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 4-2電商推薦系統架構設計圖

目前架構設計如下:

JavaEE前端采用AngularJS作為可視化界面,後端采用SpringBoot實作綜合業務服務,在SpringBoot服務中部署埋點用于使用者評分行為資料采集。

資料持久化層采用MongoDB和Redis分别作為電商推薦系統的業務資料庫和緩存資料庫。

離線推薦服務采用适合離線互動式計算的SparkSQL進行統計推薦,智能推薦服務采用SparkMLlib實作。

實時推薦采用SparkStreaming實作,需要借助Flume、Kafka作為實時資料傳輸的中間元件。

4.3JavaEE子產品的設計

本課題設計的電商系統借助微服務部署,主要包含JavaEE子產品和大資料子產品兩個部分。JavaEE子產品包含前端界面和後端服務,大資料子產品包含離線推薦、實時推薦子產品。

4.3.1前端子產品的設計

前端子產品使用AngularJS設計,由于電商推薦系統前後端分離,前端界面僅需前端開發人員設計,而後端開發人員僅需提供調用API即可。

目前電商推薦系統的JavaWeb前端子產品僅需開發首頁為使用者提供注冊、登入、浏覽商品、對商品評分功能。

首頁:使用者輸入電商推薦系統網址後需要先登入,若使用者已登入,則顯示商品頁面。

使用者注冊:若是新使用者,必須先注冊才能登入。

商品搜尋:在電商行業中搜尋引擎非常重要,在本項目中僅僅設計模糊查詢功能。

商品頁:展示商品的近期熱門、猜你喜歡等;若是使用者首次使用,由于尚未收集到使用者的評分資料,系統隻能展示近期熱門商品。

商品詳情頁:使用者通過點選商品頁的商品進入商品詳情頁,可以看到商品詳情,此處有商品評分按鈕,使用者可以對商品進行評分。

4.3.2後端子產品的設計

後端子產品借助SparingBoot封裝Tomcat,用來處理前端發送的請求,主要設計如下:

使用者登入:通過判斷使用者輸入的資訊是否正确實作登入。

使用者注冊:前端界面校驗使用者輸入合法後方可完成注冊。

商品頁面:商品頁頁面僅提供檢視商品詳情頁的API。

商品詳情頁:商品詳情頁僅提供對商品評分的API。

日志采集:使用Nginx部署埋點采集使用者對商品的浏覽和評分資料,追加寫入到日志檔案中友善進行實時推薦。

商品搜尋:項目采用Elasticsearch提供的API來實作商品搜尋功能。

4.4資料倉庫設計

如果說推薦算法是電商推薦系統的靈魂,那麼資料就是電商推薦系統的筋骨了,是以,進行資料庫設計是非常必要的。由于業務的需要以及對海量資料的管理,本課題項目電商推薦系統摒棄了傳統的關系型資料庫(如MySQL、Oracle),選擇MongoDB和Redis作為電商推薦系統的業務資料庫和緩存資料庫。

4.4.1業務資料庫

由于系統有頻繁的對海量資料進行增删改操作,使用傳統的關系型資料庫可能有點力不從心[4]。是以,本課題項目采用現今被廣泛使用的文檔型資料庫MongoDB,MongoDB主要負責電商推薦系統的邏輯資料的存儲。

令人感到遺憾的是,MongoDB在4.0版本更新以後才增加對事務的支援。而出于對項目的穩定性以及與各個大資料元件之間的相容性的考慮,本課設項目目前采用的是不支援事務的MongoDB-RHEL-3.4.3版本,是以會遺留資料庫事務上的問題,具體會在文章後面讨論。

4.4.2緩存資料庫

在電商推薦系統項目中,由于系統需要根據使用者近期的浏覽行為快速地[16]了解到使用者的購物偏好,是以必須使用實時推薦,是以需要借助Redis作為緩存資料庫來滿足實時推薦需求。

以上兩種資料庫的表設計方案将在文章的後面進行詳細地說明。

4.4.3業務資料表的設計

本課題屬于大資料項目,由于需要存儲海量的資料,是以不能像設計關系型資料庫那樣設計表。在資料倉庫中,通常選擇次元模組化,各表之間不能有太多的Join(連接配接)操作。在模型架構上,選取星型架構,根據OLAP的需求,確定系統的穩定性、高效率能得以保證。

項目的業務資料模型的具體表結構如下:

1.Product【商品表】

表 41 商品表

字段名 字段類型 字段描述
_id ObjectId 主鍵
productId Int 商品的ID
name String 商品的名稱
categories String 商品所屬類别, 用“|”分割
imageUrl String 商品圖檔的URL
tags String 商品的UGC标簽, 用“|”分割

商品表資料樣例如下圖43所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 4-3商品表資料樣例

2.Rating【使用者評分表】

表 42 使用者評分表

字段名 字段類型 字段描述
_id ObjectId 主鍵
userId Int 使用者的ID
productId Int 商品的ID
score Double 商品的分值
timestamp Long 評分的時間

使用者評分表資料樣例如下圖44所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 4-4使用者評分表資料樣例

3.User【使用者表】

表 43 使用者表

字段名 字段類型 字段描述
_id ObjectId 主鍵
userId Int 使用者的ID
username String 使用者名
password String 使用者密碼
timestamp Lon0067 使用者建立的時間

字段名    字段類型    字段描述

字段名 字段類型 字段描述
_id ObjectId 主鍵
userId Int 使用者的ID
username String 使用者名
password String 使用者密碼
timestamp Long 使用者建立的時間

使用者表資料樣例如下圖45所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖  45使用者表資料樣例

4.RateMoreRecentlyProducts【最近商品評分個數統計表】

表 44 最近商品評分個數統計表

字段名 字段類型 字段描述
_id ObjectId 主鍵
productId Int 商品的ID
count Int 商品的評分數
yearmonth String 評分的時段

最近商品評分個數統計表資料樣例如下圖46所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖  46近期商品評分個數統計表資料樣例

5.RateMoreProducts【商品評分個數統計表】

表 45 商品評分個數統計表

字段名 字段類型 字段描述
_id ObjectId 主鍵
productId Int 商品的ID
count Int 商品的評分數

商品評分個數統計表資料樣例如下圖47所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 47商品評分個數統計表資料樣例

6.AverageProducts【商品平均評分表】

表 46 商品平均評分表

字段名 字段類型 字段描述
_id ObjectId 主鍵
productId Int 商品的ID
avg Double 商品的平均評分

商品平均評分表資料樣例如下圖48所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 48商品平均評分表資料樣例

7.ProductRecs【商品相似性矩陣】

表 47 商品相似性矩陣

字段名 字段類型 字段描述
_id ObjectId 主鍵
productId Int 商品的ID
recs Array[(productId:Int,score:Double)] 商品最相似的商品集合

商品相似性矩陣資料樣例如下圖49所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖  49商品相似度矩陣表資料樣例

以上是電商推薦系統的業務資料表及樣例資料内容,可以看到MongoDB存儲的是Json資料,但是實際上讀取相關資料也可以是關系型的,其中key為字段名,value為字段内容。

4.4.4系統資料流程設計

所有資料的來源均為JavaEE服務擷取的資料,其中包含使用者注冊資訊和系統通過Nginx埋點收集得到的使用者行為資料,系統的各個服務中資料流程如下圖4-10所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖  410 電商推薦系統資料流程設計圖

在使用者首次注冊之前,為了提供熱門商品進行展示,系統需要提前在MongoDB中存儲部分業務資料,使用統計推薦服務對商品進行“預推薦”。

使用者首次注冊時,使用者輸入的注冊資訊直接被存儲到MongoDB資料庫中。

使用者浏覽商品或對商品進行評分以後,Flume将收集到的資料發送到Kafka,Kafka通過生産者/消費者模式将資料廣播給SparkStreaming進行實時計算。

使用者的部分評分資料可直接通過Redis緩存資料庫實時發送到SparkStreaming進行實時計算。

實時推薦服務将計算結果存儲到MongoDB同時給使用者進行展示。一段時間後,MongoDB中曆史資料有更新,此時離線計算子產品還要重新計算推薦清單以更新推薦結果。

4.5離線推薦子產品的設計

離線推薦子產品使用的是離線的曆史資料,資料沒有沒有實時性,推薦原理是在設定的時間周期内計算推薦結果,其推薦内容在一定的時間周期内是一成不變的。根據業務需要,随着時間調整,離線推薦結果才會産生變動。在離線推薦子產品中,需要預先設計推薦名額,以展示商品給使用者,友善收集使用者的實時評分資料,為實時計算做支撐。

4.5.1離線統計推薦子產品的設計

統計推薦子產品僅需借助SparkSQL實作,主要以下統計三個名額:

(1)曆史熱門商品統計

統計曆史熱門商品的實作思路是根據商品ID聚合,再進行COUNT(DISTINCT)統計,最後按照從大到小降序排列展示出來[7]。

(2)近期熱門商品統計

統計近期熱門商品原理與統計曆史熱門商品相同,不同的是限制時間段,這個時間段可根據業務設定。

(3)商品平均評分統計

統計商品的平均分主要根據商品的ID聚合,再使用AVG函數計算平均分,最後将計算結果按照從大到小的順序排列展現出來。此外,若業務對實時性有要求,可以設定時間段滑動為過濾條件。

4.5.2離線個性化智能推薦子產品的設計

本課題項目采用SparkMLlib的ALS算法作為協同過濾算法,需要先選取模型訓練,然後計算使用者推薦清單和商品相似度矩陣[8]。

(1)使用者推薦清單計算

計算使用者推薦矩陣的主要實作思路是将使用者ID和商品ID做笛卡爾積,再通過訓練的模型預測用于對商品的評分,将預測結果排序後商品來作為目前使用者的商品推薦清單。

(2)商品相似度矩陣計算

計算商品相似度矩陣,主要實作原理是我們熟悉的計算餘弦相似度,即COS(A,B)的值,兩件商品的餘弦相似度越趨近于1說明兩件商品越相似,否則就越不相似[17]。由于候選商品有很多種,是以需要計算多種商品與備選商品的餘弦相似度。

4.6實時推薦子產品的設計

與離線推薦子產品不同的是,實習推薦子產品反映的是使用者最近一段時間的商品口味偏好,而離線推薦反映的是總體使用者在長期或者某個時間段内的商品偏好[11]。實時推薦對推薦結果的時效性要求比較高,而對商品推薦的準确度要求就沒那麼高了,當然,如果能做得推薦準确度也高那也更好。

在實時推薦子產品中,使用者需要更新後的商品更加滿足使用者的近期商品口味偏好,在後文的系統實作章節中,文章會詳細介紹實時推薦算法。

第5章推薦算法設計

5.1離線統計推薦算法設計

統計推薦算法主要借助SQL和UDF函數實作,其目的在于為離線個性化智能推薦與實時推薦提供資料支援,并且粗略地反映大衆使用者在某個時間段内對不同商品的喜好程度。例如:使用者在搜尋“手機充電器”的時候,由于曾經風靡全球的“萬能充”早已過時,是以推薦系統會優先給使用者推薦USB接口的充電器而盡量少地推薦“萬能充”,如圖5-1所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-1統計推薦将過濾掉曾經熱門商品“萬能充電器”

下面簡單地介紹統計推薦算法。

5.1.1曆史熱門商品統計推薦算法設計

統計熱門商品的核心算法思路如圖5-2所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-2統計熱門商品的SQL

統計曆史熱門商品僅需要根據商品ID聚合彙總再降序排列即可,将SQL代碼注入到SparkSession.sql()函數中實作。

5.1.2近期熱門商品統計推薦算法設計

統計近期熱門商品的核心算法思路如圖5-3所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-3統計近期熱門商品的SQL

統計近期熱門商品需要将商品評分表中的時間戳進行“規範化”,即使用UDF函數(圖中的CHANGEDATE函數)将時間戳轉化成“年-月”的形式,再根據年-月與商品ID聚合,根據商品ID彙總,再根據年-月、商品ID彙總結果降序排序即可,将SQL代碼注入到SparkSession.sql()函數中實作。

5.1.3商品平均評分統計推薦算法設計

統計商品的平均分的核心算法思路如圖5-4所示:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-4統計商品的平均分的SQL

統計商品的平均分僅需要根據商品ID聚合,使用系統函數(圖中的AVG函數)計算商品ID對應的平均法再降序排序,将SQL代碼注入到SparkSession.sql()函數中實作。

5.2離線個性化智能推薦算法設計

該算法是電商推薦系統算法的核心,呈上依賴于統計推薦子產品提供的資料集與推薦結果,啟下則被用于計算實時推薦清單的商品推薦優先級。核心算法思想是使用ALS算法進行矩陣分解,進而得到使用者推薦矩陣與商品推薦矩陣,進而計算推薦清單。

5.2.1計算使用者商品推薦清單

使用ALS算法的矩陣分解技術将訓練出來的模型用來計算使用者的商品推薦清單[17],ALS算法交替最小二乘法的原理為矩陣分解技術,主要思想如圖5-5所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-5ALS算法的矩陣分解思想

我們知道兩個矩陣相乘可以得到一個新的矩陣,例如将使用者特征矩陣的轉置與商品特征矩陣相乘可以得到一個新的評分矩陣,如圖5-6所示。但是如何将一個評分矩陣拆分成一個使用者對商品隐含特征的偏好矩陣矩陣和一個商品所包含的隐含特征矩陣,并且兩個新矩陣相乘近似逼近原評分矩陣呢?ALS算法就能幫我們解決這個問題。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-6使用者特征矩陣的轉置與商品特征矩陣相乘

使用ALS算法可進行顯式評分訓練與隐式評分訓練,進行訓練模型時需要傳入四個參數。若進行顯式訓練,則參數為ALS.train(ratings, rank, iterations=5, lambda_=0.01),若進行隐式訓練,則參數為ALS.trainImplict(ratings, rank, iterations=5, lambda_=0.01)。其中,ratings指訓練模型資料源,rank指的是當進行矩陣分解時,将原矩陣分解成X(m*rank)矩陣和Y(rank*n)矩陣,Iterations指ALS算法的疊代次數,lambda為正則化項系數,預設為0.01。使用ALS算法就可以将使用者評分矩陣進行分解,思想如圖5-7所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-7ALS算法将評分矩陣分解

使用ALS算法訓練結果是否是我們想要的結果,這個需要通過模型評估來判斷,以下是模型評估與參數選取算法。

5.2.2模型評估和參數選取

由于使用ALS算法進行模型訓練是傳的參數是手動設定的,是以需要調整參數,最簡單的做法是計算均方根誤差[8],計算公式如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

             (5.1)

本文在前文中提到,這個均方根誤差并非越小越好,當然均方根誤差也不能太大,否則就會出現欠拟合與過拟合,是以在實際開發中需要合理調整ALS算法的相關參數,使計算結果更加準确,最優參數選取結果将在後文的“系統實作”章節說明。

5.2.3計算商品相似度矩陣

計算商品相似度矩陣步驟如下:假設使用者有k個特征,商品也有k個特征,則商品p和q之間的相似度可以由p與q的餘弦值來表示[20],具體公式如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

                    (5.2)

5.3實時推薦算法設計

實時推薦算法的基本原理是考慮使用者在最近一段時間内對商品口味是相似的,因為随之時間的推移,使用者對商品的購買欲望會随着年齡、季節、職業、婚育情況等多個方面的改變而發生改變。如圖5-8所示,使用者為已婚女性,她在去年冬天曾給兒子買過一件棉襖并對該棉襖給予了很好的評價,但是目前季節為夏天,那麼在搜尋“服裝”的時候,此時系統會優先給使用者推薦女性的夏裝T恤而不是男性的童裝棉襖。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 5-8實時推薦将潛在屏蔽使用者曾經喜愛但已“過時”的商品

需要區厘清楚的是,實時推薦與統計推薦的實作思慮、應用場景是完全不同的。統計推薦反映的是大衆使用者的曆史資料生成的推薦清單,而實時推薦反映的是使用者實時購物偏好,推薦結果會随着季節、溫度、使用者年齡等因素的變化而改變。

5.3.1實時推薦算法思想

假設u代表使用者,p代表商品,使用者對p進行評分後,系統需要對k個候選商品進行評分計算[11]。若使用者對商品進行好評,則給商品的相似候選進行加分計算,若對商品進行了差評,則給該商品的相似商品進行扣分計算。

具體來說:擷取使用者的最近k次評分PK和與商品p相似的k個商品S,假設商品的推薦優先級,那麼計算公式如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

  (5.3)

其中:

表示使用者u 對商品r 的評分,sim(q,r)為商品p與r的餘弦相似度,該數值來源于離線個性化推薦子產品中商品相似度矩陣計算結果。sim_sum 表示使用者評分商品個數,incount、recount 表示使用者給商品好評和差評的個數。

5.3.2初步計算備選商品的推薦優先級

初步計算備選商品的推薦優先級公式的如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

                    (5.4)

公式的意義如下:計算候選商品的餘弦相似度,隻需計算商品餘弦相似度與使用者對商品評分的乘積,将計算結果取平均數[14]即可。

5.3.3計算偏移項

初步計算備選商品的推薦優先級後,根據商品的平均評分确定使用者對商品的評價是好評還是差評,根據使用者的評分計算偏移項,若是好評則優先推薦,若是差評則降低推薦優先度,計算公式如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

               (5.5)

5.3.4計算備選商品的最終推薦優先級

通過對上述兩個名額的計算,備選商品的最終推薦優先級的計算僅需将初步計算備選商品的推薦優先級與偏移項相加即可。比如使用者對三件商品的評分分别為5分、4分、1分,假設3分為中評,其中有兩件好評和一件差評,則候選商品的計算得分為結果如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

    (5.6)

5.4其他推薦算法

為提升商品推薦準确率,還可以使用其他的推薦算法進行混合智能推薦,以下是除上述推薦算法以外兩種常用的推薦算法。

5.4.1基于内容的相似推薦算法

基于内容推薦需要使用者給商品打标簽,然後借助程式提取标簽内容,進而擷取商品的特征向量[15]。該方法也可以得出使用者商品推薦矩陣,并且可以将計算結果傳到實時推薦子產品,提升推薦的準确度。

該算法的具體實作如下:

首先提取商品的标簽資訊來提取特征向量,算法公式[23]如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

接下來就是計算特征向量的餘弦值,跟文章上述計算原理一樣,在此不再重複介紹,結果餘弦值接近于1的商品進行推薦[24],具體公式如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

        (5.9)

5.4.2基于物品的協同過濾相似推薦算法

基于物品的協同過濾(Item-CF),系統通過埋點收集使用者的多種行為就可以預測不同商品的相似度[19],這比通過使用者評分預測商品相似度更加友善。

利用Item-CF算法可以分析使用者喜歡什麼樣的商品,在電商乃至零售行業中都被廣泛地應用。假設Ni、Nj分别為對商品i、j評分過的使用者清單,那麼具體的推薦計算公式[25]如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

                         (5.10)

5.4.3使用者畫像系統算法

使用者畫像系統的算法常常使用K-means聚類分析算法,核心思路是選擇K個點作為初始聚類中心,計算歐幾裡得距離,C代表中心點,X代表任意一個非中心點。在此不做重點介紹,核心算法公式如下:

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

                         (5.11)

第6章

系統實作

6.1前台使用者系統實作

前台不做重點介紹,簡單地實作了使用者注冊登入、浏覽商品頁面,以滿足最基本的功能需求。

6.1.1登入注冊子產品的實作

使用者登入:使用者進入電商推薦系統前需要完成登入,前端頁面如圖6-1所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-1電商推薦系統登入頁面

使用者注冊:新使用者輸入指定資訊經校驗正确即可完成注冊,前端頁面如圖6-2所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-2電商推薦系統注冊頁面

6.1.2商品頁功能的實作

使用者在完成注冊與登入後就能看到商品,使用者可直接給商品打分,電商推薦系統的前端商品推薦頁面如圖6-3所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-3電商推薦系統推薦頁面

在商品推薦頁面分别展示了統計推薦子產品的推薦(如“熱門推薦”、“評分最多”)結果和智能推薦(如“猜你喜歡”)結果,需要注意的是,若是新使用者首次注冊登入,“猜你喜歡”子產品的推薦結果為空。

6.2推薦系統服務環境搭建

電商推薦系統項目中用到了許多工具對資料進行存儲、計算、采集、傳輸等操作,是以部署伺服器環境也是件非常困難的事,現在對環境搭建進行簡介。

6.2.1環境準備

硬體環境包括4核8程序的CPU、40G磁盤(20G也可),8G記憶體(4G也可),使用VMware Workstations安裝Linux虛拟機的硬體配置如圖6-4所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-4VMware Workstations安裝Linux虛拟機硬體配置

軟體環境包括VMware Workstations、JDK1.8、Scala2.11、Maven、CentOS6.8、IDEA、MongoDB4.3與Redis用戶端。

Spark生态系統元件包括JDK1.8、Scala2.11、Spark、Kafka、Flume-ng、Redis、MongoDB。

6.2.2Linux虛拟機搭建

搭建虛拟機的主要步驟如下:安裝CentOS、修改網絡IP和網關、修改主機名稱為ECommerceRecommendSystem、關閉Linux防火牆。完成後使用Windows的DOS指令ping虛拟機,若ping通,則說明已連上Linux虛拟機,使用Windows下DOS指令ping通Linux虛拟機如下圖6-5所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-5使用Windows下DOS指令ping通Linux虛拟機

注意在安裝Redis和MongoDB時也要關閉相應的保護機制,是其可被本地Windows系統連接配接。

6.2.3安裝架構元件

搭建好虛拟機夠就要安裝電商推薦系統的各個插件,其中包括JDK、MongoDB、Redis、Kafka、Flume、Zookeeper、Spark,在此不做詳細介紹。

安裝MongoDB(單節點)并配置,步驟省略,安裝并啟動MongoDB結果如下圖6-6所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-6安裝并啟動MongoDB

安裝Redis(單節點)并配置啟動,步驟省略,安裝并啟動Redis結果如下圖6-7所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-7安裝并啟動Redis

安裝Java并配置環境變量,步驟省略,檢視Linux中JDK版本如下圖6-8所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-8安裝JDK Linux版

安裝Spark(單節點)并啟動,步驟省略,檢視Spark啟動狀态如下圖6-9所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-9安裝并啟動Spark,檢視Spark啟動狀态

安裝Zookeeper(單節點)并啟動,步驟省略,啟動Zookeeper并檢視Jps程序如下圖6-10所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-10啟動Zookeeper并檢視Jps程序

安裝Flume-ng、Kafka并啟動,步驟省略,啟動Kafka并檢視Jps程序如下圖6-11所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-11啟動Kafka并檢視jps程序

以上隻是完成電商推薦系統的實作的第一步,安裝過程會出現很多問題,在此就不一一列舉了。

6.2.4建立微服務項目

電商推薦系統項目的推薦業務子產品均由Scala代碼編寫,使用IDEA作為編輯器,使用SpringBoot和Maven作為項目管理和建構工具。

使用ECommerceRecommendSystem來命名父項目,recommender和businessServer為子項目,分别管理JavaEE子產品和推薦服務子產品,建立業務服務和推薦服務子產品結果如圖6-12所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-12建立業務服務和推薦服務子產品

為了減少電商推薦系統使用的各種工具之間相容性的影響,需要在父子產品中聲明所有子子產品的配置資訊,修改系統根子產品的pom.xml檔案,父子產品中添加相關依賴資訊如下圖6-13所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-13在Maven的父子產品中添加相關依賴

為了友善日志管理,需要在父子產品中引入公共依賴,其中包括slf4j、log4j,同時為了建構Maven項目,需要向其中引入引入共有插件,省略代碼。

在recommender子產品中,由于本課題項目使用Spark技術棧開發電商推薦系統,是以需要引入Spark的相關依賴,父子產品recommender的pom.xml中添加如下配置,推薦子產品中添加相關依賴如下圖6-14所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-14在Maven的推薦子產品中添加相關依賴

以上是完成父子產品相關依賴的配置流程,目前這些版本的依賴之間相容性比較好,為了考慮相容性的問題不建議随便修改依賴的版本。

6.2.5建立推薦服務子子產品

在推薦子產品要添加DataLoader、KafkaStreaming、OfflineRecommender、OnlineRecommender、StatisticsRecommender子產品,分别負責加載商品及評分資料到MongoDB、發送實時使用者評分資料、離線推薦、實時推薦和統計推薦服務,推薦子產品中添加不同的服務子產品如下圖6-15所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-15在推薦子產品中添加不同的服務子產品

建立好推薦子產品的各個子子產品以後,首先要加載資料供離線統計推薦服務和模型訓練使用。

(1)加載資料

在DataLoader中需要添加Spark的相關版本依賴以及MongoDB的相關依賴,本課題項目選取的Spark和MongoDB的API版本均為2.11,省略相關依賴代碼。

(2)電商資料準備

将準備好的某電商巨頭的商品資料集合評分資料集加載到資料庫中,資料來源于亞馬遜公司,下面将介紹資料的字段内容。

(3)Products資料集

資料格式:productId,name,categoryIds, amazonId, imageUrl, categories,tags

Products資料集樣例如圖616所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-16Products資料集

從Product選取如下幾個字段。

表 61 Products表字段

字段名 字段類型 字段描述
productId Int 商品ID
name String 商品名稱
categories String 商品分類,用“|”分割
imageUrl String 商品圖檔URL
tags String 商品UGC标簽,用“|”分割

(4)Ratings資料集

資料格式:userId,prudcutId,rating,timestamp

Ratings資料集樣例如圖617所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-17Ratings資料集

 Rating資料集有4個字段,每個字段之間通過“,”分割。

表 62 Ratings表字段

字段名 字段類型 字段描述
userId Int 使用者ID
produtId Int 商品ID
score Double 評分值
timestamp Long 評分的時間

(5)資料初始化到MongoDB

首先定義Product、Rating、MongoConfig三個樣例類,類的屬性分别為兩表所需的字段和MongoDB的配置資訊,商品、評分、MongoDB配置樣例類如下圖6-18所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-18商品、評分、MongoDB配置樣例類

然後讀取Product和Rating資料,将資料以overwrite的方式儲存在MongoDB中,執行代碼代碼後檢視linux中的MongoDB表,發現商品表和評分表已被建立,建立結果如圖6-19所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-19商品表和評分表

檢視表Product,看商品資訊是否被寫入MongoDB,發現資料已被寫入商品表,Product表中資料如下圖6 20所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-20Product表中資料

檢視表Rating表中的資料,發現資料已被寫入商品表,Rating表中資料如下圖6 21所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-21Rating表中的資料

到此為止,電商推薦系統的資料準備階段已基本完成,接下來就是實作電商推薦系統的統計推薦子產品功能。

6.3離線統計推薦系統實作

電商推薦系統的統計推薦子產品主要借助于SparkSQL處理曆史資料,根據曆史熱評、近期熱評、平均評分等不同的統計名額統計不同的曆史資料,反映的是商品在一段時間内的評分情況[18],為後面的離線推薦(統計推薦也歸屬于離線推薦,在離線推薦系統功能實作子產品中将重點介紹SparkMLlib)與實時推薦提供資料支援。

在StatisticsRecommender子產品中,需要在StatisticsRecommender.pom.xml中配置Scala、Spark、MongoDB的相關依賴,相關代碼省略。

然後需要建立Rating和MongoConfig兩個樣例類,分别定義各自的屬性,Rating和MongoConfig樣例類及屬性如下圖6-22所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-22Rating和MongoConfig樣例類

建立好樣例類以後接下來就可以編寫統計推薦業務邏輯代碼了。

6.3.1曆史熱門商品統計

該子產品的核心原理是SparkSQL統計評分次數最多的商品,使用SparkSQL讀取評分資料集,通過統計計算得出所有評分最多的商品,使用函數将結果從小到大排序,将計算結果寫入資料庫,具體實作SQL語句和代碼如下如6-23所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-23曆史熱門商品統計代碼

執行該Spark腳本後檢視資料庫中曆史熱門商品統計資料分析結果,具體實作在下文中說明。

6.3.2最近熱門商品統計

“最近”可以表示為近一個月、進一周、近三天都行,根據設定的時間跨度計算近期時間商品評分最多的商品集合。

使用SparkSQL讀取評分表,通過UDF(Spark中的自定義函數)将評分時間格式化為月、周或者天,再按月、周、天統計商品的評分數,以下以月為例,将統計結果寫入到MongoDB,具體實作SQL語句和代碼如下如6-24所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-24最近熱門商品統計代碼

執行該Spark腳本後檢視資料庫中近期熱門商品統計資料分析結果,具體實作在下文中說明。

6.3.3商品平均得分統計

統計MongoDB表中所有曆史評分資料,每天計算每個商品的評價得分。實作方式為使用SparkSQL讀取Rating表的資料,再計算商品的平均分,将結果寫入到MongoDB,具體實作SQL語句和代碼如下如6-25所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-25商品平均得分統計代碼

執行程式後,檢視MongoDB表,發現三個統計評分表已被建立,統計推薦結果表如圖6-26所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-26統計推薦結果表

點選檢視AverageProducts表中的資料,發現資料已被寫入商品平均評分表,AverageProducts表中的資料樣例如下圖6-27所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-27AverageProducts表中的資料

檢視RateMoreProducts表中的資料,發現資料已被寫入商品最多評分表,RateMoreProducts表中的資料如下圖6-28所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-28RateMoreProducts表中的資料

檢視RateMoreRecentlyProducts表中的資料,發現資料已被寫入商品近期評分表,RateMoreRecentlyProducts表中的資料如下圖6-29所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-29RateMoreRecentlyProducts表中的資料

根據以上結果可以看出,使用SparkSQL統計推薦子產品已被基本實作。

6.4基于隐語義模型的協同過濾推薦

該子產品是離線推薦的核心,使用的技術是SparkMLlib實作,具體步驟如下:

6.4.1計算使用者商品推薦清單

計算使用者推薦清單的具體做法為:

1.讀取MongoDB擷取userId和productId作為訓練資料集;

2.使用模型預測(userId,productId)對應的商品評分;

3.過濾計算分值最大的幾個商品作為使用者的商品推薦清單[19],将資料存儲到MongoDB的UserRecs表中。

實作過程:在OfflineRecommender子產品的pom.xml,引入Spark、Scala、Mongo和Jblas的依賴,代碼省略。

分别建立Recommendation、UserRecs、ProductRecs三個樣例類并分别定義類的屬性,Recommendation、UserRecs、ProductRecs樣例類及屬性如圖6-30所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-30Recommendation、UserRecs、ProductRecs樣例類

首先要進行模型訓練,ALS的模型訓練代碼如下圖6-31所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-31ALS模型訓練代碼

接着對User表和Product表進行笛卡爾積計算,得到空的User-Product評分矩陣,主要實作代碼如下圖6-32所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-32計算使用者-商品笛卡爾積代碼

計算使用者推薦清單的主要代碼如下圖6-33所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-33計算使用者推薦清單代碼

執行該Spark腳本後檢視資料庫中使用者推薦清單結果,具體結果在下文中說明。

6.4.2模型評估和參數選取

通過手動調整參數,選擇均方根誤差最小的一組參數作為最終參數,核心代碼實作如下圖634所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-34ALS參數調整代碼

計算均方根誤差的函數的代碼實作如下圖6-35所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-35計算RMSE代碼

運作代碼,就可以得到目前資料的最優模型參數,最優模型參數如下圖6-36所示。當然,這個最優模型參數不唯一,要根據實際計算結果而确定。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-36最優模型參數

根據以上結果可以看出,使用SparkMLlib基于隐語義模型協同過濾推薦子產品已被基本實作。

6.4.3計算商品相似度矩陣

計算商品相似度的代碼如下圖6-37所示,執行該Spark腳本後檢視資料庫中商品推薦清單結果,具體結果在下文中說明。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-37計算商品相似度代碼

求兩個向量餘弦相似度的函數關鍵代碼實作如下6-38所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-38計算商品餘弦相似度代碼

運作程式,檢視MongoDB表,發現使用者推薦表、商品推薦表已被建立,如圖6-39所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-39使用者推薦表、商品推薦表

檢視使用者推薦清單UserRecs表中的内容,發現資料已被寫入使用者推薦清單,如圖6-40所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-40UserRecs表中的内容

檢視商品推薦清單ProductRecs表中的内容,發現資料已被寫入商品推薦清單,如圖6-41所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-41ProductRecs表中的内容

到此為止基于隐語義模型協同過濾的個性化智能推薦功能已基本實作,接下來将介紹實時推薦功能。

6.5實時推薦系統實作

電商推薦系統的實時推薦主要反映使用者的近期偏好,而離線推薦反映的是使用者的長期偏好。是以,使用者的實時偏好比長期偏好更能反映使用者的購買偏好。

假設使用者近期對A商品評了高分,而對B商品卻評了低分,那麼實時計算就要求系統近期會多給使用者推薦A商品,而潛在地給使用者屏蔽B商品。但是實時計算的複雜度不能太高,是以要使用時間複雜度稍微簡單的算法。

實作思路:在StreamingRecommende子產品中添加Scala、Spark、MongoDB、Redis、Kafka、Fume依賴,代碼省略。

建立Recommendation、UserRecs、ProductRecs三個樣例類并定義屬性,标準推薦對象、使用者推薦清單、商品相似度清單樣例類及屬性如下圖6-42所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-42标準推薦對象、使用者推薦清單、商品相似度清單樣例類

使用KafkaStream處理評分流資料具體算法實作如下圖6-43所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-43KafkaStream處理評分流資料算法

處理資料的核心算法部分如下圖6-44所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-44處理評分流核心代碼

實時推薦需要借助Redis擷取實時資料,從Redis裡擷取最近num次評分的核心代碼如下圖6-45所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-45從redis裡擷取最近評分代碼

擷取目前商品的相似清單計算備選商品的代碼如下圖6-46所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-46計算備選商品相似清單代碼

以上是實時推薦模型算法介紹,下面将介紹實時推薦算法的具體實作。

6.5.1實時推薦功能的實作

實時推薦算法的前提是資料庫中已經存儲了部分商品推薦資訊,并且實時計算架構已經擷取到了使用者的實時浏覽和評分資訊。

實時推薦算法過程主要為:首先擷取使用者的實時評分,擷取相似的關聯商品,再計算商品的推薦優先級,下面将詳細介紹實時推薦算法。

6.5.2商品推薦優先級計算

計算備選商品推薦得分的算法代碼如下圖6-47所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-47計算備選商品推薦得分算法

計算結果需要加上偏移項,即對好評進行加分,對差評商品進行扣分,進而得出商品最終預測得分,最終得出商品推薦清單,具體算法代碼如下圖6-48所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-48計算商品推薦清單核心代碼

計算候選商品和已評分商品的相似度代碼核心算法如下圖6-49所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-49計算候選商品和已評分商品的相似度代碼

使用logN進行偏移項計算,這裡實作為取10的對數(常用對數),計算偏移量代碼如下圖6-50所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-50計算偏移量代碼

運作以上Spark腳本,系統開始啟動實時推薦,實時推薦功能基本完成。

6.5.3更新實時推薦結果

通過實時計算得出新的商品推薦優先級以後,實時計算結果要和曆史計算結果進行合并,并覆寫替換掉過時的資料,以保持對推薦結果的實時性,在後文将會展示實時推薦結果。

6.6背景服務系統實作

JavaEE子產品不是電商推薦系統的重點,在此不做重點介紹,在項目的businessServer子產品下的java目錄、log目錄、resources目錄、webapp目錄下分别存放Java後端代碼、系統日志(包含埋點采集日志)、配置檔案和前端代碼,電商推薦系統自動生成日志如下圖6-51所示。簡要介紹下使用者注冊與登入、使用者評分子產品以及埋點資料采集部分。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-51電商推薦系統自動生成日志

執行JavaEE子產品,系統将會自動在log目錄下生成日志記錄。

6.6.1背景系統注冊登入子產品實作

系統前端接收使用者的請求,經使用者名和密碼都被校驗正确後方可跳轉到商品頁。

在注冊使用者子產品中,僅需判斷MongoDB中是否有該使用者資訊即可。

6.6.2背景商品模糊查詢功能實作

背景通過擷取前端送出的查詢請求即可使用Elasticsearch進行模糊比對查找商品,實作模糊查詢代碼如下圖652所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-52模糊查詢Controller代碼

使用Elasticsearch查詢商品的業務代碼如下圖653所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-53Elasticsearch的Configuration代碼

使用者在前端頁面搜尋框輸入商品名,前端展示商品的查詢結果如圖654所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-54模糊查詢結果展示

模糊查詢是電商系統的必備功能,不是推薦服務的核心功能,在此不重點介紹,讀者可以參考ELK的相關官網。

6.6.3背景使用者評分日志子產品的實作

項目實作個性化推薦技術需要采集使用者行為日志,通過Nginx生成埋點日志代碼如下圖6-55所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-55Nginx生成埋點日志代碼

啟動項目以後,系統自動通過Nginx擷取使用者評分日志,agent.log日志檔案如圖6-56所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-56 agent.log日志檔案

系統自動将日志追加寫入到agent.log檔案中,通過Flume-ng此采集服務實時發送到Kafka和寫入到Redis,再傳到SparkStreaming進行實時計算。

使用者在浏覽商品或對商品評分以後,系統會自動收集使用者的評分資訊并寫入到日志檔案中,日志中使用者評分行為記錄結果如圖6-57所示。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-57日志中詳細地記載了使用者評分行為

從上述結果看來,JavaEE前台服務系統已基本完成使用者行為資料采集,接下來就進行系統測試。

6.7系統測試

完成電商推薦系統的開發以後,首先要進行測試,確定測試無誤後方可上線。

6.7.1系統示範

示範系統的主要流程如下:

1、建立四個測試使用者a1、b1、c1、d1,密碼均為“123”。

2、分别登入使用者a1、b1、c1、d1的賬戶,模拟浏覽商品、對商品評分。

3、一段時間後檢視更新後的商品推薦結果。

假設使用者a1初次使用電商推薦系統,那麼系統一開始不會知道使用者a1的商品口味偏好,是以在“猜你喜歡”子產品中不會有任何推薦内容,這就出現了電商推薦系統的“冷啟動”問題(如圖6-58所示),後文會詳細介紹。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-58使用者首次使用電視推薦系統出現“冷啟動”問題

分别使用使用者a1、b1、c1、d1對商品進行模拟浏覽和評分,其中,使用者分别代表的購物口味如下:

(1)使用者a1喜歡看書,偶爾會看生活用品。

(2)使用者b1與使用者a1的口味相似,也喜歡書和生活用品,但是使用者b1和使用者a1對商品的評分不完全相同。

(3)使用者c1與使用者a1、b1的口味不同,喜歡數位産品而不喜歡書。

(4)使用者d1為系統的流失使用者,即注冊後就再也沒有使用過電商推薦系統,也沒對浏覽過任何商品和對任何商品評分,主要被用于對照。

一段時間後資料更新的推薦結果如下:

使用者a1的商品推薦結果如圖6-59所示,電商推薦系統給使用者a1推薦了4種書。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-59使用者a1的個性化推薦結果

使用者b1的商品推薦結果如圖6-60所示,電商推薦系統給使用者b1也推薦了4種書,但是書名及内容與使用者a1不完全相同。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-60使用者b1的個性化推薦結果

使用者c1的商品推薦結果如圖6-61所示,電商推薦系統給使用者a1推薦了4種數位而僅僅推薦了一種書。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-61使用者c1的個性化推薦結果

使用者d1的商品推薦結果如圖6-62所示,電商推薦系統沒有給d1推薦任何商品,因為使用者d1未曾浏覽過任何商品,也未給任何商品評分。

電商推薦系統論文:基于Spark機器學習的電商推薦系統的設計與實作,大資料電商推薦系統畢設論文,Spring MLlib電商推薦系統

圖 6-62使用者d1的個性化推薦結果

從最終的推薦結果來看,使用者a1、b1、c1的“猜你喜歡”子產品中的推薦資料都不同,這是因為使用者a1、b1、c1的購物口味偏好不盡相同。而“熱門推薦”和“評分最多”推薦子產品的曆史推薦結果始終保持不變,這證明本課題項目的已基本成功地實作。

6.7.2冷啟動問題

冷啟動問題主要展現在使用者首次注冊系統時,由于使用者從未對任何商品進行過評分,是以系統無法判斷任何使用者偏好[21],是以不能實作個性化推薦,這時候系統就看似出了問題而實際上沒出問題。

解決方式:在使用者首次注冊電商推薦系統的時候,系統發出彈窗收集使用者的行為偏好,讓使用者選擇自己的标簽,這樣使用者在注冊的時候系統就知道使用者的商品口味偏好了[22],這也是各大APP在針對新使用者收集使用者标簽的原因之一。

第7章

總結

7.1課題總結

本文基于目前大資料環境下的電商業務,介紹了目前主流的Spark相關技術與推薦算法,并借助Spark尤其是SparkMLlib以及其他的輔助架構工具實作了電商推薦系統,完成了推薦功能。在此期間,我查閱了大量的理論資料和技術文檔,再加上對相關技術的深入學習,最終設計并實作了該系統,實屬不易,以下是本次課設的總結。

在文章的一開始介分析了一下國内外推薦系統的發展狀況以及應用,進而得出推薦系統在電商行業中的“隐藏價值”。如果将大資料比喻成未來電商行業資訊技術發展的“石油”,那麼電商推薦系統就是“石油開采機”。

在文章的第二章介紹了目前主流的JavaEE微服務技術,并對目前快速發展的非關系型資料庫進行了介紹,同時介紹了在大資料背景下實時采集日志資料的兩大架構,接着介紹了Spark技術棧以及本課題項目使用到的Spark元件,此外還對電商推薦系統的相關算法理論做了簡單的介紹。在介紹了Linux伺服器以後,最後介紹了電商推薦系統的未來技術選型,講解了一下目前正在熱門發展的Flink架構以及和Spark的對比,說明了本課題目前選擇Spark而不使用Flink原因,并在結尾簡單地概述了使用者畫像技術在電商推薦系統中的應用。

在文章的第三章首先從技術、經濟、操作的角度出發,綜合地分析了電商推薦系統的實作可行性,結果證明本課題電商推薦系統是可行的。接着對系統進行需求分析,分别從系統的業務需求、離線推薦服務需求、實時推薦需求、使用者需求、功能需求等進行分析。

在文章的第四章簡單地說明了設計電商推薦系統的思想,從系統功能設計原則出發,簡單地介紹了JavaEE子產品的設計、資料倉庫設計與表設計、電商推薦系統的資料流程設計,再詳細地介紹電商推薦系統的離線推薦子產品設計與實時推薦子產品的設計。本章從外到内,由淺到深,逐漸介紹電商推薦系統的設計思想,為後面的電商推薦系統的實作做模型架構準備。

第五章是本文的精髓,本章介紹了電商推薦系統的各種算法,包括統計推薦算法、ALS最小二乘法、協同過濾算法、實時推薦算法與其他常用的電商推薦系統的推薦算法,為後文的系統實作提供理論基礎。

第六章先簡單地介紹前端服務子產品的實作,從搭建Linux虛拟機開始,逐漸實作Spark生态系統元件的安裝,再分别介紹統計推薦、基于隐語義模型協同過濾推薦算法的離線推薦、實時推薦子產品的詳細實作方案,同時将項目的核心源碼展示出來,并介紹推薦思想,再介紹如何部署、啟動項目,實作搭建電商推薦系統的“一條龍”介紹,友善讀者閱讀。在本章的結尾說明了項目會遇到的非功能性的“冷啟動”問題以及解決方案,同時介紹了其他的推薦算法。

在實作本課題項目之後,我對電商推薦系統的推薦準确性、推薦效率進行了測試與評估,測試證明項目的推薦結果比較準确,并且推薦的實時性比較高。但是迄今為止還沒有準确率高達100%的推薦系統,在今後的工作和學習中,需要研究更加準确的推薦算法,來使得電商推薦系統的推薦準确率更高。

7.2項目亮點

本文誕生于大資料技術被電商行業廣泛應用的時代,本課題項目主要有以下幾個亮點,可供電商行業和大資料行業進行參考:

7.2.1使用高效率的JavaEE架構

本課題項目采用輕量級且高效率的SpringBoot作為JavaEE微服務架構,摒棄了已被淘汰的SSH、SSM架構,使得系統的業務服務效率得到了很大的提升。同時,SpringBoot被公認為是Spring架構的簡化配置版,使用SpringBoot會使開發成本變低,能降低項目的成本投入并提高系統運作效率。

7.2.2使用Spark作為推薦服務工具

本課題項目的推薦子產品采用Scala語言開發,是以項目的拓展性更好,穩定性更強,項目的運作效率更快。

項目沒有依賴于Hadoop,而是使用SparkSQL作為統計推薦服務引擎,其效率遠比使用MapReduce高;使用SparkMLlib進行機器學習推薦算法的實作,縮短了大資料與機器學習人工智能領域的邊界距離;使用SparkStreaming進行實時推薦,不僅效率高而且推薦準确度也高。

7.2.3使用多種智能推薦算法

除了使用SparkSQL實作統計推薦以外,本課題項目主要借助基于隐語義模型協同過濾算法和實時推薦算法完成商品推薦。在此之外,文章還介紹了多種推薦算法,使用不同的算法能有效地提升商品推薦的準确度。

7.2.4使用非關系型資料庫替換傳統資料庫

随着時間的推移,非關系型資料庫越來越受開發者的歡迎。2019年11月的資料庫流行度排行榜中,衆所周知的三大關系型資料庫前三甲已經大幅下跌,但是目前絕大多數企業仍然使用關系型資料庫存儲業務資料。本文希望能引導開發者們将視線從關系型資料庫向非關系型資料庫轉移。

本課題項目選擇MongoDB存儲業務資料,使其在存儲海量資料以後對性能不會造成影響;使用Redis作為緩存資料庫,使得實時推薦子產品的推薦結果更加準确。無論從資料的存儲量還是處理的速度來看,本課題項目對推進大資料技術應用發展都有非常積極的作用。

7.3存在的問題

盡管本課題實作的電商推薦系統在推薦準确度和推薦效率等諸多方面有很多優勢,但是它仍有很大的改善空間,以下是項目需要改善的地方:

7.3.1研究更準确的推薦算法

文章一開始提到,世界上沒有100%準确的推薦算法,即便是你身上細胞都不肯能完全知道你對不同商品的口味偏好。是以,推薦算法隻有更準确的,沒有最準确的。今後要研究更加準确的推薦算法,結合使用者行為以及使用者的需求分析,使用使用者行為資料進行多次機器學習模型訓練,進而使得電商推薦系統的推薦準确性得到提升。

7.3.2研究更高效的實時推薦架構

本文的前面提到了Flink,由于諸多原因目前還不适合使用Flink,但是Flink處理實時計算的效率比SparkStreaming高,在後期的設計中可以逐漸測試Flink,確定測試穩定且推薦準确無誤後再慢慢将實時推薦子產品往Flink上遷移。

7.3.3提升系統性能

在實作該電商推薦系統的過程中,系統選用不支援資料庫事務管理MongoDB-RHEL-3.4.3版本作為業務資料庫,而在進行使用者推薦清單與商品推薦清單更新,由于要考慮到使用者的實時資料對推薦結果的影響,目前采用“overwrite”覆寫寫入的方式更新業務資料庫。我們知道在覆寫資料表的第一步就是清空原表資料,再寫入資料,而這期間系統将花費一部分的時間開銷。此外,本系統采用本地的CentOS(Redhat簡化版)虛拟機搭建搭建單節點僞分布式項目運作環境,在性能上遠比不上各大巨頭企業的分布式系統。是以,本課題項目在進行個性化推薦的時候系統會有幾秒的資料更新延遲。

在此,未來項目可以考慮以下兩種解決方案:

(1)更新MongoDB元件

在大資料環境中,本課題項目使用的絕大多數元件都是近幾年才開源的元件,盡管很多元件已有新的版本,但是新版本會存在很多未知的Bug,并且新版本元件的相關技術文檔非常少。在企業中使用這樣的元件是很危險的,雖然能在一定程度上提升系統的性能,但是會給系統遺留更多的安全漏洞,并且運維成本也高。是以,在運維技術不夠雄厚的企業不建議使用這種方式提升系統性能。

(2)搭建分布式系統或叢集

大資料環境主要使用分布式計算與分布式存儲技術,此外還可以使用分布式服務,它能在很大程度上提升資料的存儲容量和計算效率。在分布式系統中,多台獨立的主機分别負責各自的服務子產品,通過資源的動态配置設定、負載均衡等技術,系統的多個子產品協作共同完成一個任務,使其更像是單個系統。推薦本課題項目使用搭建完全分布式系統來提升系統的運作、計算效率。

與分布式系統不同的是,叢集主要包含一個系統的多個相同元件,而分布式表示一個系統的多個不同元件。在我們看來,百度、淘寶、騰訊等公司的伺服器好像從來都不用重新開機,并且它們的系統更新資料的速度特别快。真是這樣嗎?其實它們的伺服器也是要經常重新開機的,之是以沒影響到使用者的體驗,重新開機速度快是一個原因,其主要原因還是它們的系統很多個叢集并實作了“高可用”。它們采用系統熱備份的方式部署系統叢集,系統的任意一個節點當機都不會影響到整體系統的性能,進而對使用者體驗毫無影響。是以,在企業級電商推薦系統項目中,搭建系統叢集或MongoDB叢集,将資料存儲在不同節點的MongoDB資料庫中,這樣系統每次覆寫更新使用者推薦清單與商品推薦清單隻用更新單個節點的表資料資訊,進而對使用者體驗感無影響。

緻謝

近四個月的畢業設計已經結束,在這段時間裡得到老師和同學的很大的幫助,首先我要感謝我的導師蔡亮老師。無論從論文的寫作與修改,還是相關操作技術的指導,蔡老師都給予了我極大的幫助。毫不誇張的說,如果沒有蔡老師的細心直到,我根本無法完成本次畢業設計。在這個過程中,蔡老師在各方面給予了我極大的幫助。這将對我以後的學習生活産生很大的幫助,讓我不斷前進、進步。謹以此表達我對蔡老師最崇高的敬意和深深的感謝,他将對我的學習及工作産生很大的影響。

此外,作為一個“技術的使用者、代碼的搬運工”,我一直對全球各大開源技術源碼和資料的提供者保持尊敬、感謝的态度。本課題項目從頭到尾使用的元件包括Apache Spark、Apache Flume、Apache Kafka、Apache Zookeeper、Scala、Java、Redis、MongoDB、CentOS-Linux、Maven、SpringBoot、Angular等等軟體無一例外全部都是永久免費的。在此,我衷心地對Apache等開源貢獻組織以及全球的開源項目貢獻開發者們表示感謝!是他們推動了大資料的發展,推動了時代的進步。

另外,我還要感謝我的實習公司給我提升技術的機會,感謝我的同學家人在百忙之中予以支援,感謝在此期間幫助過我的所有人。

最後,我還要感謝我的學校,在這裡,我實作從一個懵懵懂懂的高中生到大學生的蛻變。我相信,我在這四年裡學到的知識,将會是我一生最大的财富。

參考文獻

[1]流言.亞馬遜如何猜你喜歡[J].電腦愛好者,2013(02):26-27.

[2]洪亮,任秋圜,梁樹賢.國内電子商務網站推薦系統資訊服務品質比較研究——以淘寶、京東、亞馬遜為例[J].圖書情報工作,2016,60(23):97-110.

[3]伍之昂,曹傑. 電子商務推薦系統導論[M]. 科學出版社 2019.2

[4]顔穎.個性化推薦系統在電子商務中的應用研究[J].太原城市職業技術學院學報,2019(11):35-37.

[5]K. G. Srinivasa,Siddesh G. M.,Srinidhi H.. Apache Flume[M].Springer International Publishing:2018-05-16.

[6]Jason Bell John Wiley & Sons, Inc. Apache Spark [J]. 2020 

[7]紀涵,靖曉文,趙政達著. Spark SQL入門與實踐指南[M]. 清華大學出版社.2018: 82-120.

[8]王曉華,夏毓彥. SparkMLlib機器學習實踐(第2版) [M]. 清華大學出版社 2017.3

[9]Dominique Laffly John Wiley & Sons, Inc.Spark and Machine Learning Library[J]. 2020 

[10]Karima Sid,Mohamed Batouche. Ensemble Learning for Large Scale Virtual Screening on Apache Spark[M].Springer International Publishing:2018-05-16.

[11]王佳娴,王中傑.基于Spark的分布式實時推薦系統[J].系統仿真技術,2017,13(02):158-161.

[12]Mikhail Genkin,Frank Dehne,Pablo Navarro,Siyu Zhou. Machine-Learning Based Spark and Hadoop Workload Classification Using Container Performance Patterns[M].Springer International Publishing:2019-10-08.

[13]周恒新. 基于Hadoop架構的商業推薦引擎協同過濾算法設計與實作[D].電子科技大學,2016.

[14]岑凱倫,于紅岩,楊騰霄.大資料下基于Spark的電商實時推薦系統的設計與實作[J].現代計算機(專業版),2016(24):61-69.

[15]單京晶. 基于内容的個性化推薦系統研究[D].東北師範大學,2015.

[16]韓德志,陳旭光,雷雨馨,戴永濤,張肖.基于Spark Streaming的實時資料分析系統及其應用[J].計算機應用,2017,37(05):1263-1269.

[17]鄭鳳飛,黃文培,賈明正.基于Spark的矩陣分解推薦算法[J].計算機應用,2015,35(10):2781-2783+2788.

[18]Hien Luu. Spark SQL (Foundations)[M].Apress:2018-08-20.

[19]王建芳. 機器學習算法實踐——推薦系統的協同過濾理論及其應用[M]. 清華大學出版社 2018.11

[20]陸俊堯,李玲娟.基于Spark的協同過濾算法并行化研究[J].計算機技術與發展,2019,29(01):85-89.

[21]李聰,馬麗.  電子商務推薦系統瓶頸問題研究[M]. 科學出版社有限責任公司 2017.4

[22]李思. 基于Spark平台的個性化新聞推薦系統研究[D].華北理工大學,2019.

[23]黃美靈. 推薦系統算法實踐[M]. 電子工業出版社. 2019.9

[24]郇長武,朱琳,陳俊材,周鋒奇,張智勇.基于“網際網路+”的多能融合個性化方案推薦平台設計[J].電子設計工程,2020,28(08):30-33+38.

[25]車晉強,謝紅薇.基于Spark的分層協同過濾推薦算法[J].電子技術應用,2015,41(09):135-138.

繼續閱讀