一、推荐系统简介
推荐系统主要基于对用户历史的行为数据分析处理,寻找得到用户可能感兴趣的内容,从而实现主动向用户推荐其可能感兴趣的内容;
从物品的长尾理论来看,推荐系统通过发掘用户的行为,找到用户的个性化需求,从而将长尾商品准确地推荐给需要它的用户,帮助用户发现那些他们感兴趣但很难发现的商品。
推荐系统使用的是基于邻域的算法,一类是基于用户的协同过滤算法,另一类是基于物品的协同过滤算法;
二、数据集准备
我们采用GroupLens提供的MovieLens数据集
These files contain 1,000,209 anonymous ratings of approximately 3,900 movies made by 6,040 MovieLens users who joined MovieLens in 2000.使用一下code加载评分文件ml-1m/ratings.dat
def get_ratings(): ratings = pd.read_csv('ml-1m/ratings.dat', sep='::', names=['UserID', 'MovieID', 'Rating', 'Timestamp'], nrows=100000 ) return ratings我们可以查看前五行的数据情况
rating = get_ratings() print(rating.head()) UserID MovieID Rating Timestamp 0 1 1193 5 978300760 1 1 661 3 978302109 2 1 914 3 978301968 3 1 3408 4 978300275 4 1 2355 5 978824291了解一下用户感兴趣的电影数量
rating = get_ratings() plt.hist(rating['UserID'], bins=100, edgecolor='black') plt.show()三、基于用户的协同过滤算法
基于用户的协同过滤算法是推荐系统中最古老的算法,该算法首先需要找到跟当前用户兴趣相似的用户,然后将找到的用户感兴趣却不在当前用户兴趣列表的物品推荐给当前用户;
基于用户的协同过滤算法主要分为两步
找到和当前用户兴趣相似的用户集合;
该算法基于用户对物品的历史的正反馈行为计算用户兴趣相似度;我们给定用户u、v,令N(u)表示用户u曾经有过正反馈的物品集合,N(v)表示用户v曾经有过正反馈的物品集合;我们可以通过余弦相似度来计算用户u和v的相似度:
w_{uv} = \frac{N(u) \cap N(v)}{\sqrt {N(u) \cup N(v)}}例如用户U对a、b、c有过正反馈记录,用户V对a、c有过正反馈记录;
U a b c V a c我们利用余弦相似度可以计算U和V的兴趣相似度
\[w_{UV}=\frac{|\{a,b,c\} \cap \{a,c\}|}{\sqrt {|\{a,b,c\}| |\{a,c\}|}} = \frac{2}{\sqrt{6}} \]