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