協(xié)同過(guò)濾推薦系統(tǒng)可通過(guò)以下步驟用python實(shí)現(xiàn):1. 數(shù)據(jù)準(zhǔn)備:獲取用戶-物品評(píng)分?jǐn)?shù)據(jù),如movielens等;2. 構(gòu)建用戶-物品矩陣,使用pandas的pivot方法轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu);3. 計(jì)算相似度,基于用戶或物品,常用余弦相似度或皮爾遜相關(guān)系數(shù);4. 預(yù)測(cè)評(píng)分并生成推薦,通過(guò)加權(quán)平均相似用戶評(píng)分得出候選列表;5. 注意事項(xiàng)包括冷啟動(dòng)問(wèn)題、評(píng)分標(biāo)準(zhǔn)化、稀疏性優(yōu)化及性能優(yōu)化。每一步均需結(jié)合代碼實(shí)現(xiàn)并根據(jù)實(shí)際場(chǎng)景調(diào)整策略以提升效果。
推薦系統(tǒng)是現(xiàn)在很多平臺(tái)的核心功能之一,比如電商、視頻網(wǎng)站、音樂(lè)平臺(tái)等。python 作為數(shù)據(jù)處理和算法開發(fā)的主力語(yǔ)言,在構(gòu)建推薦系統(tǒng)方面非常合適。協(xié)同過(guò)濾(Collaborative Filtering)是最經(jīng)典的推薦算法之一,實(shí)現(xiàn)起來(lái)也不算太難。
下面我來(lái)一步步說(shuō)說(shuō)怎么用 Python 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的協(xié)同過(guò)濾推薦系統(tǒng)。
1. 數(shù)據(jù)準(zhǔn)備:用戶-物品評(píng)分矩陣
協(xié)同過(guò)濾的基礎(chǔ)是用戶對(duì)物品的評(píng)分?jǐn)?shù)據(jù)。最常見的是“用戶-物品-評(píng)分”的三列結(jié)構(gòu),比如:
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
user_id | item_id | rating --------|---------|------- 1 | A | 5 1 | B | 3 2 | A | 4 ...
你可以使用公開的數(shù)據(jù)集,例如 MovieLens,也可以自己整理類似格式的數(shù)據(jù)。
常見問(wèn)題:評(píng)分缺失太多怎么辦? 答案很簡(jiǎn)單:沒(méi)關(guān)系,協(xié)同過(guò)濾本來(lái)就是用來(lái)處理稀疏矩陣的。
2. 構(gòu)建用戶-物品評(píng)分矩陣
有了原始數(shù)據(jù)之后,第一步是把它轉(zhuǎn)成一個(gè)二維矩陣,行表示用戶,列表示物品,值是評(píng)分。
可以用 Pandas 輕松完成這一步:
import pandas as pd # 假設(shè)你已經(jīng)加載了數(shù)據(jù)到 df,包含 user_id, item_id, rating ratings_matrix = df.pivot(index='user_id', columns='item_id', values='rating')
這時(shí)候你會(huì)得到一個(gè)看起來(lái)像這樣的矩陣:
item_id A B C user_id 1 5.0 3.0 NaN 2 4.0 NaN 2.0 3 NaN 4.0 5.0
3. 計(jì)算相似度:用戶之間 or 物品之間?
協(xié)同過(guò)濾分為兩種:
- 基于用戶的協(xié)同過(guò)濾(User-CF):找和當(dāng)前用戶興趣相近的其他用戶,然后推薦他們喜歡但當(dāng)前用戶沒(méi)看過(guò)的東西。
- 基于物品的協(xié)同過(guò)濾(Item-CF):找和目標(biāo)物品相似的其他物品,推薦給喜歡過(guò)這些相似物品的用戶。
這里以 User-CF 為例,計(jì)算用戶之間的相似度常用方法是皮爾遜相關(guān)系數(shù)或余弦相似度。
from sklearn.metrics.pairwise import cosine_similarity # 填充 NaN 為 0,方便計(jì)算相似度 similarity_matrix = cosine_similarity(ratings_matrix.fillna(0))
這樣你就得到了一個(gè)用戶之間的相似度矩陣。
4. 預(yù)測(cè)評(píng)分并生成推薦
接下來(lái)就是預(yù)測(cè)某個(gè)用戶對(duì)未評(píng)分物品的興趣程度。公式大致如下:
$$ hat{r}_{ui} = bar{r}u + frac{sum{v in N(u)} text{sim}(u,v) cdot (r_{vi} – bar{r}v)}{sum{v in N(u)} |text{sim}(u,v)|} $$
不過(guò)在實(shí)際代碼中可以簡(jiǎn)化處理,比如先找出最相似的幾個(gè)用戶,再根據(jù)他們的評(píng)分加權(quán)平均。
舉個(gè)例子:
# 找出與用戶1最相似的前3個(gè)用戶 similar_users = similarity_df[1].sort_values(ascending=False)[1:4].index # 收集這些用戶評(píng)價(jià)過(guò)的電影,但用戶1沒(méi)有看過(guò)的 candidate_items = ratings_matrix.loc[similar_users].mean(axis=0).sort_values(ascending=False) # 排除用戶1已經(jīng)評(píng)過(guò)分的項(xiàng)目 user_rated = ratings_matrix.loc[1].dropna().index recommendations = candidate_items.drop(user_rated, errors='ignore')
最終 recommendations 就是你想推薦的內(nèi)容。
5. 注意事項(xiàng) & 小技巧
- 冷啟動(dòng)問(wèn)題:新用戶或新物品沒(méi)有評(píng)分,無(wú)法推薦。這是協(xié)同過(guò)濾的硬傷,只能配合其他策略緩解。
- 評(píng)分標(biāo)準(zhǔn)化:有些用戶打分偏高,有些偏低,建議做去中心化處理(比如減去用戶的平均評(píng)分)。
- 稀疏性優(yōu)化:矩陣太大太稀疏時(shí),可以用稀疏矩陣(scipy.sparse)節(jié)省內(nèi)存。
- 性能優(yōu)化:如果用戶/物品太多,直接兩兩比較會(huì)很慢,可以考慮使用近似最近鄰(ANN)加速。
基本上就這些步驟了。協(xié)同過(guò)濾雖然簡(jiǎn)單,但效果不錯(cuò),尤其適合入門推薦系統(tǒng)。如果你能結(jié)合一些內(nèi)容特征或者上下文信息,效果還能更上一層樓。