协同过滤

协同过滤 是一种推荐算法,它利用相似用户的偏好和行为来推荐用户可能喜欢的项目(例如电影、音乐、产品等)。它的工作原理是找到不同用户偏好中的模式,并使用这些模式来预测新用户的偏好。这基于一个假设:过去有相似偏好的人在未来也会有相似的偏好。

这个库提供了一种内存中的协同过滤形式,并使用 Jaccard 相似度 来衡量用户偏好之间的相似性。它基于具有相似品味的用户为用户提供项目推荐。

您也可以将此算法应用于单用户用例,其中您的目标是根据过去的行为预测未来的行为。在这种情况下,“用户”可以改为代表不同的用户会话。

这个库很大程度上是从 collaborative-filtering 移植而来的,这是一个由 TSonono 编写的 JavaScript 开源项目。

用法

  1. 准备输入数据(“评分”)。

您需要将输入数据结构化为二维数组。每一行代表一个用户(或用户会话),每一列代表一个项目评分。每个项目评分值可以是 0 或 1。1 代表正面评分,例如“喜欢”、评分、购买或某种类型的功能互动。0 表示空值或未使用。

     I0 I1 I2 . . .
    [
U0  [1  1  1  .  .  .],
U1  [1  0  1  .  .  .],
U2  [1  0  0  .  .  .],
.   [.  .  .  .  .  .],
.   [.  .  .  .  .  .],
.   [.  .  .  .  .  .],
    ]

此库中的算法在内存中运行,其运行时复杂度约为 O(U(I^2)),其中 U 是用户数量,I 是项目数量。因此,它最适合于规模相对较小的用例。

当前用户必须包含在这个二维数组中。在准备此数据时,您需要记住哪一行代表当前用户,以及每个列索引代表什么。

let recommendedItemIndices = try CollaborativeFiltering.collaborativeFilter(
    ratings: ratings,
    userIndex: userIndex
)
  1. 将结果索引数组映射回要推荐的项目。

示例用例

此算法有很多应用方式。以下是一些创造性的例子

  1. 实现类似于 iOS 上的“Siri 建议”的功能,根据最近选择的项目推荐项目。
  2. 对于社交电影跟踪应用,根据用户喜欢的内容与他们的朋友喜欢的内容来推荐电影。
  3. 对于即时通讯应用,根据其他群组对话推荐要添加到群组对话中的人。
  4. 对于音乐播放应用,根据用户选择的最近几首歌曲自动选择接下来播放的歌曲。在这种情况下,“用户”将代表之前的收听会话。由此产生的推荐可以尝试预测用户接下来会手动搜索哪些歌曲。

挑战

稀疏数据

非常大量的项目或用户将导致显著的性能挑战。探索各种策略来减少项目或用户的规模。例如,您可以仅使用最近 X 天的数据。或者您可以仅包含具有一定使用量的用户。

冷启动

如果您没有足够多的给定用户的数据,算法很难生成好的推荐,特别是当项目数量很大时。

没有通用的策略来处理冷启动。一种可能的解决方案是简单地推荐最受欢迎的项目。您也可以尝试禁用 getRecommendations 函数的一个参数 onlyRecommendFromSimilarTaste(您需要先使用 createCoMatrix 生成共现矩阵)。如果禁用此标志,该算法可能会产生来自与用户没有相似之处的其他人的推荐。

依赖项

此库有一个依赖项,LASwift,它提供了各种线性代数便利功能。

贡献

如果您想提交错误修复或增强功能,请提交拉取请求。请包含一些背景信息、您的动机,并在适当的时候添加测试。

许可证

请参阅 LICENSE

此库的部分内容取自并修改自 collaborative-filtering,这是一个 MIT 许可的库,版权 (c) 2019 TSonono。代码已修改以用于本项目。