摘要:經(jīng)過一段時(shí)間的說句搜集,當(dāng)具備一定的數(shù)據(jù)量時(shí),你就可以用通過機(jī)器學(xué)習(xí)算法來執(zhí)行一些有用的分析并產(chǎn)生一些有價(jià)值的推薦了。
翻譯自?Google Cloud Platform 原文標(biāo)題:Using Machine Learning on Compute Engine to Make Product Recommendations 原文地址:https://cloud.google.com/solu...
在一個(gè)網(wǎng)絡(luò)商店中,你可以使用谷歌云平臺(tái)來創(chuàng)建一個(gè)可拓展的、高效可用的服務(wù)來向用戶推薦相關(guān)的商品。
網(wǎng)購平臺(tái)的競(jìng)爭(zhēng)從沒有像今天這樣激烈過,雖然顧客們?cè)诓煌墓?yīng)商之間花費(fèi)越來越的錢,但是對(duì)于單個(gè)零售商而言顧客們?cè)捹M(fèi)的錢卻在變少。與此同時(shí),單筆購物的消費(fèi)也在變少,一部分的原因也是因?yàn)檫@種競(jìng)爭(zhēng)只需要簡(jiǎn)簡(jiǎn)單單的一次點(diǎn)擊。向顧客提供相關(guān)商品的推薦能夠有效的將潛在顧客變?yōu)橘徺I力并提高訂單的平均價(jià)值。
通過閱讀這篇文章,你能夠搭建起一個(gè)基本的環(huán)境用于支撐一個(gè)基礎(chǔ)的推薦引擎,你也可以根據(jù)自己的需求不斷的調(diào)整和完善它。在云平臺(tái)上面運(yùn)行推薦殷勤能夠給開發(fā)者提供一個(gè)靈活、可拓展的解決方案。
在這篇文章中,你將可以了解到一個(gè)真實(shí)的房地產(chǎn)租賃公司是如何計(jì)算相關(guān)推薦并向訪問他們網(wǎng)站的用戶推薦這些產(chǎn)品的。
情景假設(shè)Samantha正在尋找一幢房子來度過她的假期。她在一家度假網(wǎng)站上面注冊(cè)過賬號(hào)并且曾經(jīng)在這個(gè)網(wǎng)站上面購買過幾次獨(dú)家套餐。Sam想要找到根據(jù)自己的性格和品味推薦的房子。系統(tǒng)應(yīng)該已經(jīng)知道了她的口味,顯然,根據(jù)她的過往訂單,她喜歡的是豪華型的房子,因此,系統(tǒng)也應(yīng)該向她推薦一些類似的房間。
推薦方案概覽為了向用戶進(jìn)行推薦,不管是讓用戶實(shí)時(shí)瀏覽到還是通過email告知用戶,有以下幾件事情是一定要做的。首先,如果你對(duì)用戶的品味和愛好知之甚少,那么你可能只能根據(jù)商品的一些屬性多帶帶的進(jìn)行推薦,但是你的系統(tǒng)一定要有能夠從用戶那兒學(xué)習(xí)的能力,也就是說能夠從用戶那里手機(jī)他們的喜好和行為。經(jīng)過一段時(shí)間的說句搜集,當(dāng)具備一定的數(shù)據(jù)量時(shí),你就可以用通過機(jī)器學(xué)習(xí)算法來執(zhí)行一些有用的分析并產(chǎn)生一些有價(jià)值的推薦了。為了讓其他用戶的輸入也能夠改善推薦的結(jié)果,推薦系統(tǒng)還需要能夠周期性的進(jìn)行重新訓(xùn)練。這篇文章中介紹的主要是已經(jīng)有足夠數(shù)據(jù)量能夠進(jìn)行很好的積極學(xué)習(xí)訓(xùn)練的情況下的推薦系統(tǒng)。
一個(gè)典型的推薦引擎一般將數(shù)據(jù)經(jīng)過以下這四步的處理:
這種系統(tǒng)的結(jié)構(gòu)可以通過一下這張圖表來表示:
每一步都可以進(jìn)行定制以達(dá)到一些特殊的需求,這樣的系統(tǒng)由這些部分組成:
一個(gè)可拓展的前端用于記錄與用戶的交互以此采集數(shù)據(jù)
可以被機(jī)器學(xué)習(xí)平臺(tái)訪問到的永久存儲(chǔ)引擎。裝載數(shù)據(jù)到存儲(chǔ)容器中也包括了一些步驟,比如導(dǎo)入/導(dǎo)出(import- export?)數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行一些必要的變形(transformation)
一個(gè)機(jī)器學(xué)習(xí)平臺(tái)用于分析已有的數(shù)據(jù)集并產(chǎn)生推薦
可以被前端訪問到的存儲(chǔ)容器,可以是實(shí)時(shí)的也可以不是,由需求中對(duì)推薦時(shí)間的要求來決定
選擇組件(components)為了在速度、簡(jiǎn)便性、成本控制和精確度之間的平衡,這篇文章選擇了Google App Engine,?Google Cloud SQL, 和?在?Google Compute Engine?上使用?bdutil運(yùn)行的Apache Spark?.
App Engine?能夠輕松地處理每秒處理數(shù)萬次的請(qǐng)求。不管你是用于創(chuàng)建網(wǎng)站還是用來將數(shù)據(jù)存儲(chǔ)進(jìn)后端的存儲(chǔ)容器,App Engine都能夠讓你在很短的時(shí)間之內(nèi)將代碼發(fā)布到生產(chǎn)環(huán)境中。
Cloud SQL對(duì)于開發(fā)者而言也非常的簡(jiǎn)單。Cloud SQL能夠拓展至32核、208GB內(nèi)存的虛擬機(jī)并且能夠拓展容量至10TB并實(shí)現(xiàn)每GB30IOPS和數(shù)以千計(jì)的并發(fā)連接。這樣的性能對(duì)于這篇文章的中的例子來說是綽綽有余的,而對(duì)于真實(shí)環(huán)境中的大數(shù)據(jù)推薦引擎來說,Cloud SQL也提供了能夠直接和Spark交互的特性。
Spark提供了比典型Hadoop引擎更好的性能,在使用?Spark MLlib的情況下,Spark的速度可以比后者快10到100倍。你可以在幾分鐘內(nèi)分析數(shù)以億計(jì)的數(shù)據(jù),這也增加了推薦系統(tǒng)的敏捷性,使得管理員能夠更加頻繁的運(yùn)行推薦算法。Spark同時(shí)也趨向于使用更加簡(jiǎn)化的程序模型,帶來了更加簡(jiǎn)單的API使用體驗(yàn)和更加靈活的語言特性。Spark在調(diào)節(jié)計(jì)算機(jī)內(nèi)存使用的同時(shí)也盡可能的減少了硬盤的讀寫頻率,與此同時(shí),Spark也在努力的簡(jiǎn)化I/O操作。這個(gè)解決方案中,使用Compute Engine來支撐分析所使用的基礎(chǔ)設(shè)施,Compute Engine通過其按時(shí)、按需求計(jì)費(fèi)的方式盡可能的降低了進(jìn)行分析所帶來的成本。
以下的這幅流程圖和之前的結(jié)構(gòu)圖是一樣的,但展示了每一步所使用到的技術(shù):
收集數(shù)據(jù)一個(gè)推薦系統(tǒng)能夠通過用戶潛在的行為或者明確的輸入來收集用戶相關(guān)的數(shù)據(jù)
行為數(shù)據(jù)的采集是非常容易的,因?yàn)槟憧梢员4嬗脩艋顒?dòng)的各種日志。采集這類數(shù)據(jù)也是非常簡(jiǎn)單直接的因?yàn)樗恍枰脩羝渌魏蔚牟僮鳎吘顾麄円呀?jīng)在使用這個(gè)應(yīng)用了。但這個(gè)手段的負(fù)面之處在于這些數(shù)據(jù)非常難以分析。舉個(gè)例子,從用戶不太感興趣的日志中過去出他們可能感興趣的內(nèi)容就是一件非常笨重的事情。你可以通過這個(gè)列子來看一看使用日志來進(jìn)行潛在數(shù)據(jù)分析的例子Real-time Log Analysis using Fluentd and BigQuery
直接輸入的數(shù)據(jù)相對(duì)而言更加難以采集,因?yàn)檫@需要用戶做一些額外的操作,比如寫一條評(píng)價(jià)。處于各種各樣的原因,用戶可能不太想提供這樣的信息。但如果能夠理解用戶的行為,這樣的結(jié)果就十分明確了
存儲(chǔ)數(shù)據(jù)你能夠向算法提供的數(shù)據(jù)集越大,那么你的推薦表現(xiàn)就會(huì)越好。這也就以為著,任意的一個(gè)推薦系統(tǒng)都有可能很快速的成為一個(gè)大數(shù)據(jù)項(xiàng)目。
你用于創(chuàng)建推薦系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)能夠幫助你決定你所要使用的存儲(chǔ)引擎。你可以選擇使用NoSQL數(shù)據(jù)庫、標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫、甚至其他的一些對(duì)象存儲(chǔ)。所有的這些選項(xiàng)都是可行的,這取決于你是在分析用戶的輸入還是行為同時(shí)其他的一些因素比如執(zhí)行的簡(jiǎn)便性、這些存儲(chǔ)引擎能夠管理的數(shù)據(jù)容量,與其他環(huán)境的兼容性以及可移植性等等。
當(dāng)存儲(chǔ)用戶的費(fèi)率(rating)或者事件(events)時(shí),一個(gè)可拓展和可管理的數(shù)據(jù)庫能夠簡(jiǎn)化操作所需要的任務(wù)數(shù)量并能夠幫助我們把重心放在推薦系統(tǒng)上。?Cloud SQL滿足了所有的這些需求,并且能夠使從Spark直接導(dǎo)入數(shù)據(jù)變得非常簡(jiǎn)單。
以下的實(shí)例代碼展示了Cloud SQL數(shù)據(jù)表的結(jié)構(gòu)。Accommodation表表示了房產(chǎn)的評(píng)分,Rating表表示的是用戶對(duì)每一具體房產(chǎn)所給出的評(píng)分
CREATE TABLE Accommodation ( id varchar(255), title varchar(255), location varchar(255), price int, rooms int, rating float, type varchar(255), PRIMARY KEY (ID) ); CREATE TABLE Rating ( userId varchar(255), accoId varchar(255), rating int, PRIMARY KEY(accoId, userId), FOREIGN KEY (accoId) REFERENCES Accommodation(id) );
Spark能夠從不同的來源中獲得數(shù)據(jù),比如Hadoop或者Cloud Storage.本文通過使用?Java Database Connectivity (JDBC) connector直接從Cloud SQL中獲得數(shù)據(jù)。由于Spark的任務(wù)是并行的,因此這個(gè)接口必須對(duì)所有實(shí)例可訪問。
分析數(shù)據(jù)在設(shè)計(jì)分析算法的時(shí)候往往需要充分理解應(yīng)用的要求,這些要求包括
推薦算法的及時(shí)性:程序給出推薦的結(jié)果需要多長(zhǎng)的時(shí)間
對(duì)于數(shù)據(jù)的過濾方法:程序是僅僅根據(jù)用戶自己的口味還是包括其他用戶的想法,又或者是邏輯上與這個(gè)產(chǎn)品相匹配的
理解解釋性在分析數(shù)據(jù)時(shí)首要考慮的因素就是你的應(yīng)用需要多長(zhǎng)的時(shí)間將推薦的結(jié)果展示給用戶。如果你需要立即展示你的推薦結(jié)果,比如當(dāng)用戶在瀏覽一個(gè)產(chǎn)品的時(shí)候,那么相對(duì)于向用戶發(fā)送包含推薦信息的郵件你需要一個(gè)更多靈活性的分析算法。
實(shí)時(shí)系統(tǒng)可以在數(shù)據(jù)產(chǎn)生時(shí)就進(jìn)行處理。這種類型的系統(tǒng)往往包括了一些能夠處理和分析數(shù)據(jù)流的工具。一個(gè)實(shí)時(shí)操作系統(tǒng)需要給出一個(gè)及時(shí)所見即所得的推薦
批處理推薦需要你能夠周期性的處理數(shù)據(jù)。這一手段意味著為了分析相關(guān)性,足夠的數(shù)據(jù)需要被產(chǎn)生,比如每日銷量。批處理系統(tǒng)適用于在晚些時(shí)候發(fā)送郵件推薦這種情況
近實(shí)時(shí)分析需要你迅速的獲取數(shù)據(jù)這樣就能夠每隔幾分鐘甚至幾秒鐘刷新分析的數(shù)據(jù)。一個(gè)近實(shí)時(shí)分析系統(tǒng)適用于在同一個(gè)瀏覽會(huì)話期間產(chǎn)生推薦的情況。
一個(gè)推薦系統(tǒng)可以歸入以上三種及時(shí)性標(biāo)簽的任意一種但是,對(duì)于一個(gè)在線銷售系統(tǒng)而言,你需要考慮一些結(jié)余近實(shí)時(shí)和批處理之間的情況,這取決于應(yīng)用能夠獲取的流量和用戶輸入的情況。運(yùn)行分析的平臺(tái)可以直接從數(shù)據(jù)存儲(chǔ)的平臺(tái)開始工作也可以基于一個(gè)周期性轉(zhuǎn)存數(shù)據(jù)的平臺(tái)。
過濾數(shù)據(jù)搭建一個(gè)推薦系統(tǒng)的核心組件就是過濾,最常用的手段包括
基于內(nèi)容的推薦(Content-based):一個(gè)受歡迎的被推薦的商品和用戶瀏覽或者喜歡過的有相同的屬性
基于集群的推薦(Cluster):被推薦的商品總是一起出現(xiàn),不管其他的用戶做了什么
協(xié)同過濾推薦(Collaborative):喜歡該件商品的其他用戶也喜歡的被推薦的商品
雖然云平臺(tái)可以支持任意的一種方法,但是本文主要關(guān)注采用協(xié)同過濾方法的推薦,這一方法可以通過使用Apache Spark來被執(zhí)行。想了解更多的關(guān)于基于內(nèi)容和基于集群的推薦算法,可以訪問?appendix
協(xié)同過濾算法確保你能夠抽象化商品的屬性并且基于用戶的口味進(jìn)行預(yù)測(cè)。這種過濾的輸出基于這樣的一種假設(shè):喜歡過統(tǒng)一商品的不同的兩個(gè)用戶現(xiàn)在可能會(huì)喜歡同樣的東西
你可以將評(píng)分或者互動(dòng)的數(shù)據(jù)重新演繹為一個(gè)矩陣,商品和用戶各占一個(gè)維度。協(xié)同過濾方法嘗試針對(duì)一個(gè)明確的“用戶-產(chǎn)品”對(duì)去預(yù)測(cè)矩陣中缺少的部分。下圖中的兩個(gè)矩陣很相似,但是第二個(gè)矩陣是根據(jù)第一個(gè)矩陣中將存在數(shù)據(jù)的部分替換為1,不存在數(shù)據(jù)的部分替換為0而預(yù)測(cè)的。結(jié)果矩陣是一個(gè)真值表用1表示用戶與產(chǎn)品之間存在聯(lián)系。
這里用兩種不同的手段去使用協(xié)同過濾方法:
Memory-based filtering:計(jì)算產(chǎn)品或者用戶之間的相似度
Model-based filtering?:嘗試去學(xué)習(xí)用戶與產(chǎn)品之間交互的深層模式
本文使用model-based方法,基于用戶已經(jīng)訂購過的商品
本文中所用的所有分析手段都可以通過?PySpark獲得,這個(gè)接口為Spark程序開發(fā)提供了一個(gè)Python的封裝。你也可以使用Scala或者Java開發(fā),具體請(qǐng)看?Spark的開發(fā)文檔
訓(xùn)練模型Spark MLlib使用?Alternating Least Squares (ALS)算法來訓(xùn)練模型。你可以使用一下幾種參數(shù)的多種組合來獲得方差和偏差之間的最好結(jié)果
Rank:引導(dǎo)用戶給出評(píng)分的未知因素的數(shù)量。這些因素可能包含看比如年齡、性別或者所在的地區(qū)。在一定的范圍內(nèi),rank值越高,那么推薦的效果就會(huì)越好。在內(nèi)存和CPU允許的情況下,從5開始,每一次增加5知道推薦的改善率(improvement rate)放緩會(huì)是一個(gè)很好的手段
Lambda:一個(gè)用來防止過度(overfiting)擬合的正規(guī)化參數(shù),由高方差和低偏差值所代表。方差表示通過多次運(yùn)行理論上的正確值和實(shí)際運(yùn)行結(jié)果的波動(dòng)情況。偏差值則表示你所得到的預(yù)測(cè)結(jié)果與真實(shí)結(jié)果之間的差距。過度擬合發(fā)生在模型在訓(xùn)練集上能夠非常好的運(yùn)行但是在實(shí)際的測(cè)試集上卻不能表現(xiàn)良好。lambda值越高,過度擬合的情況就會(huì)越少但是誤差值也會(huì)越大。在測(cè)試過程中0.01,1和10都是很好的選擇
下面的圖標(biāo)展示了方差和誤差之間的關(guān)系。靶心表示的是算法想要預(yù)測(cè)的結(jié)果。
Iteration:訓(xùn)練算法所要運(yùn)行的次數(shù)。在這個(gè)例子中,你將會(huì)運(yùn)行5,10和20次迭代并使用不同的rank和lambda組合
下面的代碼展示了如何在Spark中開始一個(gè)ALS模型訓(xùn)練
from pyspark.mllib.recommendation import ALS model = ALS.train(training, rank = 10, iterations = 5, lambda_=0.01)尋找到合適的模型
使用ALS算法的協(xié)同過濾器基于三個(gè)不同的數(shù)據(jù)集:
訓(xùn)練集:包括已知結(jié)果的數(shù)據(jù)。這個(gè)數(shù)據(jù)集會(huì)獲得最好的結(jié)果。在這篇文章中,它包含的是用戶給出的評(píng)分?jǐn)?shù)據(jù)
驗(yàn)證集:包括的數(shù)據(jù)能夠幫助訓(xùn)練器去選取合適的參數(shù)組合并選擇最好的模型
測(cè)試集:包括被用于評(píng)估訓(xùn)練所得到的最好模型的數(shù)據(jù)。測(cè)試集相當(dāng)于在真實(shí)環(huán)境中使用這個(gè)推薦算法的模擬
為了找到最好的模型,你需要去計(jì)算所基于驗(yàn)證集合模型規(guī)模的均方根誤差(root-mean-square error)。均方根誤差越小,模型也就越好
實(shí)現(xiàn)推薦為了讓用戶能夠簡(jiǎn)單快速地獲取結(jié)果,你需要把結(jié)果裝載進(jìn)可以根據(jù)需求被查詢的數(shù)據(jù)庫。再安利一次,Cloud SQL是一個(gè)非常好的選擇。從Spark 1.4開始,你可以使用PySpark將預(yù)測(cè)結(jié)果直接寫進(jìn)數(shù)據(jù)庫。
Recommendation?表的結(jié)構(gòu)大概像這樣:
CREATE TABLE Recommendation ( userId varchar(255), accoId varchar(255), prediction float, PRIMARY KEY(userId, accoId), FOREIGN KEY (accoId) REFERENCES Accommodation(id) );代碼展示
這一部分將展示訓(xùn)練模型的一些代碼
從Cloud SQL獲取數(shù)據(jù)Spark SQL的上下文能夠讓你輕松地連接到一個(gè)Cloud SQL實(shí)例通過JDBC連接器。數(shù)據(jù)以DataFrame的形式加載
pyspark/app_collaborative.py
jdbcDriver = "com.mysql.jdbc.Driver" jdbcUrl = "jdbc:mysql://%s:3306/%s?user=%s&password=%s" % (CLOUDSQL_INSTANCE_IP, CLOUDSQL_DB_NAME, CLOUDSQL_USER, CLOUDSQL_PWD) dfAccos = sqlContext.load(source="jdbc", driver=jdbcDriver, url=jdbcUrl, dbtable=TABLE_ITEMS) dfRates = sqlContext.load(source="jdbc", driver=jdbcDriver, url=jdbcUrl, dbtable=TABLE_RATINGS)裝換DataFrame格式為RDD格式并創(chuàng)建不同的數(shù)據(jù)集
Spark使用了一種稱為?Resilient?Distributed?Dataset (RDD)的概念,這一概念使得在并行情況下處理元素變得便利.RDDs是創(chuàng)建于持續(xù)存儲(chǔ)的只讀數(shù)據(jù)集,他們能夠在內(nèi)存中被處理,因此他們非常適合迭代處理。
回顧如何獲得最好的預(yù)測(cè)模型,你需要將你的數(shù)據(jù)分為三個(gè)不同的數(shù)據(jù)集。下面的代碼使用了一個(gè)工具函數(shù)幫助你隨機(jī)的將非重復(fù)的數(shù)據(jù)以60%、20%、20%的比例分開
pyspark/app_collaborative.py
rddTraining, rddValidating, rddTesting = dfRates.rdd.randomSplit([6,2,2])
根據(jù)不同的參數(shù)訓(xùn)練模型注意
在創(chuàng)建Rating表的時(shí)候以下面的順序創(chuàng)建是非常重要的:accoId,?userId,?rating.ALS需要根于已經(jīng)定義好的產(chǎn)品-用戶對(duì)來進(jìn)行預(yù)測(cè)。如果你不是這樣創(chuàng)建的,你可以選擇修改你的數(shù)據(jù)庫或者使用RDD上的map方法來更新列的順序
回顧一下,當(dāng)使用ALS方法的時(shí)候,系統(tǒng)需要使用rank、regularization和iteration參數(shù)來找到最合適的模型。由于評(píng)分存在,因此train方法獲得的結(jié)果就必須和驗(yàn)證集進(jìn)行比較。你需要確認(rèn)用戶的口味也一起包含在了訓(xùn)練集之中
pyspark/app_collaborative.py
for cRank, cRegul, cIter in itertools.product(ranks, reguls, iters): model = ALS.train(rddTraining, cRank, cIter, float(cRegul)) dist = howFarAreWe(model, rddValidating, nbValidating) if dist < finalDist: print("Best so far:%f" % dist) finalModel = model finalRank = cRank finalRegul = cRegul finalIter = cIter finalDist = dist
注意
howFarAreWe方法僅使用用戶-產(chǎn)品對(duì)在驗(yàn)證集上使用模型來預(yù)測(cè)評(píng)分
pyspark/app_collaborative.py
def howFarAreWe(model, against, sizeAgainst): # Ignore the rating column againstNoRatings = against.map(lambda x: (int(x[0]), int(x[1])) ) # Keep the rating to compare against againstWiRatings = against.map(lambda x: ((int(x[0]),int(x[1])), int(x[2])) ) # Make a prediction and map it for later comparison # The map has to be ((user,product), rating) not ((product,user), rating) predictions = model.predictAll(againstNoRatings).map(lambda p: ( (p[0],p[1]), p[2]) ) # Returns the pairs (prediction, rating) predictionsAndRatings = predictions.join(againstWiRatings).values() # Returns the variance return sqrt(predictionsAndRatings.map(lambda s: (s[0] - s[1]) ** 2).reduce(add) / float(sizeAgainst))為用戶統(tǒng)計(jì)排名靠前的推薦
現(xiàn)在你已經(jīng)有一個(gè)可以給出充分推薦理由的模型了,你可以使用它來根據(jù)用戶的口味和其他與他口味相同用戶的評(píng)分預(yù)測(cè)這個(gè)用戶最可能感興趣的東西了。在這一步中,你能夠看到之前提到過的舉證映射(matrix- mapping)
pyspark/app_collaborative.py
Build our model with the best found values # Rating, Rank, Iteration, Regulation model = ALS.train(rddTraining, BEST_RANK, BEST_ITERATION, BEST_REGULATION) # Calculate all predictions predictions = model.predictAll(pairsPotential).map(lambda p: (str(p[0]), str(p[1]), float(p[2]))) # Take the top 5 ones topPredictions = predictions.takeOrdered(5, key=lambda x: -x[2]) print(topPredictions) schema = StructType([StructField("userId", StringType(), True), StructField("accoId", StringType(), True), StructField("prediction", FloatType(), True)]) dfToSave = sqlContext.createDataFrame(topPredictions, schema) dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode="overwrite")存儲(chǔ)排名靠前的預(yù)測(cè)結(jié)果
既然你已經(jīng)獲得了所有預(yù)測(cè)值的列表,那么你就可以在Cloud SQl里存儲(chǔ)前十個(gè)結(jié)果了這樣系統(tǒng)就可以為用戶提供一些推薦了。比如,使用這些預(yù)測(cè)結(jié)果的一個(gè)很好的時(shí)間就是當(dāng)用戶登錄進(jìn)網(wǎng)頁的時(shí)候。
pyspark/app_collaborative.py
dfToSave = sqlContext.createDataFrame(topPredictions, schema) dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode="overwrite")運(yùn)行推薦方案
想要運(yùn)行這個(gè)解決方法,你可以一步步按找這個(gè)頁面?GitHub page的介紹操作。通過這些指導(dǎo),你將能夠?yàn)橛脩粲?jì)算和展示推薦信息。
最終的SQL代碼將從數(shù)據(jù)庫中取出排名最高的推薦信息并把它展示在Samantha的歡迎頁面上
查詢語句運(yùn)行在Cloud Platform控制臺(tái)或者M(jìn)ysql的客戶端時(shí),會(huì)返回類似于下圖的結(jié)果
在網(wǎng)頁中,同樣的查詢語句會(huì)強(qiáng)化歡迎頁面并且增加訪問者成為消費(fèi)者的可能性
這看上去與Sam和在上文中描述的系統(tǒng)已知的Sam喜歡的東西十分相似。
教程你可以在?GitHub上獲得包括安裝教程和源代碼在內(nèi)的完整內(nèi)容。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38191.html
摘要:谷歌表示,與搜索并列,是谷歌機(jī)器學(xué)習(xí)技術(shù)最重要的產(chǎn)品服務(wù)載體。谷歌宣布了基于機(jī)器學(xué)習(xí)技術(shù)的全面升級(jí),很可能是其誕生以來的最大升級(jí)。在去年的大會(huì)上,谷歌宣布了其第一代。 showImg(https://segmentfault.com/img/bVNTKT?w=900&h=385); Google I/O Google I/O 是由 Google 舉行的網(wǎng)絡(luò)開發(fā)者年會(huì),討論的焦點(diǎn)是用 G...
摘要:雖然廣受歡迎,但是仍受到來自另外一個(gè)基于的機(jī)器學(xué)習(xí)庫的競(jìng)爭(zhēng)年出現(xiàn)的。還提供更傳統(tǒng)的機(jī)器學(xué)習(xí)功能的庫,包括神經(jīng)網(wǎng)絡(luò)和決策樹系統(tǒng)。和的機(jī)器學(xué)習(xí)庫。顧名思義,是用于神經(jīng)網(wǎng)絡(luò)機(jī)器學(xué)習(xí)的庫,便于將瀏覽器用作數(shù)據(jù)工作臺(tái)。 關(guān)于機(jī)器學(xué)習(xí)的11個(gè)開源工具 翻譯:瘋狂的技術(shù)宅英文標(biāo)題:11 open source tools to make the most of machine learning英文連...
閱讀 1438·2021-09-28 09:44
閱讀 2500·2021-09-28 09:36
閱讀 1143·2021-09-08 09:35
閱讀 1982·2019-08-29 13:50
閱讀 809·2019-08-29 13:29
閱讀 1129·2019-08-29 13:15
閱讀 1723·2019-08-29 13:00
閱讀 2987·2019-08-26 16:16