許多人把推薦系統(tǒng)視為一種神秘的存在,他們覺(jué)得推薦系統(tǒng)似乎知道我們的想法是什么。Netflix 向我們推薦電影,還有亞馬遜向我們推薦該買(mǎi)什么樣的商品。推薦系統(tǒng)從早期發(fā)展到現(xiàn)在,已經(jīng)得到了很大的改進(jìn)和完善,以不斷地提高用戶(hù)體驗(yàn)。盡管推薦系統(tǒng)中許多都是非常復(fù)雜的系統(tǒng),但其背后的基本思想依然十分簡(jiǎn)單。
推薦系統(tǒng)是什么?
推薦系統(tǒng)是信息過(guò)濾系統(tǒng)的一個(gè)子類(lèi),它根據(jù)用戶(hù)的偏好和行為,來(lái)向用戶(hù)呈現(xiàn)他(或她)可能感興趣的物品。推薦系統(tǒng)會(huì)嘗試去預(yù)測(cè)你對(duì)一個(gè)物品的喜好,以此向你推薦一個(gè)你很有可能會(huì)喜歡的物品。
如何構(gòu)建一個(gè)推薦系統(tǒng)?
現(xiàn)在已經(jīng)有很多種技術(shù)來(lái)建立一個(gè)推薦系統(tǒng)了,我選擇向你們介紹其中最簡(jiǎn)單,也是最常用的三種。他們是:一,協(xié)同過(guò)濾;二,基于內(nèi)容的推薦系統(tǒng);三,基于知識(shí)的推薦系統(tǒng)。我會(huì)解釋前面的每個(gè)系統(tǒng)相關(guān)的弱點(diǎn),潛在的缺陷,以及如何去避免它們。最后,我在文章末尾為你們準(zhǔn)備了一個(gè)推薦系統(tǒng)的完整實(shí)現(xiàn)。
協(xié)同過(guò)濾
協(xié)同過(guò)濾,是首次被用于推薦系統(tǒng)上的技術(shù),至今仍是最簡(jiǎn)單且最有效的。協(xié)同過(guò)濾的過(guò)程分為這三步:一開(kāi)始,收集用戶(hù)信息,然后以此生成矩陣來(lái)計(jì)算用戶(hù)關(guān)聯(lián),最后作出高可信度的推薦。這種技術(shù)分為兩大類(lèi):一種基于用戶(hù),另一種則是基于組成環(huán)境的物品。
基于用戶(hù)的協(xié)同過(guò)濾
基于用戶(hù)的協(xié)同過(guò)濾本質(zhì)上是尋找與我們的目標(biāo)用戶(hù)具有相似品味的用戶(hù)。如果Jean-Pierre和Jason曾對(duì)幾部電影給出了相似的評(píng)分,那么我們認(rèn)為他們就是相似的用戶(hù),接著我們就可以使用Jean Pierre的評(píng)分來(lái)預(yù)測(cè)Jason的未知評(píng)分。例如,如果Jean-Pierre喜歡星球大戰(zhàn)3:絕地武士歸來(lái)和星球大戰(zhàn)5:帝國(guó)反擊戰(zhàn),Jason也喜歡絕地武士歸來(lái),那么帝國(guó)反擊戰(zhàn)對(duì)Jason來(lái)說(shuō)是就是一個(gè)很好的推薦。一般來(lái)說(shuō),你只需要一小部分與Jason相似的用戶(hù)來(lái)預(yù)測(cè)他的評(píng)價(jià)。
在下表中,每行代表一個(gè)用戶(hù),每列代表一部電影,只需簡(jiǎn)單地查找這個(gè)矩陣中行之間的相似度,就可以找到相似的用戶(hù)了。
然而,基于用戶(hù)的協(xié)同過(guò)濾在實(shí)現(xiàn)中存在一些以下問(wèn)題:
用戶(hù)偏好會(huì)隨時(shí)間的推移而改變,推薦系統(tǒng)生成的許多推薦可能會(huì)隨之變得過(guò)時(shí)。
用戶(hù)的數(shù)量越多,生成推薦的時(shí)間就越長(zhǎng)。
基于用戶(hù)會(huì)導(dǎo)致對(duì)托攻擊敏感,這種攻擊方法是指惡意人員通過(guò)繞過(guò)推薦系統(tǒng),使得特定物品的排名高于其他物品。(托攻擊即Shilling Attack,是一種針對(duì)協(xié)同過(guò)濾根據(jù)近鄰偏好產(chǎn)生推薦的特點(diǎn),惡意注入偽造的用戶(hù)模型,推高或打壓目標(biāo)排名,從而達(dá)到改變推薦系統(tǒng)結(jié)果的攻擊方式)
基于物品的協(xié)同過(guò)濾
基于物品的協(xié)同過(guò)濾過(guò)程很簡(jiǎn)單。兩個(gè)物品的相似性基于用戶(hù)給出的評(píng)分來(lái)算出。讓我們回到Jean-Pierre與Jason的例子,他們兩人都喜歡“絕地武士歸來(lái)”和“帝國(guó)反擊戰(zhàn)”。 因此,我們可以推斷,喜歡第一部電影的大多數(shù)用戶(hù)也可能會(huì)喜歡第二部電影。所以,對(duì)于喜歡“絕地武士歸來(lái)”的第三個(gè)人Larry來(lái)說(shuō),”帝國(guó)反擊戰(zhàn)“的推薦將是有意義的。
所以,這里的相似度是根據(jù)列而不是行來(lái)計(jì)算的(與上面的用戶(hù)-電影矩陣中所見(jiàn)的不同)?;谖锲返膮f(xié)同過(guò)濾常常受到青睞,因?yàn)樗鼪](méi)有任何基于用戶(hù)的協(xié)同過(guò)濾的缺點(diǎn)。首先,系統(tǒng)中的物品(在這個(gè)例子中物品就是電影)不會(huì)隨著時(shí)間的推移而改變,所以推薦會(huì)越來(lái)越具有關(guān)聯(lián)性。此外,通常推薦系統(tǒng)中的物品都會(huì)比用戶(hù)少,這減少了推薦的處理時(shí)間。最后,考慮到?jīng)]有用戶(hù)能夠改變系統(tǒng)中的物品,這種系統(tǒng)要更難于被欺騙或攻擊。
基于內(nèi)容的推薦系統(tǒng)
在基于內(nèi)容的推薦系統(tǒng)中,元素的描述性屬性被用來(lái)構(gòu)成推薦?!皟?nèi)容Content”一詞指的就是這些描述。舉個(gè)例子,根據(jù)Sophie的聽(tīng)歌歷史,推薦系統(tǒng)注意到她似乎喜歡鄉(xiāng)村音樂(lè)。因此,系統(tǒng)可以推薦相同或相似類(lèi)型的歌曲。更復(fù)雜的推薦系統(tǒng)能夠發(fā)現(xiàn)多個(gè)屬性之間的關(guān)系,從而產(chǎn)生更高質(zhì)量的推薦。例如,音樂(lè)基因組計(jì)劃(Music Genome Project)根據(jù)450個(gè)不同的屬性將數(shù)據(jù)庫(kù)中的每支歌曲進(jìn)行分類(lèi)。該項(xiàng)目為Pandor的歌曲推薦提供技術(shù)支持。(Pandor提供在線音樂(lè)流媒體服務(wù),類(lèi)似Spolify)
基于知識(shí)的推薦系統(tǒng)
基于知識(shí)的推薦系統(tǒng)在物品購(gòu)買(mǎi)頻率很低的情況下特別適用。例如房屋、汽車(chē)、金融服務(wù)甚至是昂貴的奢侈品。在這種情況下,推薦的過(guò)程中常常缺乏商品的評(píng)價(jià)?;谥R(shí)的推薦系統(tǒng)不使用評(píng)價(jià)來(lái)作出推薦。相反,推薦過(guò)程是基于顧客的需求和商品描述之間的相似度,或是對(duì)特定用戶(hù)的需求使用約束來(lái)進(jìn)行的。這使得這種類(lèi)型的系統(tǒng)是獨(dú)一無(wú)二的,因?yàn)樗试S顧客明確地指定他們想要什么。關(guān)于約束,當(dāng)應(yīng)用時(shí),它們大多是由該領(lǐng)域的專(zhuān)家實(shí)施的,這些專(zhuān)家從一開(kāi)始就知道該如何實(shí)施這些約束。例如,當(dāng)用戶(hù)明確指出在一個(gè)特定的價(jià)格范圍內(nèi)尋找一個(gè)家庭住宅時(shí),系統(tǒng)必須考慮到這個(gè)用戶(hù)規(guī)定的約束。
推薦系統(tǒng)中的冷啟動(dòng)問(wèn)題
推薦系統(tǒng)中的主要問(wèn)題之一是最初可用的評(píng)價(jià)數(shù)量相對(duì)較小。當(dāng)新用戶(hù)還沒(méi)有給電影打分,或者一部新的電影被添加到系統(tǒng)中時(shí),我們?cè)撛趺醋瞿??在這種情況下,應(yīng)用傳統(tǒng)的協(xié)同過(guò)濾模型會(huì)更加困難。盡管基于內(nèi)容和基于知識(shí)的推薦算法在面臨冷啟動(dòng)問(wèn)題時(shí)比協(xié)同過(guò)濾更具有魯棒性,但基于內(nèi)容和基于知識(shí)并不總是可用的。因此,一些新方法,比如混合系統(tǒng),已經(jīng)被設(shè)計(jì)出用來(lái)解決這個(gè)問(wèn)題了。
混合推薦系統(tǒng)
文章到目前為止所介紹的不同類(lèi)型的推薦系統(tǒng)都各有優(yōu)劣,他們根據(jù)不同的數(shù)據(jù)給出推薦。 一些推薦系統(tǒng),如基于知識(shí)的推薦系統(tǒng),在數(shù)據(jù)量有限的冷啟動(dòng)環(huán)境下最為有效。其他系統(tǒng),如協(xié)同過(guò)濾,在有大量數(shù)據(jù)可用時(shí)則更加有效。在多數(shù)情況下,數(shù)據(jù)都是多樣化的,我們可以為同一任務(wù)靈活采用多種方法。 因此,我們可以結(jié)合多種不同技術(shù)的推薦來(lái)提高整個(gè)系統(tǒng)的推薦質(zhì)量。許多的組合性技術(shù)已經(jīng)被探索出來(lái)了,包括:
加權(quán):為推薦系統(tǒng)中的每種算法都賦予不同的權(quán)重,使得推薦偏向某種算法
交叉:將所有的推薦結(jié)果集合在一起展現(xiàn),沒(méi)有偏重
增強(qiáng):一個(gè)系統(tǒng)的推薦將作為下一個(gè)系統(tǒng)的輸入,循環(huán)直至最后一個(gè)系統(tǒng)為止
切換:隨機(jī)選擇一種推薦方法
混合推薦系統(tǒng)中的一個(gè)最有名的例子是于2006至2009年舉行的Netflix Price算法競(jìng)賽。這個(gè)競(jìng)賽的目標(biāo)是將Netflix的電影推薦系統(tǒng)Cinematch的算法準(zhǔn)確率提高至少10%。Bellkor’s Pragmatix Chaos團(tuán)隊(duì)用一種融合了107種不同算法的方案將Cinematch系統(tǒng)的推薦準(zhǔn)確率提高了10.06%,并最終獲得了100萬(wàn)美元獎(jiǎng)金。你可能會(huì)對(duì)這個(gè)例子中的準(zhǔn)確率感到好奇,準(zhǔn)確率其實(shí)就是對(duì)電影的預(yù)測(cè)評(píng)分與實(shí)際評(píng)分接近程度的度量。
推薦系統(tǒng)與AI?
推薦系統(tǒng)常用于人工智能領(lǐng)域。推薦系統(tǒng)的能力 – 洞察力,預(yù)測(cè)事件的能力和突出關(guān)聯(lián)的能力常被用于人工智能中。另一方面,機(jī)器學(xué)習(xí)技術(shù)常被用于實(shí)現(xiàn)推薦系統(tǒng)。例如,在Arcbees,我們使用了神經(jīng)網(wǎng)絡(luò)和來(lái)自IMdB的數(shù)據(jù)成功建立了一個(gè)電影評(píng)分預(yù)測(cè)系統(tǒng)。神經(jīng)網(wǎng)絡(luò)可以快速地執(zhí)行復(fù)雜的任務(wù)并輕松地處理大量數(shù)據(jù)。通過(guò)使用電影列表作為神經(jīng)網(wǎng)絡(luò)的輸入,并將神經(jīng)網(wǎng)絡(luò)的輸出與用戶(hù)評(píng)分進(jìn)行比較,神經(jīng)網(wǎng)絡(luò)可以自我學(xué)習(xí)規(guī)則以預(yù)測(cè)特定用戶(hù)的未來(lái)評(píng)分。
專(zhuān)家建議
在我讀過(guò)許多資料中,我注意到有兩個(gè)很重要的建議經(jīng)常被推薦系統(tǒng)領(lǐng)域內(nèi)的專(zhuān)家提及。第一,基于用戶(hù)付費(fèi)的物品進(jìn)行推薦。當(dāng)一個(gè)用戶(hù)有購(gòu)買(mǎi)意愿時(shí),你就可以斷定他的評(píng)價(jià)一定是更具有相關(guān)性與準(zhǔn)確的。第二,使用多種算法總是比改進(jìn)一種算法要好。Netflix Prize競(jìng)賽就是一個(gè)很好的例子。
實(shí)現(xiàn)一個(gè)基于物品的推薦系統(tǒng)
下面的代碼演示了實(shí)現(xiàn)一個(gè)基于物品的推薦系統(tǒng)是多么的簡(jiǎn)單與快速。所使用的語(yǔ)言是Python,并使用了Pandas與Numpy這兩個(gè)在推薦系統(tǒng)領(lǐng)域中最流行的庫(kù)。所使用的數(shù)據(jù)是電影評(píng)分,數(shù)據(jù)集來(lái)自MovieLens。
第一步:尋找相似的電影
1.讀取數(shù)據(jù)
import pandasaspd
import numpyasnp
ratings_cols=['user_id','movie_id','rating']
ratings=pd.read_csv('u.data',sep='t',names=ratings_cols,usecols=range(3))
movies_cols=['movie_id','title']
movies=pd.read_csv('u.item',sep='|',names=movies_cols,usecols=range(2))
ratings=pd.merge(ratings,movies)
2.構(gòu)造用戶(hù)的電影矩陣
movieRatings = ratings.pivot_table(index=['user_id'],columns=['title'],values='rating')
3.選擇一部電影并生成這部電影與其他所有電影的相似度
starWarsRatings=movieRatings['Star Wars (1977)']
similarMovies=movieRatings.corrwith(starWarsRatings)
similarMovies=similarMovies.dropna()
df=pd.DataFrame(similarMovies)
4.去除不流行的電影以避免生成不合適的推薦
ratingsCount=100
movieStats=ratings.groupby('title').agg({'rating':[np.size,np.mean]})
popularMovies=movieStats['rating']['size']>=ratingsCount
movieStats[popularMovies].sort_values([('rating','mean')],ascending=False)[:15]
5.提取與目標(biāo)電影相類(lèi)似的流行電影
df=movieStats[popularMovies].join(pd.DataFrame(similarMovies,columns=['similarity']))
df.sort_values(['similarity'],ascending=False)[:15]
第二步:基于用戶(hù)的所有評(píng)分做出推薦
1.生成每?jī)刹侩娪爸g的相似度,并只保留流行電影的相似度
userRatings=ratings.pivot_table(index=['user_id'],columns=['title'],values='rating')
corrMatrix=userRatings.corr(method='pearson',min_periods=100)
2.對(duì)于每部用戶(hù)看過(guò)并評(píng)分過(guò)的電影,生成推薦(這里我們選擇用戶(hù)0)
myRatings=userRatings.loc[0].dropna()
simCandidates=pd.Series()
foriinrange(0,len(myRatings.index)):
#取出與評(píng)分過(guò)電影相似的電影
sims=corrMatrix[myRatings.index[i]].dropna()
#以用戶(hù)對(duì)這部電影的評(píng)分高低來(lái)衡量它的相似性
sims=sims.map(lambdax:x *myRatings[i])
#將結(jié)果放入相似性候選列表中
simCandidates=simCandidates.append(sims)
simCandidates.sort_values(inplace=True,ascending=False)
3.將所有相同電影的相似度加和
simCandidates=simCandidates.groupby(simCandidates.index).sum()
simCandidates.sort_values(inplace=True,ascending=False)
4.只保留用戶(hù)沒(méi)有看過(guò)的電影
filteredSims = simCandidates.drop(myRatings.index)
如何更進(jìn)一步?
在上面的實(shí)例中,Pandas與我們的CPU足以處理MovieLens的數(shù)據(jù)集。然而,當(dāng)數(shù)據(jù)集變得更龐大時(shí),處理的時(shí)間也會(huì)變得更加漫長(zhǎng)。因此,你應(yīng)該轉(zhuǎn)為使用具有更強(qiáng)大處理能力的解決方案,如Spark或MapReduce。
-
cpu
+關(guān)注
關(guān)注
68文章
11013瀏覽量
215301 -
AI
+關(guān)注
關(guān)注
87文章
33628瀏覽量
274363 -
推薦系統(tǒng)
+關(guān)注
關(guān)注
1文章
44瀏覽量
10178
原文標(biāo)題:推薦系統(tǒng)概述
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式系統(tǒng)、單片機(jī)及ZigBee之間具體有什么關(guān)系呢
求教:linux系統(tǒng)和WEB服務(wù)器什么關(guān)系?WEB服務(wù)器和網(wǎng)頁(yè)又是什么關(guān)系?
FTW影響系統(tǒng)時(shí)鐘請(qǐng)問(wèn)這兩者之間有什么關(guān)系嗎
快速構(gòu)建并迭代你的第一個(gè)系統(tǒng)
請(qǐng)問(wèn)最小系統(tǒng)板電源供電的各個(gè)電壓間有什么關(guān)系?
請(qǐng)問(wèn)ucosiii系統(tǒng)定義中斷函數(shù)和裸機(jī)中的中斷函數(shù)是什么關(guān)系?
基于Buildroot的Linux系統(tǒng)構(gòu)建技巧經(jīng)驗(yàn)分享
電子電氣架構(gòu)、車(chē)載操作系統(tǒng)、基礎(chǔ)軟件平臺(tái)等之間有什么關(guān)系?
負(fù)反饋PID調(diào)節(jié)系統(tǒng)之電流環(huán)、速度環(huán)和位置環(huán)有什么關(guān)系
微型微控制器與強(qiáng)大的人工智能(AI)世界有什么關(guān)系
人工智能、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)有什么關(guān)系?
MES系統(tǒng)價(jià)格與選型有什么關(guān)系
嵌入式系統(tǒng)ARM和PLC及80C51單片機(jī)的用途和區(qū)別是什么?有什么關(guān)系

如何構(gòu)建一個(gè)基于RFID的考勤系統(tǒng)?

評(píng)論