1.推荐系统
1.1 协同过滤算法
1) 算法简介
协同过滤算法是一种比较常用的推荐算法,它基于对用户历史行为数据进行挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐。它主要包括两种:基于用户的协同过滤和基于物品的协同过滤。具体如下:
- 基于用户的协同过滤(User-based CF):该算法通过用户的历史数据发现用户对商品或内容的喜欢,并对这些喜好进行度量和打分,然后根据不同用户对相同商品或内容的偏好程度计算用户之间的相似度,在有相似偏好的用户之间推荐他们喜欢的商品。所以这个算法主要是寻找偏好相似的用户,构建用户相似度矩阵。我们在一些购物网站上看到的“购买了该商品的用户也喜欢”则是基于该种算法。
- 基于物品的协同过滤(Item-based CF):该算法通过计算不同用户对不同物品的评分获得物品之间的相关度,基于物品间的关系对用户进行相似物品推荐。在这个算法中,我们需要构建物品相关度矩阵。我们看到的“猜你喜欢”则是基于这种算法。
2)相似性计算
相似度的计算需要根据数据的不同选择合适的相似度计算方法。这里只介绍几个常用的计算方法:
- 欧式距离:
![]() |
欧式距离越小,偏好则越近。为了使相似性与数值呈正相关,通常会对求得的欧氏距离取个倒数,使用户键的距离越接近,数值越大。
- 皮尔森相关系数
![]() |
皮尔森系数比欧氏距离的计算要复杂一些,但对于评分数据不规范时皮尔森相关系数能够给出更好的结果。
- 夹角余弦
以二维空间向量与向量
为例,其余弦公式为:
![]() |
- 杰卡德相关系数:该系数其实就是集合的交集除并集
![]() |
3)矩阵分解和隐语义模型
基于物品或基于用户的协同过滤算法是基于近邻模型的。但近邻模型通常面临以下两个问题:
- 计算物品或用户之间的相关性时,其信息量并不随着物品或用户的增加而线性增加。
- 近邻模型计算的用户相似性矩阵及物品相似性矩阵通常存在稀疏问题,计算结果不稳定。
矩阵分解可以解决一下近邻模型无法解决的问题。矩阵分解就是把原来很大的一个矩阵,分解成小矩阵的乘积。而在矩阵的时候不再使用原来的大矩阵,转而使用小矩阵。
SVD算法包含多种矩阵分解算法。该算法把用户和物品映射到一个K维空间中,但这个K维空间我们不能直接拿到,通常将这个K维空间称为隐因子。这个K在工程开始的时候是无法确定的,所以SVD又叫隐语义模型(LFM)。
举个例子,假设用户电影的评分矩阵A是维,即一共有
个用户,
部电影。通过SVD分解技术可以得到三个矩阵
,
和
, 并且
。 其中S是个对角线矩阵,也是个特征值矩阵。如果对于S矩阵,我们只取前k个大的特征值,即可实现降维。具体地,将原来的S矩阵变成
维。U变成
维,V变成
维,而最后得到的A仍然是
维。但是由于降维后的矩阵基本不包含之前缺失比例比较高的向量,因此A矩阵中对应位置的数值就是该行用户对该物品评分的估量值。
2.实验过程
实验采用MovieLens-100K数据,该数据包含了用户对电影的评分信息,用户信息、电影信息和表现信息等。MovieLens-100K数据集包含943个用户对1652部电影的100000个评分。这组数据集可以直接从网上下载。
1)读取数据集并划分训练集和测试集
具体代码如下:
另外需要说明一点,由于推荐系统中存在冷启动问题,即很难为那些尚未观看过一定数量电影的用户提供个性化服务。但这个数据中的每个用户观看过的电影数都在5部以上,所以这里无须删除用户。具体验证代码如下:
2)基于隐语义构建评价矩阵
3)评价指标
这里使用Top-N accuracy metrics(Top-N推荐的准确性指标),用来评价给用户推荐的电影的准确性。其评估过程如下:
|
召回率(Recall)计算公式如下:
![]() |
其中,分母为测试集中实际交互过的物品数量。为针对每个用户在测试集中观看过的电影所形成的Top-N推荐。本次的TOP-N选择10。具体代码如下:
最后的召回率计算如下:
最后:
- topN的计算方式会影响最后的召回率计算
- 在对数据进行SVD分解之前还可以对先对Rating字段进行log平滑。具体代码如下: