永发信息网

itemCF算法如果没有用户评分该怎么计算评分矩阵

答案:2  悬赏:70  手机版
解决时间 2021-01-26 03:24
  • 提问者网友:我的未来我做主
  • 2021-01-25 17:11
itemCF算法如果没有用户评分该怎么计算评分矩阵
最佳答案
  • 五星知识达人网友:鸽屿
  • 2021-01-25 17:57
整理一下自己的理解。对于一个users-products-rating的评分数据集,ALS会建立一个user*product的m*n的矩阵其中,m为users的数量,n为products的数量但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵它是这么做的:假设m*n的评分矩阵R,可以被近似分解成U*(V)TU为m*d的用户特征向量矩阵V为n*d的产品特征向量矩阵((V)T代表V的转置,原谅我不会打转置这个符号。。)d为user/product的特征值的数量关于d这个值的理解,大概可以是这样的对于每个产品,可以从d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4可以认为,每部电影在这4个角度上都有一个固定的基准评分值例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的d=4,有4个特征值,分别是主演,导演,特效,剧情每个特征值的基准评分值分别为(满分为1.0):主演:0.9(大光头还是那么霸气)导演:0.7特效:0.8剧情:0.6矩阵V由n个product*d个特征值组成对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在一定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4)其中a1-4为用户A的特征值,d1-4为之前所说的电影的特征值参考:协同过滤中的矩阵分解算法研究那么对于之前ALS算法的这个假设m*n的评分矩阵R,可以被近似分解成U*(V)T就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵V(转置)的某列相乘得到那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量)采用的是交替的最小二乘法在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)参考:ALS在SparkMLlib中的实现但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量解决的法是交替的最小二乘法首先对于上面的公式,以下面的形式显示:为了防止过度拟合,加上正则化参数为了防止过度拟合,加上正则化参数首先用一个小于1的随机数初始化V首先用一个小于1的随机数初始化V根据公式(4)求U此时就可以得到初始的UV矩阵了,计算上面说过的差平方和根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止取得最新的UV矩阵则原本的稀疏矩阵R就可以用R=U(V)T来表示了以上公式内容截图来自:基于矩阵分解的协同过滤算法总结一下:ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分不知道是不是理解正确了有几个问题想请教一下~(1)在第一个公式中加入正则化参数是啥意思?为什么是那种形态的?(2)固定一个矩阵U,求偏导数之后可以得到求解V的公式,为什么?
全部回答
  • 1楼网友:空山清雨
  • 2021-01-25 19:02
今天跟同事写 cf 需要计算用户之间的两两相似性,用 hadoop 来实现。考虑了以下两种方案: 1) mapper 里面建立 (item, user) 对,reducer 里面将 (item, user) 对按照 item 为 key 生成 (item, user_list),再在 mapper 中生成共享同一个 item 的 (user_1, user_2) 对,然后再统计 (user_1, user_2) 共出现了多少次 …… 2) mapper 里面建立两种元素: (user, tag = 0, item_list, compared_user_list, user_score_list) 和 (user, tag = 1, item_list, compared_user_list, user_score_list)。reducer 的时候把元素按照 tag 放到不同的 set 里面,然后针对 tag = 0 的集合里面的元素,扫描 tag = 1 的集合中的每一个元素,把扫描过的元素加入到 tag = 0 和 tag = 1 的 compared_user_list 里面,同时如果这个元素出现在 tag = 0 的元素的item_list 里面,更新 tag = 0 的元素的 user_score_list 里的值。reducer 结束的条件是如果一个元素的 compared_user_list 等于所有 user 的集合的话:如果 tag = 0 输出,否则放弃。 问题的场景是要处理视频推荐(每日千万级 uip,千万级 vv)。这里的问题是方案 1) 里面会受视频马太效应的影响:有的视频可能会被播放了百万次,导致生成 (user_1, user_2) 的时候计算复杂度过高。2) 的问题在于当用户量太多时空间复杂度太高:每一个用户都要存储其他所有用户的列表 compared_user_list,实际上空间复杂度是 num_of_users^2。 思考后的结论是如果计算的是 item 之间的两两相似性的话,用方案 1) 更为合适,因为这里面倒排出来的 pair 将变为 (user, item) ,而 user 看过的视频数一般不会太多,所以不会有数据倾斜的问题。所以这里引出来的结论是如果用户数量巨大而物品数量较少,或者物品马太效应严重的话,适合用 item-based cf,而如果 item 数量巨大而用户数据较少,或者用户马太效应严重(想不出例子?)的话,适合于用 user-based cf。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯