【机器学习PAI实战】—— 玩转人工智能之美食推荐
前言
在生活中,我們經常給朋友推薦一些自己喜歡的東西,也時常接受別人的推薦。怎么能保證推薦的電影或者美食就是朋友喜歡的呢?一般來說,你們兩個人經常對同一個電影或者美食感興趣,那么你喜歡的東西就很大程度上朋友也會比較感興趣。在大數據的背景下,算法會幫我尋找興趣相似的那些人,并關注他們喜歡的東西,以此來給我們推薦可能喜歡的事物。
場景描述
某外賣店鋪收集了一些用戶對本店鋪美食的評價和推薦分,并計劃為一些新老客戶推薦他們未曾嘗試的美食。
數據分析
A B C D E F G H I J K 0[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],1[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],2[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],3[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],4[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],5[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],6[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],7[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],8[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],9[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]橫軸為美食品種,分為A--K 11中,豎軸為用戶序號,有0-9 10個人。表內值為某個用戶對某種美食的推薦分,0表示其未曾吃過,5分為最高的推薦分。以上數據為實驗虛構數據。
場景抽象化
給定一個用戶i,我們根據上面的數據為其推薦N個推薦分最高的美食。
模型選擇
協同過濾簡單來說是利用某興趣相投、擁有共同經驗之群體的喜好來推薦用戶感興趣的信息,個人通過合作的機制給予信息相當程度的回應(如評分)并記錄下來以達到過濾的目的進而幫助別人篩選信息,回應不一定局限于特別感興趣的,特別不感興趣信息的紀錄也相當重要。
我們也將采用協同過濾來實現商品推薦,并在下面的章節一步步實現基于協同過濾的商品推薦系統。
數據處理
以上數據,不存在缺失和無意義推薦分,即不超出范圍,格式正確。
搭建環境
- 首先進入noteBook建模,鏈接
- 然后創建新實例
- 之后打開實例
現在基礎環境以及搞定了,我們可以用terminal安裝自己需要的包環境。同時可以選擇python2或者python3的開發環境。而且左側的文件系統,支持本地文件的上傳下載等。
相似度計算
在推薦系統中,我們需要計算兩個人或商品的相似度,我們可以采用余弦相似度,皮爾遜相關系數等。
余弦相似性通過測量兩個向量的夾角的余弦值來度量它們之間的相似性。0度角的余弦值是1,表示完全一樣,而其他任何角度的余弦值都不大于1;并且其最小值是-1,相似度為0。
皮爾遜相關系數( Pearson correlation coefficient),是用于度量兩個變量X和Y之間的相關(線性相關),其值介于-1與1之間。
新建文件recom.py,實現相似度計算函數
def cosSim(inA,inB):num = float(inA.T*inB)denom = la.norm(inA)*la.norm(inB)return 0.5+0.5*(num/denom)推薦分計算
在文件recom.py,實現推薦分計算
#dataMat 用戶與美食的矩陣 #user 用戶序號 #simMeas 相似度算法 #item 美食商品def standEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]#商品數simTotal = 0.0; ratSimTotal = 0.0for j in range(n):#所有商品,遍歷userRating = dataMat[user,j]#user對該商品的推薦分if userRating == 0: continue#如果user 未推薦該商品則過濾#logical_and邏輯與,nonzero非零判斷,overLap為均為商品item,j推薦的用戶overLap = nonzero(logical_and(dataMat[:,item].A>0, \dataMat[:,j].A>0))[0]if len(overLap) == 0: similarity = 0#以此overLap,計算兩商品的相似度。else: similarity = simMeas(dataMat[overLap,item], \dataMat[overLap,j])print('the %d and %d similarity is: %f' % (item, j, similarity))simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: return ratSimTotal/simTotal對于特征向量非常稀疏,或者特征之間關聯關系明顯,協方差較大則需要對原有維度的特征進行降維。這樣既可以節省資源加快運算,也可以避免冗余特征帶來的干擾。
def svdEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0; ratSimTotal = 0.0U,Sigma,VT = la.svd(dataMat) #奇異值分解Sig4 = mat(eye(4)*Sigma[:4]) #構建對角矩陣xformedItems = dataMat.T * U[:,:4] * Sig4.I #數據維度轉換for j in range(n):userRating = dataMat[user,j]if userRating == 0 or j==item: continuesimilarity = simMeas(xformedItems[item,:].T,\xformedItems[j,:].T)print('the %d and %d similarity is: %f' % (item, j, similarity))simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: return ratSimTotal/simTotal通過計算待推薦商品與已推薦商品的相似度,并乘以該用戶對已推薦商品的推薦分,來計算待推薦商品的推薦分。
在文件recom.py,加入recommend函數
#dataMat 用戶與美食的矩陣 #user 用戶序號 #N 推薦前N個商品 #simMeas 相似度計算算法 #estMethod 推薦分計算算法def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):#找出user未評分的商品unratedItems = nonzero(dataMat[user,:].A==0)[1]#find unrated items if len(unratedItems) == 0: return 'you rated everything'itemScores = []#依次計算這些商品的推薦分for item in unratedItems:estimatedScore = estMethod(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))#返回前N個較好分的結果return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]算法演示
如果是本地編輯的文件,可以通過文件上傳方式上傳到服務器。
- 新建noteBook演示
- 加載算法模板
- 數據展示
- 為序號為2的用戶推薦商品
總結
通常在計算相似度之前,我們需要確定是計算基于商品的相似度(上面的方式),還是計算基于用戶的相似度。在現實情況下,我們要根據用戶和商品的數據決定選擇哪種計算方式。同時,在數據量變大時,我們通常需要先降維,在做商品推薦。部分代碼參考《機器學習實戰》,本篇文章主要介紹如何使用PAI-DSW實現算法實驗。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的【机器学习PAI实战】—— 玩转人工智能之美食推荐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud Alibaba
- 下一篇: 通过阿里云K8S Ingress Con