【推荐系统】协同过滤浅入(基于用户/项目/内容/混合方式)
目錄
?
協(xié)同過(guò)濾
基于用戶的過(guò)濾
基于項(xiàng)目的過(guò)濾
基于內(nèi)容的過(guò)濾
混合系統(tǒng)
檢查每種類型的利弊
?
協(xié)同過(guò)濾
在 2012 年初,爆出了這樣一則新聞故事:一位男子進(jìn)入一家Target商店,揮舞著手中的一疊優(yōu)惠券,這些都是Target郵寄給他還在讀高中的女兒的。
他來(lái)的目的是譴責(zé)經(jīng)理,因?yàn)檫@套優(yōu)惠券都是諸如嬰兒服裝、配方奶和幼兒家具這類商品專享的。
聽到顧客的投訴,經(jīng)理再三道歉。他感覺(jué)很糟糕,想在幾天后通過(guò)電話跟進(jìn),解釋這是怎么回事。
這個(gè)時(shí)候,反而是這位父親在電話里進(jìn)行了道歉??磥?lái)他的女兒確實(shí)是懷孕了。
她的購(gòu)物習(xí)慣泄露了她的這個(gè)秘密。
出賣這位女生的算法很可能是,至少部分是,基于協(xié)同過(guò)濾。
什么是協(xié)同過(guò)濾?
協(xié)同過(guò)濾(collaborative filtering)是基于這樣的想法,在某處總有和你趣味相投的人。假設(shè)你和趣味相投的人們?cè)u(píng)價(jià)方式都非常類似,而且你們都已經(jīng)以這種方式評(píng)價(jià)了一組特定的項(xiàng)目,此外,你們每個(gè)人對(duì)其他人尚未評(píng)價(jià)的項(xiàng)目也有過(guò)評(píng)價(jià)。正如已經(jīng)假設(shè)的那樣,你們的口味是類似的,因此可以從趣味相投的人們那里,提取具有很高評(píng)分而你尚未評(píng)價(jià)的項(xiàng)目,作為給你的推薦,反之亦然。在某種程度上,這點(diǎn)和數(shù)字化配對(duì)非常相像,但結(jié)果是你喜歡的歌曲或產(chǎn)品,而不是與異性的約會(huì)。
?
對(duì)于懷孕的高中生這個(gè)案例,當(dāng)她購(gòu)買了無(wú)味的乳液、棉球和維生素補(bǔ)充劑之后,她可能就和那些稍后繼續(xù)購(gòu)買嬰兒床和尿布的人匹配上了。
?
基于用戶的過(guò)濾
我們將從被稱為效用矩陣(utility matrx)的東西開始。它和詞條-文檔矩陣相類似,不過(guò)這里我們表示的是產(chǎn)品和用戶,而不再是詞條和文檔。
這里,我們假設(shè)有顧客 A 到 D,以及他們所評(píng)分的一組產(chǎn)品,評(píng)分從 0 到 5
之前我們看到,當(dāng)想要查找類似的項(xiàng)目時(shí),可以使用余弦相似度。讓我們?cè)谶@里試試。
我們將為用戶 A 發(fā)現(xiàn)最相似的其他顧客。由于這里的向量是稀疏的,包含了許多未評(píng)分的項(xiàng)目,我們將在這些缺失的地方輸入一些默認(rèn)值,這里填入 0。
我們從用戶 A 和用戶 B 的比較開始。
fromsklearn.metrics.pairwise import cosine_similarity cosine_similarity(np.array([4,0,5,3,5,0,0]).reshape(1,-1),\np.array([0,4,0,4,0,5,0]).reshape(1,-1))我們可以看到,這兩者沒(méi)有很高的相似性,這是有道理的,因?yàn)樗麄儧](méi)有多少共同的評(píng)分。
現(xiàn)在來(lái)看看用戶 C 與用戶 A 的比較。
cosine_similarity(np.array([4,0,5,3,5,0,0]).reshape(1,-1),\np.array([2,0,2,0,1,0,0]).reshape(1,-1))我們看到他們有很高的相似度(記住 1 是完美的相似度),盡管他們對(duì)同樣產(chǎn)品的評(píng)價(jià)有所不同。為什么得到了這樣的結(jié)果?
問(wèn)題在于我們對(duì)沒(méi)有評(píng)分的產(chǎn)品,選擇使用0 分。它表示強(qiáng)烈的(負(fù)的)一致性。在這種情況下, 0 不是中性的。
?
如何解決這個(gè)問(wèn)題?
我們可以做的是重新生成每位用戶的評(píng)分,并使得平均分變?yōu)?0 或中性,而不是為缺失值簡(jiǎn)單地使用 0。我們拿出每位用戶的評(píng)分,將其減去該用戶所有打分的平均值。
例如,對(duì)于用戶A,他打分的平均值為 17/4,或 4.25。然后我們從用戶 A 提供的每個(gè)單獨(dú)評(píng)分中減去這個(gè)值。
一旦完成,我們繼續(xù)找到其他用戶的平均值,從他們的每個(gè)評(píng)分中減去該均值,直到對(duì)每位用戶完成該項(xiàng)操作。
讓我們?cè)谛碌臄?shù)據(jù)集上嘗試余弦相似度。再次將用戶 A 和用戶 B、 C 進(jìn)行比較。
A 和 B 之間的比較如下。
cosine_similarity(np.array([-.25,0,.75,-1.25,.75,0,0]).reshape(1,-1),\np.array([0,-.33,0,-.33,0,.66,0]).reshape(1,-1))A 和 C
cosine_similarity(np.array([-.25,0,.75,-1.25,.75,0,0]).reshape(1,-1),\np.array([.33,0,.33,0,-.66,0,0]).reshape(1,-1))我們可以看到, A 和 B 之間的相似度略有增加,而 A 和 C 之間的相似度顯著下降。這正是我們所希望的。
?
這種中心化的過(guò)程除了幫助我們處理缺失值之外,還有其他好處,例如幫助我們處理不同嚴(yán)苛程度的打分者,現(xiàn)在每位打分者的平均分都是 0 了。注意,這個(gè)公式等價(jià)于 Pearson相關(guān)系數(shù),取值落在-1 和 1 之間。
?
讓我們現(xiàn)在采用這個(gè)框架,使用它來(lái)預(yù)測(cè)產(chǎn)品的評(píng)分。我們將示例限制為三位用戶 X、Y 和 Z,我們將預(yù)測(cè) X 尚未評(píng)價(jià), 而和 X 非常相似的 Y 和 Z 已經(jīng)評(píng)過(guò)的產(chǎn)品,對(duì)于 X 而言會(huì)得到多少分。
?
先從每位用戶的基本評(píng)分開始
將中心化這些評(píng)分
?
想知道用戶 X 會(huì)給 Disposos' Diapers 打多少分。我們可以根據(jù)用戶評(píng)分中心化之后的余弦相似度獲得權(quán)重,并通過(guò)這些權(quán)重對(duì)用戶 Y 和用戶 Z 的評(píng)分進(jìn)行加權(quán)計(jì)算。
先得到用戶 Y 和 X 的相似度。
計(jì)算用戶 Z 和 X 的相似度。
user_x = [0,.33,0,-.66,0,33,0] user_z = [0,-.125,0,-.625,0,.375,.375] cosine_similarity(np.array(user_x).reshape(1,-1),\np.array(user_z).reshape(1,-1))現(xiàn)在有一個(gè)用戶 X 和用戶 Y 之間的相似度(0.42447212),以及用戶 A 和用戶 Z 之間的相似度(0.46571861)
整合起來(lái),我們通過(guò)每位用戶與 X 之間的相似度,對(duì)每位用戶的評(píng)分進(jìn)行加權(quán),然后除以總相似度。
(0.42447212 × (4) +0.46571861 × (4.5)) / (0.42447212 +0.46571861) = 4.26
用戶 X 對(duì) Disposos' Diapers 的預(yù)估評(píng)分為 4.26
?
基于項(xiàng)目的過(guò)濾
這種方法遠(yuǎn)優(yōu)于基于用戶的過(guò)濾,它被稱為基于項(xiàng)目的過(guò)濾。這是它的工作原理:每個(gè)被評(píng)分項(xiàng)目與所有其他項(xiàng)目相比較,找到最相似的項(xiàng),而不是根據(jù)評(píng)分歷史將每位用戶和所有其他用戶相匹配。同時(shí),也是使用中心化余弦相似度。
我們有一個(gè)效用矩陣。這一次,我們將看看用戶對(duì)歌曲的評(píng)分。每一列是一位用戶,而每一行是一首歌曲。
想知道 U3 對(duì)于 S5 的評(píng)分。這里,我們會(huì)根據(jù)用戶對(duì)歌曲的評(píng)分來(lái)尋找類似的歌曲,而不是尋找類似的用戶。
從每行歌曲的中心化開始,并計(jì)算其他每首歌曲和目標(biāo)歌曲(即 S5)的余弦相似度。
最右邊的列是其他每行相對(duì)行 S5 的中心化余弦相似度。
需要選擇一個(gè)數(shù)字, k,這是我們?yōu)轭A(yù)測(cè) U3 對(duì)歌曲的評(píng)分,所要使用的最近鄰居數(shù)量。在這個(gè)簡(jiǎn)單的例子中,我們使用 k = 2。
我們可以看到對(duì)于歌曲 S5, S1 和 S3 是和它最相似的,所以我們將使用 U3 對(duì)這兩首歌的評(píng)分(分別為 4 和 5)。
計(jì)算評(píng)分
(0.98 × (4) +0.72 × (5)) / (0.98 +0.72) = 4.42
通過(guò)基于項(xiàng)目的協(xié)同過(guò)濾,我們可以看到 U3 很可能給 S5 打出高分 4.42。
?
基于用戶的過(guò)濾不如基于項(xiàng)目的過(guò)濾有效,這是為什么呢?
很有可能,你的朋友和你有共同的愛好,但是你們每個(gè)人都有自己喜歡,而別人毫無(wú)興趣的領(lǐng)域。
?
?
基于內(nèi)容的過(guò)濾
作為一個(gè)音樂(lè)家, Tim Westergren 花了幾年時(shí)間傾聽其他有天賦的音樂(lè)家的作品,想知道為什么他們永遠(yuǎn)不能拔尖。他們的音樂(lè)很好,和你在電臺(tái)收聽到的那些一樣好。然而,不知何故,他們從來(lái)沒(méi)有大的突破。他想,一定是因?yàn)樗麄兊囊魳?lè)沒(méi)有在足夠的、合適的人們面前展示。
Tim 最終退出了音樂(lè)家的工作,開始從事電影背景音樂(lè)的作曲。在那里,他開始思考每一塊音樂(lè)自己獨(dú)特的結(jié)構(gòu)或 DNA,并可以將其分解為不同的組成部分。思考一番之后,他開始考慮圍繞這個(gè)想法創(chuàng)建一家公司,建立一系列音樂(lè)的基因組。他的一位朋友曾經(jīng)創(chuàng)建并出售了一家公司, Tim 讓他來(lái)運(yùn)作這個(gè)想法。 Tim 的朋友喜歡他的想法,并開始幫助他寫一個(gè)商業(yè)計(jì)劃,并為該項(xiàng)目收集了首輪融資。行動(dòng)開始了。
在接下來(lái)的幾年里,他們雇用了一小群音樂(lè)家,對(duì)上百萬(wàn)首音樂(lè)細(xì)致地編寫了幾乎 400個(gè)不同的特征,每個(gè)特征從 0 到 5 進(jìn)行打分——所有都是通過(guò)手,或者說(shuō)是通過(guò)耳朵進(jìn)行的。每首 3 到 4 分鐘長(zhǎng)的歌曲需要幾乎半小時(shí)的評(píng)級(jí)。
這些特征包括如此的參數(shù):如領(lǐng)唱歌手的聲音有多么的沉重,或節(jié)奏是每分鐘多少拍。
?
他們花費(fèi)了近一年的時(shí)間完成了首個(gè)原型。它完全使用 Excel 中的 VBA 宏構(gòu)建,花了差不多 4 分鐘才返回一次推薦結(jié)果。但是,最后,它成功了,運(yùn)作得非常好。
我們現(xiàn)在知道這家公司就是 Pandora Music,你很可能已經(jīng)聽說(shuō)過(guò)或使用過(guò)其產(chǎn)品,因?yàn)槊刻焖衼?lái)自世界各地?cái)?shù)百萬(wàn)的用戶。毫無(wú)疑問(wèn),它是基于內(nèi)容過(guò)濾的成功范例。
在基于內(nèi)容的過(guò)濾中,不再將每首歌曲視為一個(gè)不可分割的單位,而是將它變成特征向量,然后就可以使用我們的老朋友余弦相似度進(jìn)行比較。
不僅歌曲可以被分解成為特征向量,聽眾也可以被轉(zhuǎn)化為特征向量。聽眾的品味描述成為了空間中的向量,使我們可以測(cè)量他們的品味描述和歌曲本身之間的相似程度。
對(duì)于 Tim Westergren 來(lái)說(shuō),這是神奇的,因?yàn)椴幌衿渌扑]引擎依賴于音樂(lè)的人氣,這個(gè)系統(tǒng)的推薦是基于固有的結(jié)構(gòu)相似性。也許有人從來(lái)沒(méi)有聽過(guò)歌曲 X,但如果他們喜歡歌曲 Y,那么他們應(yīng)該喜歡歌曲 X,因?yàn)檫@兩首歌在基因上是幾乎相同的。這就是基于內(nèi)容的過(guò)濾。
?
混合系統(tǒng)
我們已經(jīng)學(xué)習(xí)了推薦系統(tǒng)的兩種主要形式。但是,需要注意的是,在任何大規(guī)模生產(chǎn)
環(huán)境中,推薦引擎可能同時(shí)利用這兩項(xiàng)技術(shù)。這被稱為混合系統(tǒng),人們喜歡混合系統(tǒng)的原
因是,它有助于消除使用單一系統(tǒng)時(shí)可能存在的缺點(diǎn)。這兩個(gè)系統(tǒng)在一起,創(chuàng)建了更強(qiáng)大
的解決方案。
檢查每種類型的利弊
協(xié)同過(guò)濾的優(yōu)點(diǎn)如下。
?沒(méi)有必要手動(dòng)創(chuàng)建特征。
協(xié)同過(guò)濾的缺點(diǎn)如下。
?如果沒(méi)有大量的項(xiàng)目和用戶,它不能正常工作。
?當(dāng)項(xiàng)目數(shù)量遠(yuǎn)遠(yuǎn)超過(guò)可能被購(gòu)買的數(shù)量時(shí),效用矩陣會(huì)有稀疏性。
基于內(nèi)容的過(guò)濾的優(yōu)點(diǎn)如下。
?它不需要大量的用戶。
基于內(nèi)容的過(guò)濾的缺點(diǎn)如下。
?定義正確的特征可能是一個(gè)挑戰(zhàn)。
?缺乏“意外的驚喜”
?
當(dāng)一家公司缺乏大量的用戶群,基于內(nèi)容的過(guò)濾是更好的選擇,但是隨著公司的增長(zhǎng),加入?yún)f(xié)同過(guò)濾可以幫助我們?yōu)橛脩籼峁└嗟摹绑@喜”。
?
?
摘自《Python機(jī)器學(xué)習(xí)實(shí)踐指南》
?
?
總結(jié)
以上是生活随笔為你收集整理的【推荐系统】协同过滤浅入(基于用户/项目/内容/混合方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言买金鱼问题答案,发现一条品相不错的
- 下一篇: 计算机控制总端,楼宇计算机控制系统(DC