沈黃金 朱大洲,2* 王輝 劉蕾
(1.黑龍江八一農(nóng)墾大學(xué) 黑龍江省大慶市 163000 2.農(nóng)業(yè)農(nóng)村部食物與營養(yǎng)發(fā)展研究所 北京市 100081)
近年來農(nóng)產(chǎn)品電子商務(wù)發(fā)展迅速,根據(jù)商務(wù)部發(fā)布的信息,2019年前三季度我國農(nóng)村網(wǎng)絡(luò)零售額達(dá)1.2 萬億元,同比增長19.7%,全國農(nóng)產(chǎn)品網(wǎng)絡(luò)零售額2824.7 億元,同比增長了26.4%[1],農(nóng)產(chǎn)品電商規(guī)模逐漸增大。而對于農(nóng)產(chǎn)品電商企業(yè)的分析表示,多數(shù)企業(yè)僅依靠傳統(tǒng)的B2C 模式進(jìn)行商業(yè)營銷,沒有對用戶需求進(jìn)行針對性的營銷[2],農(nóng)產(chǎn)品智能推薦系統(tǒng)的出現(xiàn)可以把用戶在平臺上留下的大量行為數(shù)據(jù)進(jìn)行分析,預(yù)測用戶需求,為用戶提供個(gè)性化的推薦服務(wù)。
推薦系統(tǒng)的關(guān)鍵在于推薦算法的實(shí)現(xiàn)。推薦算法通常分為六大類,分別是基于內(nèi)容的推薦,基于人口統(tǒng)計(jì)學(xué)的推薦,基于知識的推薦,基于社區(qū)的推薦,基于協(xié)同過濾的推薦以及混合推薦[3],其中使用最為廣泛的是基于協(xié)同過濾的推薦算法[4]。協(xié)同過濾算法主要分為基于用戶的推薦算法User-Based CF 和基于物品的推薦算法Item-Based CF?;谟脩舻膮f(xié)同過濾算法是通過計(jì)算用戶之間的相似性,將與目標(biāo)用戶相似度較高的用戶喜歡的商品推薦給目標(biāo)用戶?;谖锲返膮f(xié)同過濾則是計(jì)算物品之間的相似,將與目標(biāo)用戶喜歡的物品相似度較高的物品推薦給目標(biāo)用戶[5]。
推薦系統(tǒng)要在海量的產(chǎn)品和服務(wù)中發(fā)掘出最適合用戶的一小部分內(nèi)容,它要處理的數(shù)據(jù)量十分巨大,對實(shí)時(shí)性也有很高的需求,電商網(wǎng)站淘寶每日就需要處理十億計(jì)的商品瀏覽、購買和收藏?cái)?shù)據(jù),所以推薦系統(tǒng)在架構(gòu)和算法方面面臨著巨大的考驗(yàn),面對規(guī)模龐大的數(shù)據(jù)集,往往需要消耗計(jì)算機(jī)大量內(nèi)存和運(yùn)行時(shí)間[6],在單機(jī)上實(shí)現(xiàn)這些推薦算法需要漫長的運(yùn)行周期,不能得到及時(shí)的反饋和更新。因此,通過在Spark 平臺上并行化實(shí)現(xiàn)推薦算法的方式就能很好地提高計(jì)算效率。另外在電商系統(tǒng)中,用戶的隱式反饋數(shù)據(jù)和顯示反饋數(shù)據(jù)通常不超過項(xiàng)目總數(shù)據(jù)的百分之一[7],數(shù)據(jù)的稀缺性也是推薦系統(tǒng)需要解決的重要問題之一,王雪蓉等人提出了將用戶行為關(guān)聯(lián)聚類的方式可以更好地實(shí)現(xiàn)推薦效果[8]。本文將通過EM 算法將用戶行為關(guān)聯(lián)聚類,在Spark 平臺上并行化運(yùn)行協(xié)同過濾算法來解決農(nóng)產(chǎn)品推薦系統(tǒng)實(shí)時(shí)性以及數(shù)據(jù)稀缺性問題。
Spark 的核心部分是Spark Core,主要由三部分組成:
(1)Spark Context:應(yīng)用的執(zhí)行和輸出都是通過Spark Context來完成的。
圖1:Spark 應(yīng)用程序框架
圖2:系統(tǒng)功能模塊設(shè)計(jì)圖
(2)計(jì)算引擎:計(jì)算引擎由DAG、RDD 以及節(jié)點(diǎn)上的執(zhí)行器組成,RDD 是Spark 的核心抽象模型,是一個(gè)只讀的分布式數(shù)據(jù)集,可以通過轉(zhuǎn)換操作在轉(zhuǎn)換過程中對RDD 進(jìn)行各種變換[9]。
(3)部署模式:Spark SQL 和Spark MLlib 也是Spark 體系中的重要部分,Spark SQL 提供了用于處理結(jié)構(gòu)化數(shù)據(jù)的API,支持Hive,RDD,JSON 和JDBC 等多種數(shù)據(jù)源,Spark MLlib 提供了Spark 的機(jī)器學(xué)習(xí)庫,包含了常用的機(jī)器學(xué)習(xí)算法和工具,還包含了算法的底層優(yōu)化和高層次的管道API。
圖3:系統(tǒng)架構(gòu)圖
圖4:消費(fèi)者E-R 圖
圖5:管理員E-R 圖
在Spark 中,提交給Spark 執(zhí)行的計(jì)算任務(wù)被稱為應(yīng)用,一個(gè)應(yīng)用是由一個(gè)任務(wù)控制節(jié)點(diǎn)和若干個(gè)作業(yè)構(gòu)成的,當(dāng)執(zhí)行一個(gè)應(yīng)用時(shí),任務(wù)控制節(jié)點(diǎn)Driver 會向集群管理器申請資源啟動Executor,發(fā)送應(yīng)用程序代碼和文件,然后在Executor 上執(zhí)行任務(wù),運(yùn)行結(jié)束后將執(zhí)行結(jié)果返回給任務(wù)控制節(jié)點(diǎn)Driver,寫到HDFS 或者其他數(shù)據(jù)庫中。Spark 計(jì)算程序框架如圖1所示。
基于Spark 的農(nóng)產(chǎn)品推薦系統(tǒng)主要分為兩大模塊,一是系統(tǒng)的業(yè)務(wù)模塊,二是系統(tǒng)的推薦模塊。如圖2所示。
系統(tǒng)業(yè)務(wù)模塊有普通用戶操作模塊和管理員用戶操作模塊兩大類,系統(tǒng)推薦模塊使用的是Spark 大數(shù)據(jù)計(jì)算框架進(jìn)行數(shù)據(jù)處理和模型訓(xùn)練,分布式文件系統(tǒng)進(jìn)行數(shù)據(jù)的儲存和加載。系統(tǒng)通過在web 埋點(diǎn)頁面中“埋點(diǎn)”監(jiān)督用戶行為,當(dāng)用戶點(diǎn)擊加載某個(gè)頁面時(shí),獲取用戶ID、商品ID 以及用戶行為等參數(shù)保存到數(shù)據(jù)庫中。將獲取到的數(shù)據(jù)加載至hdfs 分布式文件系統(tǒng),并基于SparkContext讀取和形成RDD,基于RDD建立用戶模型和農(nóng)產(chǎn)品模型,得到用戶-農(nóng)產(chǎn)品的預(yù)測評分,形成推薦列表保存到數(shù)據(jù)庫。系統(tǒng)架構(gòu)圖如圖3所示。
系統(tǒng)用EM 算法將用戶聚類劃分成不同用戶簇,在不同用戶簇的基礎(chǔ)上并行化實(shí)現(xiàn)基于物品的協(xié)同過濾算法。基于物品的協(xié)同過濾算法認(rèn)為能引起用戶興趣的項(xiàng)目,一定與之前評分較高的項(xiàng)目相似,因此首先計(jì)算用戶偏好模型,構(gòu)建用戶-農(nóng)產(chǎn)品評分矩陣,然后計(jì)算農(nóng)產(chǎn)品之間的相似度,利用相似度得到用戶對農(nóng)產(chǎn)品的預(yù)測評分。
用戶行為數(shù)據(jù)分為隱式反饋數(shù)據(jù)和顯示反饋數(shù)據(jù),本系統(tǒng)將使用隱式反饋數(shù)據(jù)來計(jì)算用戶的偏好模型。首先將用戶在瀏覽網(wǎng)頁過程中的點(diǎn)擊、收藏、購買和加入購物車的用戶行為,構(gòu)成用戶的偏好集合:IA={A1,A2,A3,A4},設(shè)置wi為用戶對不同偏好特征的偏好權(quán)值,其中得出用戶偏好模型為然后用熵權(quán)法確定不同偏好特征的權(quán)值:
(1)將用戶Ui的偏好特征表示為i*4 階矩陣(bij)i*4,bij表示用戶i 在第j(j=1,2,3,4)個(gè)特征上的權(quán)值,用公式(1)和(2)來標(biāo)準(zhǔn)化處理數(shù)據(jù)。
(2)計(jì)算偏好特征中第j 項(xiàng)的熵值。
(3)計(jì)算偏好特征中第j 項(xiàng)的權(quán)值。
通過以上方法即可得到每一種用戶偏好特征的權(quán)值。
得到用戶偏好模型后,使用EM 聚類算法對用戶進(jìn)行聚類。EM 算法先通過猜測隱含數(shù)據(jù),基于觀察數(shù)據(jù)和猜測數(shù)據(jù)一起來極大化對數(shù)似然求解模型參數(shù)。接著基于當(dāng)前模型參數(shù)繼續(xù)猜測隱含數(shù)據(jù),繼續(xù)極大化對數(shù)似然求解模型參數(shù),不斷迭代下去直到算法收斂即得到最終模型參數(shù)。EM 算法在一定程度上解決了原始數(shù)據(jù)的數(shù)據(jù)缺失問題。具體實(shí)現(xiàn)過程如下:
(1)首先將用戶偏好模型劃分到集群的各個(gè)節(jié)點(diǎn)上,在不同節(jié)點(diǎn)計(jì)算任意兩個(gè)用戶的相似度,將相似度較高的兩個(gè)用戶合并成一類。
(2)根據(jù)公式(5)計(jì)算每一類的相似性。
(3)使用Shuffle 函數(shù)劃分類別,將不同類別緩存到內(nèi)存中去。
(4)根據(jù)公式(6)對參數(shù)進(jìn)行迭代,直到完成聚類。
(5)清除中間數(shù)據(jù),將結(jié)果儲存在不同節(jié)點(diǎn)上。
計(jì)算相似度主要有三種方法:余弦相似度、修正余弦相似度和皮爾遜相關(guān)系數(shù)。本文使用了皮爾遜相關(guān)系數(shù)計(jì)算兩個(gè)農(nóng)產(chǎn)品之間的相似度,首先找出對農(nóng)產(chǎn)品i 和農(nóng)產(chǎn)品j 都有評價(jià)的所有用戶,將所有用戶對所購買的農(nóng)產(chǎn)品的評價(jià)作為一個(gè)向量,計(jì)算兩個(gè)向量之間的皮爾遜相關(guān)系數(shù)來計(jì)算兩個(gè)農(nóng)產(chǎn)品間的相似度sim(i,j)。公式(7)是皮爾遜相似度的計(jì)算公式,集合U 代表同時(shí)對農(nóng)產(chǎn)品i 和j進(jìn)行評分的用戶集,和分別代表農(nóng)產(chǎn)品i 和農(nóng)產(chǎn)品j 所獲得所有評分的平均值,通過調(diào)用Computer Pearson()函數(shù)來進(jìn)行兩個(gè)農(nóng)產(chǎn)品之間相似度的計(jì)算。
圖6:農(nóng)產(chǎn)品推薦系統(tǒng)的推薦與搜索頁面
圖7:農(nóng)產(chǎn)品管理頁面
將協(xié)同過濾算法并行化運(yùn)行在Spark 分布式平臺上,首先將數(shù)據(jù)加載到HDFS 分布式文件系統(tǒng)中,F(xiàn)Lume 將從HDFS 中采集到的日志發(fā)送到Spark 集群。并經(jīng)過預(yù)處理和算法建模等方式,對用戶和農(nóng)產(chǎn)品形成預(yù)測評分,形成推薦列表推送到用戶手中。詳細(xì)過程為:
(1)搭建Hadoop 平臺與Spark 平臺,將數(shù)據(jù)存放至Hadoop的分布式文件系統(tǒng)HDFS 中;
(2)根據(jù)用戶的行為計(jì)算用戶特征偏好權(quán)值,并儲存;
(3)對用戶進(jìn)行聚類,將不同用戶簇以及相應(yīng)的用戶-農(nóng)產(chǎn)品評分?jǐn)?shù)據(jù)存放至不同結(jié)點(diǎn);
(4)并行運(yùn)行協(xié)同過濾算法;
(5)預(yù)測用戶-農(nóng)產(chǎn)品評分;
(6)形成推薦列表。
系統(tǒng)的Web 端業(yè)務(wù)模塊包含了農(nóng)產(chǎn)品查詢、農(nóng)產(chǎn)品管理、用戶管理和農(nóng)產(chǎn)品推薦等功能模塊。有管理員和消費(fèi)者兩類操作人員,管理員身份登錄可進(jìn)行后臺管理操作,即對農(nóng)產(chǎn)品和農(nóng)產(chǎn)品種類的添加、刪除、查看和更新,以及對訂單的管理和個(gè)人信息的修改。普通消費(fèi)者登錄后可通過農(nóng)產(chǎn)品類型以及關(guān)鍵字查詢農(nóng)產(chǎn)品,查看農(nóng)產(chǎn)品詳細(xì)信息,對農(nóng)產(chǎn)品進(jìn)行購買、收藏、添加購物車等操作。系統(tǒng)E-R 圖如圖4 和圖5所示。
根據(jù)E-R 圖建立出具體的數(shù)據(jù)庫表如下:
(1)用戶信息表,包括用戶名,用戶ID,用戶密碼,用戶性別,用戶郵箱,用戶電話,用戶地址,用戶類型;
圖8:訂單管理頁面
圖9:不同節(jié)點(diǎn)個(gè)數(shù)的性能表現(xiàn)
(2)農(nóng)產(chǎn)品類別信息表,包含農(nóng)產(chǎn)品類別ID,農(nóng)產(chǎn)品類別名稱;
(3)農(nóng)產(chǎn)品詳細(xì)信息表,包含農(nóng)產(chǎn)品名稱,產(chǎn)地,類別,價(jià)格,庫存,描述,圖片,創(chuàng)建時(shí)間等;
表1:算法運(yùn)行結(jié)果
(4)訂單信息表,包含訂單編號,創(chuàng)建日期,購買數(shù)量,發(fā)貨狀態(tài),支付狀態(tài),用戶ID 等;
(5)用戶行為信息表,包含用戶ID,農(nóng)產(chǎn)品ID,瀏覽次數(shù),收藏狀態(tài),添加購物車狀態(tài),購買次數(shù)等。
Web 前端部分使用了html/css,javaScript,bootstrap 技術(shù),后臺使用了ssm 框架開發(fā),數(shù)據(jù)庫使用的是mysql。圖6、圖7 和圖8 是系統(tǒng)的部分Web 端頁面。
用公開數(shù)據(jù)集對該農(nóng)產(chǎn)品推薦系統(tǒng)進(jìn)行以下兩方面性能研究:
(1)驗(yàn)證本文實(shí)現(xiàn)的推薦算法與傳統(tǒng)算法相比,推薦效果是否有提升。
(2)驗(yàn)證基于Spark 平臺的分布式實(shí)現(xiàn),對算法的擴(kuò)展性是否有提升。
在實(shí)驗(yàn)集群中設(shè)置一個(gè)master 節(jié)點(diǎn)和兩個(gè)slaves 節(jié)點(diǎn),三個(gè)節(jié)點(diǎn)分別布置在CPU i5-5200U 四核處理器,內(nèi)存為4GB 的主機(jī)上,操作系統(tǒng)為CentOS-7。首先在master 主節(jié)點(diǎn)中安裝和配置Hadoop環(huán)境、spark 環(huán)境、Scala 環(huán)境以及JDK 環(huán)境,本試驗(yàn)采用的是Hadoop2.6.0、spark2.1.0、Scala2.11.8、jdk1.8.0,然后使用scp 命令將主節(jié)點(diǎn)中配置好的的Scala 和jdk 拷貝到兩個(gè)slaves 從節(jié)點(diǎn)。
搭建好集群環(huán)境后,將數(shù)據(jù)存放到HDFS 分布式文件系統(tǒng)中,Spark 會生成一個(gè)全局常量SparkContext,從HDFS 中讀取數(shù)據(jù)。TextFile()函數(shù)將從HDFS 中讀取的數(shù)據(jù)形成一行一行的RDD。一個(gè)RDD 是一個(gè)只讀的分布式數(shù)據(jù)集,可以通過轉(zhuǎn)換操作在轉(zhuǎn)換過程中對RDD 進(jìn)行各種變換,Spark 通過RDD 彈性內(nèi)存處理,將計(jì)算結(jié)果儲存到HDFS 中,同時(shí)通過農(nóng)產(chǎn)品建模、用戶建模和智能推薦模塊對數(shù)據(jù)分析處理。
實(shí)驗(yàn)數(shù)據(jù)來自阿里巴巴天池大數(shù)據(jù)平臺提供的公開數(shù)據(jù)集UserBehavior.csv,一共20 萬條行為記錄。字段包含了user_id(用戶ID)、cate_id(商品ID)、btag(用戶行為),用戶行為包含pv(瀏覽)、fav(收藏)、cart(加入購物車)和buy(購買)。
5.2.1 準(zhǔn)確度(Precision)、召回率(Recall)計(jì)算及運(yùn)行時(shí)間分析
準(zhǔn)確率是實(shí)際應(yīng)用中最重視的指標(biāo)之一,它直接決定了推薦的質(zhì)量,準(zhǔn)確率的定義如公式(8),召回率的定義如公式(9)。R(u)是算法根據(jù)訓(xùn)練集得出來的N 個(gè)推薦農(nóng)產(chǎn)品集合,T(u)是用戶在測試集上喜歡的農(nóng)產(chǎn)品集合。
從表1看出,相比于傳統(tǒng)的User-based CF和Item-based CF而言,本文的基于EM 聚類的協(xié)同過濾方法在準(zhǔn)確率上分別提高了21.7%和17.21%,在召回率上分別提高了7.87%和2.84%。
5.2.2 算法擴(kuò)展性測試
本測試分析了EM 聚類協(xié)同過濾算法在Spark 集群不同節(jié)點(diǎn)個(gè)數(shù)下的性能表現(xiàn)。
在計(jì)算性能方面,從圖9 可看出在Spark 平臺上運(yùn)行的算法,可以通過增加節(jié)點(diǎn)的方式來提高計(jì)算效率,使算法具備一定的可擴(kuò)展性。當(dāng)集群節(jié)點(diǎn)個(gè)數(shù)增加到15 個(gè)以上時(shí),算法的執(zhí)行時(shí)間便不再減小。
本文設(shè)計(jì)開發(fā)了一種基于Spark 平臺的農(nóng)產(chǎn)品智能推薦系統(tǒng),系統(tǒng)使用基于EM 聚類的混合協(xié)同過濾推薦算法,算法集成運(yùn)行在Spark 分布式計(jì)算平臺上,通過實(shí)驗(yàn)對比分析,與單獨(dú)使用基于用戶的協(xié)同過濾和基于物品的協(xié)同過濾相比,本文使用的方法顯著提高了算法的運(yùn)行時(shí)間和準(zhǔn)確率,并可以通過增加節(jié)點(diǎn)的方式提高算法的擴(kuò)展性。在大數(shù)據(jù)環(huán)境下,Spark 平臺基于EM 聚類的協(xié)同過濾農(nóng)產(chǎn)品推薦系統(tǒng)能為用戶提供針對性推薦,為農(nóng)產(chǎn)品的購買和銷售問題提供有效解決方案。