协同过滤 是一种推荐算法,它利用相似用户的偏好和行为来推荐用户可能喜欢的项目(例如电影、音乐、产品等)。它的工作原理是找到不同用户偏好中的模式,并使用这些模式来预测新用户的偏好。这基于一个假设:过去有相似偏好的人在未来也会有相似的偏好。
这个库提供了一种内存中的协同过滤形式,并使用 Jaccard 相似度 来衡量用户偏好之间的相似性。它基于具有相似品味的用户为用户提供项目推荐。
您也可以将此算法应用于单用户用例,其中您的目标是根据过去的行为预测未来的行为。在这种情况下,“用户”可以改为代表不同的用户会话。
这个库很大程度上是从 collaborative-filtering 移植而来的,这是一个由 TSonono 编写的 JavaScript 开源项目。
您需要将输入数据结构化为二维数组。每一行代表一个用户(或用户会话),每一列代表一个项目评分。每个项目评分值可以是 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
)
此算法有很多应用方式。以下是一些创造性的例子
非常大量的项目或用户将导致显著的性能挑战。探索各种策略来减少项目或用户的规模。例如,您可以仅使用最近 X 天的数据。或者您可以仅包含具有一定使用量的用户。
如果您没有足够多的给定用户的数据,算法很难生成好的推荐,特别是当项目数量很大时。
没有通用的策略来处理冷启动。一种可能的解决方案是简单地推荐最受欢迎的项目。您也可以尝试禁用 getRecommendations
函数的一个参数 onlyRecommendFromSimilarTaste
(您需要先使用 createCoMatrix
生成共现矩阵)。如果禁用此标志,该算法可能会产生来自与用户没有相似之处的其他人的推荐。
此库有一个依赖项,LASwift,它提供了各种线性代数便利功能。
如果您想提交错误修复或增强功能,请提交拉取请求。请包含一些背景信息、您的动机,并在适当的时候添加测试。
请参阅 LICENSE。
此库的部分内容取自并修改自 collaborative-filtering,这是一个 MIT 许可的库,版权 (c) 2019 TSonono。代码已修改以用于本项目。