亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣用Spark學習矩陣分解推薦算法

發布時間:2021-12-17 10:57:42 來源:億速云 閱讀:111 作者:柒染 欄目:大數據

怎樣用Spark學習矩陣分解推薦算法,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

在矩陣分解在協同過濾推薦算法中的應用中,我們對矩陣分解在推薦算法中的應用原理做了總結,這里我們就從實踐的角度來用Spark學習矩陣分解推薦算法。

1. Spark推薦算法概述

在Spark  MLlib中,推薦算法這塊只實現了基于矩陣分解的協同過濾推薦算法。而基于的算法是FunkSVD算法,即將m個用戶和n個物品對應的評分矩陣M分解為兩個低維的矩陣:

怎樣用Spark學習矩陣分解推薦算法

其中k為分解成低維的維數,一般遠比m和n小。如果大家對FunkSVD算法不熟悉,可以復習對應的原理篇。

2. Spark推薦算法類庫介紹

在Spark  MLlib中,實現的FunkSVD算法支持Python,Java,Scala和R的接口。由于前面的實踐篇我們都是基于Python,本文的后面的介紹和使用也會使用MLlib的Python接口。

Spark MLlib推薦算法python對應的接口都在pyspark.mllib.recommendation包中,這個包有三個類,Rating,  MatrixFactorizationModel和ALS。雖然里面有三個類,但是算法只是FunkSVD算法。下面介紹這三個類的用途。

Rating類比較簡單,僅僅只是為了封裝用戶,物品與評分這3個值。也就是說,Rating類里面只有用戶,物品與評分三元組, 并沒有什么函數接口。

ALS負責訓練我們的FunkSVD模型。之所以這兒用交替最小二乘法ALS表示,是因為Spark在FunkSVD的矩陣分解的目標函數優化時,使用的是ALS。ALS函數有兩個函數,一個是train,這個函數直接使用我們的評分矩陣來訓練數據,而另一個函數trainImplicit則稍微復雜一點,它使用隱式反饋數據來訓練模型,和train函數相比,它多了一個指定隱式反饋信心閾值的參數,比如我們可以將評分矩陣轉化為反饋數據矩陣,將對應的評分值根據一定的反饋原則轉化為信心權重值。由于隱式反饋原則一般要根據具體的問題和數據來定,本文后面只討論普通的評分矩陣分解。

MatrixFactorizationModel類是我們用ALS類訓練出來的模型,這個模型可以幫助我們做預測。常用的預測有某一用戶和某一物品對應的評分,某用戶最喜歡的N個物品,某物品可能會被最喜歡的N個用戶,所有用戶各自最喜歡的N物品,以及所有物品被最喜歡的N個用戶。

對于這些類的用法我們再后面會有例子講解。

3. Spark推薦算法重要類參數

這里我們再對ALS訓練模型時的重要參數做一個總結。

1) ratings : 評分矩陣對應的RDD。需要我們輸入。如果是隱式反饋,則是評分矩陣對應的隱式反饋矩陣。

2) rank :  矩陣分解時對應的低維的維數。即PTm×kQk×nPm×kTQk×n中的維度k。這個值會影響矩陣分解的性能,越大則算法運行的時間和占用的內存可能會越多。通常需要進行調參,一般可以取10-200之間的數。

3) iterations  :在矩陣分解用交替最小二乘法求解時,進行迭代的***次數。這個值取決于評分矩陣的維度,以及評分矩陣的系數程度。一般來說,不需要太大,比如5-20次即可。默認值是5。

4) lambda: 在  python接口中使用的是lambda_,原因是lambda是Python的保留字。這個值即為FunkSVD分解時對應的正則化系數。主要用于控制模型的擬合程度,增強模型泛化能力。取值越大,則正則化懲罰越強。大型推薦系統一般需要調參得到合適的值。

5) alpha :  這個參數僅僅在使用隱式反饋trainImplicit時有用。指定了隱式反饋信心閾值,這個值越大則越認為用戶和他沒有評分的物品之間沒有關聯。一般需要調參得到合適值。

從上面的描述可以看出,使用ALS算法還是蠻簡單的,需要注意調參的參數主要的是矩陣分解的維數rank,  正則化超參數lambda。如果是隱式反饋,還需要調參隱式反饋信心閾值alpha 。

4. Spark推薦算法實例

下面我們用一個具體的例子來講述Spark矩陣分解推薦算法的使用。

這里我們使用MovieLens 100K的數據,數據下載鏈接在這。

將數據解壓后,我們只使用其中的u.data文件中的評分數據。這個數據集每行有4列,分別對應用戶ID,物品ID,評分和時間戳。由于我的機器比較破,在下面的例子中,我只使用了前100條數據。因此如果你使用了所有的數據,后面的預測結果會與我的不同。

首先需要要確保你安裝好了Hadoop和Spark(版本不小于1.6),并設置好了環境變量。一般我們都是在ipython notebook(jupyter  notebook)中學習,所以***把基于notebook的Spark環境搭好。當然不搭notebook的Spark環境也沒有關系,只是每次需要在運行前設置環境變量。

如果你沒有搭notebook的Spark環境,則需要先跑下面這段代碼。當然,如果你已經搭好了,則下面這段代碼不用跑了。

怎樣用Spark學習矩陣分解推薦算法

在跑算法之前,建議輸出Spark Context如下,如果可以正常打印內存地址,則說明Spark的運行環境搞定了。

print sc

比如我的輸出是:

首先我們將u.data文件讀入內存,并嘗試輸出***行的數據來檢驗是否成功讀入,注意復制代碼的時候,數據的目錄要用你自己的u.data的目錄。代碼如下:

怎樣用Spark學習矩陣分解推薦算法

輸出如下:

u’196\t242\t3\t881250949′

可以看到數據是用\t分開的,我們需要將每行的字符串劃開,成為數組,并只取前三列,不要時間戳那一列。代碼如下:

怎樣用Spark學習矩陣分解推薦算法

輸出如下:

[u’196′, u’242′, u’3′]

此時雖然我們已經得到了評分矩陣數組對應的RDD,但是這些數據都還是字符串,Spark需要的是若干Rating類對應的數組。因此我們現在將RDD的數據類型做轉化,代碼如下:

怎樣用Spark學習矩陣分解推薦算法

輸出如下:

Rating(user=196, product=242, rating=3.0)

可見我們的數據已經是基于Rating類的RDD了,現在我們終于可以把整理好的數據拿來訓練了,代碼如下,  我們將矩陣分解的維度設置為20,***迭代次數設置為5,而正則化系數設置為0.02。在實際應用中,我們需要通過交叉驗證來選擇合適的矩陣分解維度與正則化系數。這里我們由于是實例,就簡化了。

怎樣用Spark學習矩陣分解推薦算法

將模型訓練完畢后,我們終于可以來做推薦系統的預測了。

首先做一個最簡單的預測,比如預測用戶38對物品20的評分。代碼如下:

print model.predict(38,20)

輸出如下:

0.311633491603

可見評分并不高。

現在我們來預測了用戶38最喜歡的10個物品,代碼如下:

print model.recommendProducts(38,10)

輸出如下:

[ Rating(user=38, product=95, rating=4.995227969811873),  Rating(user=38, product=304, rating=2.5159673379104484),  Rating(user=38, product=1014, rating=2.165428673820349),  Rating(user=38, product=322, rating=1.7002266119079879),  Rating(user=38, product=111, rating=1.2057528774266673),  Rating(user=38, product=196, rating=1.0612630766055788),  Rating(user=38, product=23, rating=1.0590775012913558),  Rating(user=38, product=327, rating=1.0335651317559753),  Rating(user=38, product=98, rating=0.9677333686628911),  Rating(user=38, product=181, rating=0.8536682271006641)]

可以看出用戶38可能喜歡的對應評分從高到低的10個物品。

接著我們來預測下物品20可能最值得推薦的10個用戶,代碼如下:

print model.recommendUsers(20,10)

輸出如下:

[ Rating(user=115, product=20, rating=2.9892138653406635),  Rating(user=25, product=20, rating=1.7558472892444517),  Rating(user=7, product=20, rating=1.523935609195585),  Rating(user=286, product=20, rating=1.3746309116764184),  Rating(user=222, product=20, rating=1.313891405211581),  Rating(user=135, product=20, rating=1.254412853860262),  Rating(user=186, product=20, rating=1.2194811581542384),  Rating(user=72, product=20, rating=1.1651855319930426),  Rating(user=241, product=20, rating=1.0863391992741023),  Rating(user=160, product=20, rating=1.072353288848142)]

現在我們來看看每個用戶最值得推薦的三個物品,代碼如下:

print model.recommendProductsForUsers(3).collect()

由于輸出非常長,這里就不將輸出copy過來了。

而每個物品最值得被推薦的三個用戶,代碼如下:

print model.recommendUsersForProducts(3).collect()

同樣由于輸出非常長,這里就不將輸出copy過來了。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

峨眉山市| 定南县| 股票| 鹤岗市| 阿鲁科尔沁旗| 高青县| 武夷山市| 安新县| 志丹县| 中江县| 商城县| 石家庄市| 边坝县| 偃师市| 曲阳县| 英吉沙县| 章丘市| 当雄县| 灯塔市| 陆河县| 满洲里市| 蒙阴县| 措勤县| 宁河县| 吉安市| 当涂县| 大石桥市| 二连浩特市| 北海市| 东阿县| 海伦市| 长海县| 光泽县| 营口市| 望江县| 基隆市| 延长县| 乌鲁木齐市| 环江| 镇坪县| 南漳县|