协同过滤算法(一种内容推荐算法)的表结构一般怎么设计?

2019-12-29 21:18:59 +08:00
 zhenzinian

自己开发着一款基于 UGC 的 APP,后台硬件环境是一台 1C,512M,15G SSD 的 Kvm 小鸡,装上 nginx+php7+MySQL5.5 后勉勉强强内存够用,但是使用时资源不能超,据说因为是特价机型,资源一超就会 suspend

现在还用不上,但可能以后用户多了会需要利用协同过滤算法来给用户做内容推荐。

关于这个算法简单的例子如下: 比如,

用户 1 喜欢 :A C D G T I 用户 2 喜欢 : B G F S 用户 3 喜欢 :A C G T I

那么可以认为用户 3 和用户 1 的喜好类似,所以给用户 3 推荐 D

但自己水平太菜,对这方面完全没有头绪,从表结构的设计,到计算的时机(因为不知道计算量和用户量增大之间的关系,如果计算量大是否可以安排到业务访问闲时来计算?),再到用到哪些 php 函数都不甚清楚

请问下有过经验的大人,有没有最简单的协同过滤方案,在这台小鸡上的最佳实践是?

1612 次点击
所在节点    数据库
5 条回复
luckTtian
2019-12-30 09:28:41 +08:00
不知道你推荐的内容是什么,我曾经玩过 hadoop+hbase+spark,(迫于毕设) hadoop 有协同过滤的包。最简单的协同过滤算法,复杂一点多个算法结合。
DDDjango
2019-12-30 11:24:17 +08:00
最简单的,皮尔逊积矩相关系数。基于项目。跑出来的训练集我记得应该是 每个电影最相似的十部电影,然后有新用户进入后,算出新用户历史观看的每部电影相似的程度,再推荐一波。。。毕设的时候做的,忘的差不多了
MinQ
2019-12-30 16:53:19 +08:00
这得看你是用的 ItemCF 还是 UserCF 了,首先这两个都需要用户对商品的评分表,然后如果是 ItemCF 的话需要建立用户物品倒排表,即每个用户喜欢哪些商品。然后构造同现矩阵(商品*商品矩阵),即表示同时喜欢某两种商品的用户数。然后就可以计算 item 之间的相似度了。最后得出来的是商品之间的相似度矩阵(商品*商品矩阵),当每一个用户进来以后,就可以根据他的已有评分,从相似度矩阵中取出对应的行,来计算用户对其它商品的评分
MinQ
2019-12-30 16:55:20 +08:00
这些都是离线计算,每天 0 点取前一天数据计算相似度,相似度算完了往 hive 表或者 mysql 里一扔,然后内存里留一份就行了。用户进来以后需要实时评分。
wuyifar
2019-12-30 19:29:37 +08:00
根据你的描述你想要的是基于用户的协同过滤做推荐属于离线召回,对于协同过滤不需要再数据库中键额外的表, 你需要通过用户的历史行为,构建一个矩阵 T T 有 N 列, 每一列代表一个 item 有 M 行, 每一行代表一个 user, 矩阵构建好了之后, 可以利用余项相识度等很多数学公式计算,每个用户之间的相似度,并保存。 最后再推荐的时候只需要返回前 N 个相似用户,喜欢的但是该用户没有行为的 item 就好了, 大概是这样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/633380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX