V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhenzinian
V2EX  ›  数据库

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

  •  
  •   zhenzinian · 2019-12-29 21:18:59 +08:00 · 1591 次点击
    这是一个创建于 1551 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己开发着一款基于 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 函数都不甚清楚

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

    5 条回复    2019-12-30 19:29:37 +08:00
    luckTtian
        1
    luckTtian  
       2019-12-30 09:28:41 +08:00
    不知道你推荐的内容是什么,我曾经玩过 hadoop+hbase+spark,(迫于毕设) hadoop 有协同过滤的包。最简单的协同过滤算法,复杂一点多个算法结合。
    DDDjango
        2
    DDDjango  
       2019-12-30 11:24:17 +08:00
    最简单的,皮尔逊积矩相关系数。基于项目。跑出来的训练集我记得应该是 每个电影最相似的十部电影,然后有新用户进入后,算出新用户历史观看的每部电影相似的程度,再推荐一波。。。毕设的时候做的,忘的差不多了
    MinQ
        3
    MinQ  
       2019-12-30 16:53:19 +08:00
    这得看你是用的 ItemCF 还是 UserCF 了,首先这两个都需要用户对商品的评分表,然后如果是 ItemCF 的话需要建立用户物品倒排表,即每个用户喜欢哪些商品。然后构造同现矩阵(商品*商品矩阵),即表示同时喜欢某两种商品的用户数。然后就可以计算 item 之间的相似度了。最后得出来的是商品之间的相似度矩阵(商品*商品矩阵),当每一个用户进来以后,就可以根据他的已有评分,从相似度矩阵中取出对应的行,来计算用户对其它商品的评分
    MinQ
        4
    MinQ  
       2019-12-30 16:55:20 +08:00
    这些都是离线计算,每天 0 点取前一天数据计算相似度,相似度算完了往 hive 表或者 mysql 里一扔,然后内存里留一份就行了。用户进来以后需要实时评分。
    wuyifar
        5
    wuyifar  
       2019-12-30 19:29:37 +08:00
    根据你的描述你想要的是基于用户的协同过滤做推荐属于离线召回,对于协同过滤不需要再数据库中键额外的表, 你需要通过用户的历史行为,构建一个矩阵 T T 有 N 列, 每一列代表一个 item 有 M 行, 每一行代表一个 user, 矩阵构建好了之后, 可以利用余项相识度等很多数学公式计算,每个用户之间的相似度,并保存。 最后再推荐的时候只需要返回前 N 个相似用户,喜欢的但是该用户没有行为的 item 就好了, 大概是这样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4013 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:15 · PVG 13:15 · LAX 22:15 · JFK 01:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.