推荐系统样例:
- 基于对用户兴趣的预测结果,为读者推荐新闻报道、短视频等。(如:今日头条)
- 基于顾客过去的购物或商品搜索历史,为在线商店的顾客推荐他们可能要买的商品。(如:亚马逊)
长尾:实体店的货架空间有限,只能给顾客展示所有存在商品的很小一部分,而在线商店能展示任何可用商品
—— 在线销售商对于传统实体销售商的优势。 同样,也是由于长尾的存在,信息爆炸,人们无法看到所有的东西,推荐系统发挥作用。
推荐系统中,用户(user)对物品(item)的偏好信息通过效用矩阵(utility matrix)表示。信息的获取方式:
- 用户对物品评级:商品评价、电影打分等
- 根据用户的行为推理:观看、阅读、购买、添加购物车等
基于内容(Content-based)的推荐
推荐系统面临的一个问题就是如何在缺乏数据时给出好的推荐,这称为冷启动(cold-start)。
可以将推荐看成搜索,这就可能会使用所需要推荐的物品的属性,可以使用属性作为相似度计算所需的数据,这称为基于内容的推荐。
基于内容的系统集中关注物品的属性。物品之间的相似度通过计算它们的属性之间的相似度来确定,需要为每个物品构造特征。举例如电影的明星、导演、年份、流派等。
基于协同过滤(collaborative filtering)的推荐系统
不是利用专家给出的属性来描述物品来计算相似度,转而利用用户对物品的意见来计算相似度。协同过滤不是关心物品的描述属性,而是按照许多用户的观点来计算相似度。
相似度计算:见距离计算Blog
- 相似度 = 1 / (1 + 欧式距离)
def eulidSim(inA, inB):
return 1.0 / (1.0 + np.linalg.norm(inA - inB))
- 皮尔逊相关系数(Pearson correlation)
def pearsonSim(inA, inB):
if len(inA) < 3:
return 1.0
return 0.5 + 0.5 * np.corrcoef(inA, inB, rowvar=0)[0][1]
- 余弦相似度(cosione similarity)
def cosineSim(inA, inB):
return 0.5 + 0.5 * (float(np.dot(inA, inB)) / (np.linalg.norm(inA) * np.linalg.norm(inB)))
相似性度量的选择:
- 当您的数据受用户偏好/用户的不同评分尺度影响时,请使用皮尔逊相似度(适合矩阵中仅由0和1组成)
- 如果数据稀疏,则使用余弦(许多额定值未定义)
- 如果您的数据不稀疏并且属性值的大小很重要,请使用欧几里得(Euclidean)。
- 建议使用调整后的余弦(Adjusted Cosine Similarity)进行基于商品的方法来调整用户偏好。
- 进行相似度度量时,可以选择对数据进行舍入处理或者评分归一化(即将每个评分减去某个用户的平均评分值)
内存方法(Memory-based)
基于用户的协同过滤
通过用户对物品的偏好来计算用户之间的相似度(与某用户相似的用户所喜欢的项会推荐给该用户)。
基于物品的协同过滤
通过喜欢物品的用户来计算物品之间的相似度。
UserCF和ItemCF比较与选择:
基于物品的相似度计算的时间会随物品数量的增加而增加,基于用户的相似度计算的时间则会随用户数量的增加而增加。如果商品数目比较少,用户的数目很多,可能倾向于基于物品相似度的计算方法(大部分产品导向的推荐引擎)。
模型方法(Model-based)
利用矩阵分解(Matrix factorization)提高推荐的效果
SVD分解
SVD分解会降低程序的速度,SVD分解可以在程序调入时运行一次。在大型系统中,SVD每天运行一次或者其频率更低,并且还要离线运行。
SVD++算法
协同关系矩阵:
- :每个元素 表示 在 上的交互强度
- 此矩阵的大多数元素为未知,推荐算法的目标就是预测这些位置上的强度值(对比:Topic Model)
上式: 为全局偏置, 为u的偏差, 为 的偏差, 为 的描述, 为 的描述。
- 矩阵分解方法,比SVD在处理未知元素上更合理,同时在矩阵稀疏时计算速度快
- 无法直接处理新出现的 和
- 在Netflix电影推荐项目上取得了很好的效果
UV分解
推荐系统的评价
通用的一个指标:均方根误差(Root-Mean-Square Error, RMSE)
《推荐系统实战》
《Machine Learning in Action》 P253 14.1.2
《Mining of Massive Datasets》 9 P227