目录
在这篇文章中,我将使用Python实现一些这类推荐系统的简单示例。
给定下面的用户项目评级矩阵M,其中6个用户(行)评级为6个项目(列)。评级可以取1-10的整数值,0表示没有评级。(请注意,我们对Python中使用的行和列使用从零开始的索引。但是,对于用户输入,user_id将占用1-6中的数字和1-6中的item_id)。假设,我们要找出用户3是否喜欢第4项。因此,用户3成为我们的目标用户或活动用户,而项目4是目标项目。
样本用户评级矩阵
基于用户的协同过滤
首先,我们必须预测用户3将给予项目4的评级。在基于用户的CF中,我们将发现说k = 3个与用户3最相似的用户。常用的相似性度量是余弦,Pearson,Euclidean我们将在这里使用余弦相似度,其定义如下:
并且,皮尔森相关性,定义为:
在sklearn中,NearestNeighbors方法可用于基于各种相似性度量来搜索k个最近邻居。
findksimilarusers 函数使用此方法返回活动用户的k近邻的相似性和索引。函数 predict_userbased 使用基于用户的CF方法进一步预测用户3将给予项目4的评级。预测计算为与邻居平均值的偏差的加权平均值,并将其与活动用户的平均评级相加。偏差用于调整用户相关的偏差。出现用户偏差,因为某些用户可能倾向于始终对所有项目给予高或低评级。
其中p(a,i)是针对项目i的目标或活动用户a的预测,w(a,u)是用户a和u之间的相似性,并且K是大多数类似用户的邻域。
基于项目的协同过滤
在该方法中,使用余弦相似性度量来计算项目对之间的相似性。可以通过使用简单加权平均来预测活动用户a的目标项目i的评级:
其中K是由活跃用户a评定的大多数相似项目的邻域,并且w(i,j)是项目i和j之间的相似性。
检查Jupyter Notebook嵌入,函数findksimilaritems 使用NearestNeighbors方法使用余弦相似性来找到类似于项目i的 k项。函数predict_itembased 使用基于项目的CF方法(上面的公式)进一步预测用户3将给予项目4的评级。
调整余弦相似度
对基于项目的CF方法使用余弦相似性度量不考虑用户评级的差异。调整后的余弦相似度通过从每个共同对中减去各自用户的平均评级来抵消这一缺点,并定义如下
为了在Python中实现调整余弦相似度,我定义了一个名为computeAdjCosSim的简单函数,它给出了评级矩阵,返回调整后的余弦相似度矩阵。函数findksimilaritems_adjcos和predict_itembased_adjcos利用调整后的余弦相似度来找到k个相似项并计算预测评级。
功能recommendedItem提示用户选择推荐方法(基于用户(余弦),基于用户(相关),基于项目(余弦),基于项目(调整余弦))。基于所选方法和相似性度量,此功能预测指定用户和项目的评级,并建议是否可以向用户推荐该项目。如果该项目未被用户评级且预测评级大于6,则建议该项目如果评级小于6,则不建议用户使用该项目。
选择相似性度量
选择相似性度量时的一些有用提示是
- 当您的数据受用户偏好/用户的不同评级等级影响时,请使用Pearson
- 如果数据稀疏(许多评级未定义),请使用余弦
- 如果您的数据不稀疏且属性值的大小很重要,请使用欧几里德
- 使用基于项目的方法调整余弦来调整用户偏差
评价推荐系统
评估推荐系统有许多评估指标。然而,最流行和最常用的是RMSE(均方根误差)。函数evaluateRS使用sklearn中的mean_squared_error函数来计算预测评级和实际评级之间的RMSE,并显示所选方法的RMSE值。(为了简化说明,使用了小数据集,因此它没有被分成列车和测试集;在这篇文章中也没有考虑交叉验证)。
在基于用户群的应用程序中,基于用户的方法面临可扩展性问题,因为它们的复杂性随着用户数量呈线性增长。基于项目的方法解决了这些可扩展性问题,以根据项目相似性推荐项目。混合技术利用各种这样的方法,并以多种方式将它们组合以实现更好的性能。
谢谢阅读。这篇文章是为了分享我对推荐系统的理解,并且非常欢迎任何改进这种实现的反馈。