推荐引擎很适合如下两类常见场景(两者可兼有):
- 可选项众多:可选的物品越多,用户就越难找到想要的物品。如果用户知道他们想要什么,那搜索能有所帮助。然而最适合的物品往往并不为用户所事先知道。这时,通过向用户推荐相关物品,其中某些可能用户事先不知道,将能帮助他们发现新物品。
- 偏个人喜好:当人们主要根据个人喜好来选择物品时,推荐引擎能利用集体智慧,根据其他有类似喜好用户的信息来帮助他们发现所需物品。
推荐模型一般分为:
- 基于内容的过滤:利用物品的内容或是属性信息以及某些相似度定义,来求出与该物品类似的物品。这些属性值通常是文本内容(比如标题、名称、标签及该物品的其他元数据)。对多媒体来说,可能还涉及从音频或视频中提取的其他属性。
- 协同过滤:协同过滤是一种借助众多智慧的途径。它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度。其内在思想是相似度的定义。(分基于用户、基于物品和基于模型)
- 矩阵分解:Spark推荐模型库当前只包含基于矩阵分解(matrix factorization)的实现,由此我们也将重点关注这类模型。
1. 矩阵分解
1.1. 显式矩阵分解
当要处理的那些数据是由用户所提供的自身的偏好数据,这些数据被称作显式偏好数据。这类数据包括如物品评级、赞、喜欢等用户对物品的评价。这些数据可以转换为以用户为行、物品为列的二维矩阵。矩阵的每一个数据表示某个用户对特定物品的偏好。大部分情况下单个用户只会和少部分物品接触,所以该矩阵只有少部分数据非零(即该矩阵很稀疏)。
对这个矩阵建模,可以采用矩阵分解(或矩阵补全)的方式。具体就是找出两个低维度的矩阵,使得它们的乘积是原始的矩阵。因此这也是一种降维技术。
假设我们的用户和物品数目分别是U和I,那对应的“用户--物品”矩阵的维度为U × I。要找到和“用户物品”矩阵近似的k维(低阶)矩阵,最终要求出如下两个矩阵:一个用于表示用户的U × k维矩阵,以及一个表征物品的I × k维矩阵。这两个矩