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