0


利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)

系列文章目录

  1. 初识推荐系统——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一)
  2. 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)
  3. 项目主要效果展示——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(三)
  4. ……

项目资源下载

  1. 电影推荐系统网站项目源码Github地址(可Fork可Clone)
  2. 电影推荐系统网站项目源码Gitee地址(可Fork可Clone)
  3. 电影推荐系统网站项目源码压缩包下载(直接使用)
  4. 电影推荐系统网站项目源码所需全部工具合集打包下载(spark、kafka、flume、tomcat、azkaban、elasticsearch、zookeeper)
  5. 电影推荐系统网站项目源数据(可直接使用)
  6. 电影推荐系统网站项目个人原创论文
  7. 电影推荐系统网站项目前端代码
  8. 电影推荐系统网站项目前端css代码

文章目录


前言

今天将为大家带来系列博客的第二篇博文,也就是关于如何利用用户行为数据,以便于我们得到更好的推荐结果。今天的内容有些难度,并且文章内容比较多,希望大家沉下心来,因为这里的理论知识直接关系到后面的实践操作,我会一个字一个字的把这篇博文完成,估计一次写不完,所以时间可能需要长一些,我会尽自己最大的可能让内容看起来通俗易懂,下面就开始今天的学习吧!


一、用户行为数据简介

既然要做个性化推荐系统,首先我们需要先了解每个人,听其言、观其行,在网络世界我们称之为用户行为数据

  • 有些用户不是太清楚自己喜欢什么

  • 用户的兴趣不可能是一成不变的,会根据外部因素进行改变

    我们需要通过不断采集用户在网络中的行为数据以及用户与网站的交互反馈数据,不断修正推荐系统对用户的定位,从而不断修正符合用户当前状态的的推荐结果
    协同过滤是目前比较热门的推荐系统算法,协同:用户与用户之间、用户和网站之间等进行不断地互动,慢慢过滤掉自己不感兴趣的物品,从而满足自己的需求
    用户行为数据在网站上最简单的存在形式就是日志。网站在运行过程中会产生大量的原始日志

    1. R
    2. A
    3. W
    4. L
    5. O
    6. G
    7. RAW LOG

    RAWLOG,将其存储在文件系统中,企业会将多种原始日志按照用户行为汇总成会话日志

    1. S
    2. E
    3. S
    4. S
    5. I
    6. O
    7. N
    8. L
    9. O
    10. G
    11. SESSION LOG

    SESSIONLOG,每一个会话日志表示用户的一种反馈。
    用户反馈主要分为显性反馈行为和隐形反馈行为。显性反馈行为包括用户明确表示对物品喜好的行为。比如评分系统;隐形反馈行为是指那些不能够明确反应用户喜好的行为。比如用户浏览页面的行为日志,我们对表示用户喜欢的反馈叫正反馈,表示不喜欢的叫负反馈,下表为显性反馈数据和隐形反馈数据的比较:

显性反馈数据隐形反馈数据用户兴趣明确不明确数量较少庞大存储数据库分布式文件系统实时读取实时有延迟正负反馈都有只有正反馈
下表为各代表网站中显性反馈数据和隐形反馈的例子:
显性反馈隐形反馈视频网站用户对视频的评分用户观看视频的日志、浏览视频页面的日志电子商务网站用户对商品的评分购买日志、浏览日志门户网站用户对新闻的评分浏览新闻的日志音乐网站用户对音乐/歌手/专辑的评分听歌的日志
那么用户的行为表示成什么呢?一些比较中立的字段(用户行为的统一表示)如下:
表示用户行为①user id产生行为的用户的唯一标识②item id产生行为的对象的唯一标识③behavior type行为的种类(比如是购买还是浏览)④context产生行为的上下文,包括时间和地点等⑤behavior weight行为的权重(如果是观看视频的行为,那么这个权重可以是观看时长;如果是打分行为,这个权重可以是分数)⑥behavior content行为的内容(如果是评论行为,那么就是评论的文本,如果是打标签的行为,就是标签)
当然,可以根据自己的实际情况去设计日志的表示形式
有代表性的数据集会是如下4种:

  • 无上下文信息的隐性反馈数据集,每一条行为记录仅仅包含用户ID和物品ID
  • 无上下文信息的显性反馈数据集,每一条记录包含用户ID、物品ID和用户对物品的评分
  • 有上下文信息的隐性反馈数据集,每一条记录包含用户ID、物品ID和用户对物品产生行为的时间戳
  • 有上下文信息的显性反馈数据集,每一条记录包含用户ID、物品ID和用户对物品的评分和评分发生的时间戳

二、用户行为分析

2.1 用户活跃度和物品流行度的分布

二八定律:19世纪末20世纪初意大利经济学家帕累托发明“二八定律”,认为在任何一组东西中,最重要的只占其中一小部分,约

  1. 20
  2. %
  3. 20\%
  4. 20%,其余
  5. 80
  6. %
  7. 80\%
  8. 80%的尽管是多数,却是次要的。很多商家企业认为
  9. 80
  10. %
  11. 80\%
  12. 80%的公司利润来自
  13. 20
  14. %
  15. 20\%
  16. 20%的重要客户,其余
  17. 20
  18. %
  19. 20\%
  20. 20%的利润则来自
  21. 80
  22. %
  23. 80\%
  24. 80%的普通客户,传统零售情愿把
  25. 80
  26. %
  27. 80\%
  28. 80%的资源花在能创造出关键利润的
  29. 20
  30. %
  31. 20\%
  32. 20%方面,从把
  33. 20
  34. %
  35. 20\%
  36. 20%的资源花费在
  37. 80
  38. %
  39. 80\%
  40. 80%的普通客户群里

长尾理论:流行的,被人熟知的东西都是所谓的“头”,而常常被人忽视的,不流行的,个性化就是所谓的“尾”,而在营销界对“尾巴”的挖掘,可以创造出惊人的利润和价值,“小利润大市场”。“虽然赚很少的钱,但是我们要赚很多人的钱”,这就是长尾理论在营销界的真正含义。用户活跃度和物品流行度都符合长尾理论,下图为物品流行度的长尾分布
在这里插入图片描述
上图展示了Delicious和CiteULike数据集中物品流行度的分布曲线。横坐标是物品的流行度

  1. K
  2. K
  3. K,纵坐标是流行度为
  4. K
  5. K
  6. K的物品的总数。这里,物品的流行度指物品产生过行为的用户总数。但是,这个又揭示了什么?

流行的物品总是少数,不流行的占绝大多数,如果能让不流行的物品流行起来,那么会创造很大利润,下图为用户活跃度的长尾分布
在这里插入图片描述
上图展示了Delicious和CiteULike数据集中用户活跃度的分布曲线。横坐标是用户的活跃度

  1. K
  2. K
  3. K,纵坐标是活跃度为
  4. K
  5. K
  6. K的用户总数。这里,用户的活跃度为用户产生过行为的物品总数。但是,这个又揭示了什么?

非常活跃的用户总是少数,大多数用户都是不活跃的,如果能把不活跃的用户都调用起来,那么会创造很大的利润。那么推荐引擎又是做什么的呢?通过个性化的推荐,将不流行的物品推送给不活跃的人,激活这两部分,要比将流行的物品推送给活跃的人的市场大很多,这就是互联网思维

2.2 用户活跃度和物品流行度的关系

一般来说,不活跃的用户要么是新用户,要么是只来过网站一两次的老用户。那么,不同活跃度的用户喜欢的物品的流行度是否有差别?一般认为,新用户倾向于浏览热门的物品,因为他们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。下图展示了

  1. M
  2. o
  3. v
  4. i
  5. e
  6. L
  7. e
  8. n
  9. s
  10. MovieLens
  11. MovieLens数据集中用户活跃度和物品流行度之间的关系,其中横坐标是用户活跃度,纵坐标是具有某个活跃度的所有用户评过分的物品的平均流行度。如图所示,图中曲线呈明显下降的趋势,这表明用户越活跃,越倾向于浏览冷门的物品。

在这里插入图片描述
基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对于实现协同过滤有很多方法,比如基于领域的方法(

  1. n
  2. e
  3. i
  4. g
  5. h
  6. b
  7. o
  8. r
  9. h
  10. o
  11. o
  12. d
  13. b
  14. a
  15. s
  16. e
  17. d
  18. neighborhood-based
  19. neighborhoodbased)、隐语义模型(
  20. l
  21. a
  22. t
  23. e
  24. n
  25. t
  26. f
  27. a
  28. c
  29. t
  30. o
  31. r
  32. m
  33. o
  34. d
  35. e
  36. l
  37. latent factor model
  38. latentfactormodel)、基于图的随机游走算法(
  39. r
  40. a
  41. n
  42. d
  43. o
  44. m
  45. w
  46. a
  47. l
  48. k
  49. o
  50. n
  51. g
  52. r
  53. a
  54. p
  55. h
  56. random walk on graph
  57. randomwalkongraph)等。目前使用最广泛的是基于领域的方法,主要包括下面两个算法:
  • 基于用户的协同过滤算法,这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品
  • 基于物品的协同过滤算法,这种算法给用户推荐和他之前喜欢的物品相似的物品

三、精确率和召回率

考虑一个二分问题,即将实例分成正类(

  1. p
  2. o
  3. s
  4. i
  5. t
  6. i
  7. v
  8. e
  9. positive
  10. positive)或负类(
  11. n
  12. e
  13. g
  14. a
  15. t
  16. i
  17. v
  18. e
  19. negative
  20. negative)。对于一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被预测成正类,即为真正类(
  21. T
  22. r
  23. u
  24. e
  25. p
  26. o
  27. s
  28. i
  29. t
  30. i
  31. v
  32. e
  33. True \quad positive
  34. Truepositive),如果实例是负类被预测成正类,称之为假正类(
  35. F
  36. a
  37. l
  38. s
  39. e
  40. p
  41. o
  42. s
  43. i
  44. t
  45. i
  46. v
  47. e
  48. False \quad positive
  49. Falsepositive)。相应的,如果实例是负类被预测成负类,称之为真负类(
  50. T
  51. r
  52. u
  53. e
  54. n
  55. e
  56. g
  57. a
  58. t
  59. i
  60. v
  61. e
  62. True \quad negative
  63. Truenegative),正类被预测成负类则为假负类(
  64. F
  65. a
  66. l
  67. s
  68. e
  69. n
  70. e
  71. g
  72. a
  73. t
  74. i
  75. v
  76. e
  77. False \quad negative
  78. Falsenegative
    1. T P TP TP:正确肯定的数目
    1. F N FN FN:漏报、没有正确找到匹配的数目
    1. F P FP FP:误报、给出的匹配是不正确的
    1. T N TN TN:正确拒绝的非匹配对数
    列联表如下表所示,1代表正类,0代表负类:

预测1预测0实际1True Positive(TP)False Negative(FN)实际0False Positive(FP)True Negative(TN)
在这里插入图片描述
精确率(正确率)召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。其中精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率
一般来说,

  1. P
  2. r
  3. e
  4. c
  5. i
  6. s
  7. i
  8. o
  9. n
  10. Precision
  11. Precision就是检索出来的条目(比如:文档、网页等)有多少是准确的,
  12. R
  13. e
  14. c
  15. a
  16. l
  17. l
  18. Recall
  19. Recall就是所有准确的条目有多少被检索出来了,两者的定义分别如下:
    1. P r e c i s i o n Precision Precision = 提取出的正确信息条数 / 提取出的信息条数
    1. R e c a l l Recall Recall = 提取出的正确信息条数 / 样本中的信息条数![在这里插入图片描述](https://img-blog.csdnimg.cn/bd351ffe49494a89be4d76249aaa69ff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASXJvbm1hbkpheQ==,size_20,color_FFFFFF,t_70,g_se,x_16)

    为了能够评价不同算法的优劣,在

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. Precision

    Precision和

    1. R
    2. e
    3. c
    4. a
    5. l
    6. l
    7. Recall

    Recall的基础上提出了

    1. F
    2. 1
    3. F1

    F1值得概念,来对

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. Precision

    Precision和

    1. R
    2. e
    3. c
    4. a
    5. l
    6. l
    7. Recall

    Recall进行整体评价。

    1. F
    2. 1
    3. F1

    F1的定义如下:

    1. F 1 F1 F1 = 正确率 * 召回率 * 2 / (正确率 + 召回率)

    不妨举这样一个例子:某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为目的。撒一大网,逮着700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:

  • 正确率 = 700 / (700 + 200 + 100) = 70%

  • 召回率 = 700 / 1400 = 50%

    1. F 1 F1 F1 = 70% * 50% * 2 / (70% + 50%) = 58.3%

    不妨看看如果把池子里所有的鲤鱼、虾和鳖都一网打尽,这些指标又有何变化:

  • 正确率 = 1400 / (1400 + 300 + 300) = 70%

  • 召回率 = 1400 / 1400 = 100%

    1. F 1 F1 F1 = 70% * 100% * 2 / (70% + 100%) = 82.35%

    由此可见,正确率是评估捕获的成果中目标成果所占的比例;召回率,顾名思义,就是从关注领域中,召回目标类别的比例;而

    1. F
    2. F

    F值,则是综合这二者指标的评估指标,用于综合反应整体的指标
    当然希望检索结果

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. Precision

    Precision越高越好,同时

    1. R
    2. e
    3. c
    4. a
    5. l
    6. l
    7. Recall

    Recall也越高越好,但事实上这两者在某些情况下有矛盾的。比如在极端情况下,我们只搜索出了一个结果,且是准确的,那么

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. Precision

    Precision就是

    1. 100
    2. %
    3. 100\%

    100%,但是

    1. R
    2. e
    3. c
    4. a
    5. l
    6. l
    7. Recall

    Recall就很低;而如果我们把所有结果都返回,那么比如

    1. R
    2. e
    3. c
    4. a
    5. l
    6. l
    7. Recall

    Recall是

    1. 100
    2. %
    3. 100\%

    100%,但是

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. Precision

    Precision就会很低。因此在不同的场合需要自己判断希望

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. Precision

    Precision比较高还是

    1. R
    2. e
    3. c
    4. a
    5. l
    6. l
    7. Recall

    Recall比较高。如果是做实验研究,可以绘制

    1. P
    2. r
    3. e
    4. c
    5. i
    6. s
    7. i
    8. o
    9. n
    10. R
    11. e
    12. c
    13. a
    14. l
    15. l
    16. Precision-Recall

    Precision−Recall曲线来帮助分析

四、基于内容的推荐算法

基于内容的推荐算法,原理是用户喜欢和自己关注过的

  1. I
  2. t
  3. e
  4. m
  5. Item
  6. Item在内容上类似的
  7. I
  8. t
  9. e
  10. m
  11. Item
  12. Item,如比你看了哈利波特
  13. Ⅰ,基于内容的推荐算法发现哈利波特
  14. Ⅱ-Ⅶ
  15. Ⅱ−Ⅶ,与你以前观看的在内容上面(共有很多关键词)有很大的关联性,就把后者推荐给你,本项目中采用
  16. E
  17. l
  18. a
  19. s
  20. t
  21. i
  22. c
  23. S
  24. e
  25. a
  26. r
  27. c
  28. h
  29. ElasticSearch
  30. ElasticSearch来实现多个电影之间的相似度计算

五、基于模型的推荐算法

该类型的推荐算法是通过预先设定的计算模型来实现推荐,常常用于实时推荐,相比其他离线推荐算法可以缩短推荐实现,本项目中实时推荐算法通过根据具体业务构建了相应的推荐模型来实现推荐

六、协同过滤推荐算法

6.1 协同过滤算法思想

比如你想看一个电影,但是不知道具体看哪一部,你会怎么做?有两种方法,一种是问问周围兴趣相同的朋友,看看他们最近有什么好的电影推荐。另外一种是看看电影的相似程度,比如都喜欢看科幻片,那就会找电影名带有科幻、科技之类的电影
协同过滤算法就是基于上面的思想,主要包含基于用户的协同过滤推荐算法以及基于物品的协同过滤推荐算法
实现协同过滤,一般需要几个步骤:

  1. 收集用户偏好
  2. 找到相似的用户或者物品
  3. 计算推荐

6.2 推荐数据准备

要进行推荐我们需要的数据如下:用户ID、物品ID、偏好值
偏好值就是用户对物品的喜爱程度,推荐系统所能做的事就是根据这些数据为用户推荐他还没有见过的物品,并且猜测这个物品用户喜欢的概论比较大
用户ID和物品ID一般通过系统的业务数据库就可以获得,偏好值的采集一般会有很多方法,比如评分、投票、转发、保存书签、页面停留时间等等,然后系统根据用户的这些行为流水,采取减噪、归一化、加权等方法综合给出偏好值。一般不同的业务系统给出偏好值的计算方法不一样

6.3 相似性度量

基于用户的推荐和基于物品的推荐都需要找相似,即需要找相似用户以及相似物品。比如一个男生和一个女生是朋友,不能将该女生穿的衣服推荐给男生。要找相似。那么衡量的指标有那些?比如皮尔逊相关系数、欧氏距离、同现相似度、

  1. C
  2. o
  3. s
  4. i
  5. n
  6. e
  7. Cosine
  8. Cosine相似度、
  9. T
  10. a
  11. n
  12. i
  13. m
  14. o
  15. t
  16. o
  17. Tanimoto
  18. Tanimoto系数等

6.3.1 皮尔逊相关系数

皮尔逊相关系数是介于1到-1之间的数,它衡量两个一一对应的序列之间的线性相关性。也就是两个序列一起增大或者一起减小的可能性。两个序列正相关值就趋近于1,否则趋近于0。数学含义:两个序列协方差与二者方差乘积的比值

  1. r
  2. =
  3. i
  4. =
  5. 1
  6. n
  7. (
  8. X
  9. i
  10. X
  11. )
  12. (
  13. Y
  14. i
  15. Y
  16. )
  17. i
  18. =
  19. 1
  20. n
  21. (
  22. X
  23. i
  24. X
  25. )
  26. 2
  27. i
  28. =
  29. 1
  30. n
  31. (
  32. Y
  33. i
  34. Y
  35. )
  36. 2
  37. r=\frac{\sum_{i=1}^{n}(X_i-\overline{X})(Y_i-\overline{Y})}{\sqrt{\sum_{i=1}^{n}(X_i-\overline{X})^2}\sqrt{\sum_{i=1}^{n}(Y_i-\overline{Y})^2}}
  38. r=∑i=1n​(Xi​−X)2​∑i=1n​(Yi​−Y)2​∑i=1n​(Xi​−X)(Yi​−Y)​

如果比较两个人的相似度,那么他们所有共同评价过的物品可以看做两个人的特征序列,这两个特征序列的相似度就可以用皮尔逊相关系数去衡量。物品的相似度比较也是如此。皮尔逊对于稀疏矩阵表现不好,可以通过引入权重进行优化

6.3.2 欧氏距离

欧式距离同理可以将两个人所有共同评价过的物品看做这个人的特征,将这些特征看作是空间中的点,计算两点之间的距离
在这里插入图片描述

6.3.3 同现相似度

物品

  1. i
  2. i
  3. i和物品
  4. j
  5. j
  6. j的同现相似度公式定义如下:
  7. w
  8. i
  9. j
  10. =
  11. N
  12. (
  13. i
  14. )
  15. N
  16. (
  17. j
  18. )
  19. N
  20. (
  21. i
  22. )
  23. w_{ij} = \frac{| N(i)\bigcap N(j)|}{|N(i)|}
  24. wij​=∣N(i)∣∣N(i)⋂N(j)∣​

其中,分母是喜欢物品

  1. i
  2. i
  3. i的用户数,而分子则是同时喜欢物品
  4. i
  5. i
  6. i和物品
  7. j
  8. j
  9. j的用户数。因此,上述公式可用理解为喜欢物品
  10. i
  11. i
  12. i的用户有多少比例的用户也喜欢
  13. j
  14. j
  15. j(和关联规则类似)。

但上述公式存在一个问题,如果物品

  1. j
  2. j
  3. j是热门物品,有很多人都喜欢,则会导致
  4. w
  5. i
  6. j
  7. w_{ij}
  8. wij​很大,接近于1。因此会造成任何物品都和热门物品有很大的相似度。为此我们用如下公式进行修正:
  9. w
  10. i
  11. j
  12. =
  13. N
  14. (
  15. i
  16. )
  17. N
  18. (
  19. j
  20. )
  21. N
  22. (
  23. i
  24. )
  25. N
  26. (
  27. j
  28. )
  29. w_{ij} = \frac{| N(i)\bigcap N(j)|}{\sqrt{|N(i)||N(j)|}}
  30. wij​=∣N(i)∣∣N(j)∣​∣N(i)⋂N(j)∣​

这个公式惩罚了 物品

  1. j
  2. j
  3. j的权重,因此减轻了热门物品和很多物品相似的可能性。(也归一化了
  4. [
  5. i
  6. ,
  7. j
  8. ]
  9. [i,j]
  10. [i,j]和
  11. [
  12. j
  13. ,
  14. i
  15. ]
  16. [j,i]
  17. [j,i])

6.4 领域大小

有了相似度的比较,那么比较多少个用户或者物品为好呢?一般会有基于固定大小的邻域及基于阈值的邻域。具体数值一般是通过对模型的评比分数进行调整优化
在这里插入图片描述
在这里插入图片描述

6.5 基于用户的

  1. C
  2. F
  3. CF
  4. CF
  5. U
  6. s
  7. e
  8. r
  9. C
  10. F
  11. U
  12. s
  13. e
  14. r
  15. C
  16. o
  17. l
  18. l
  19. a
  20. b
  21. o
  22. r
  23. a
  24. t
  25. i
  26. o
  27. n
  28. F
  29. i
  30. l
  31. t
  32. e
  33. r
  34. UserCFUser \quad Collaboration \quad Filter
  35. UserCFUserCollaborationFilter),又称之为基于用户的协同过滤算法。模型核心算法伪代码表示如下:
  1. for 每个其他用户w
  2. 计算用户u和用户w的相似度s
  3. 按相似度排序后,将位置靠前的用户作为邻域n
  4. for(n中用户有偏好,而u中用户无偏好的)每个物品i
  5. forn中用户对i有偏好的)每个其他用户v
  6. 计算用户u和用户v的相似度s
  7. 按权重svi的偏好并入平均值

基于该核心算法,完成用户商品矩阵如下所示:
物品101物品102物品103用户13.02.01.0用户21.02.03.0用户31.0--用户42.0-1.0用户53.02.01.0
预测用户对未评分的物品的分值,然后按照降序排序,进行推荐

6.6 基于物品的

  1. C
  2. F
  3. CF
  4. CF
  5. I
  6. t
  7. e
  8. m
  9. C
  10. F
  11. I
  12. t
  13. e
  14. m
  15. C
  16. o
  17. l
  18. l
  19. a
  20. b
  21. o
  22. r
  23. a
  24. t
  25. i
  26. o
  27. n
  28. F
  29. i
  30. l
  31. t
  32. e
  33. r
  34. ItemCFItem \quad Collaboration \quad Filter
  35. ItemCFItemCollaborationFilter),又称之为基于商品(物品)的协同过滤算法。先计算出物品-物品的相似矩阵,伪代码如下所示:
  1. for 每个物品i
  2. for 每个其他物品j
  3. for ij均有偏好的每个用户u
  4. 将物品对(ij)间的偏好值差异加入u的偏好

基于上面的结果:

  1. for 用户u未表达过偏好的每个物品i
  2. for 用户u表达过偏好的每个物品j
  3. 找到ji之间的平均偏好值差异
  4. 添加该差异到uj的偏好值
  5. 添加其至平均值
  6. return 值最高的物品(按平均差异排序)

给用户推送预测偏好值

  1. n
  2. n
  3. n个最高的物品

6.7

  1. A
  2. L
  3. S
  4. ALS
  5. ALS矩阵分解模型

6.7.1 矩阵分解模型

在协同过滤推荐算法中,最主要是的产生用户对物品的打分,用户对物品的打分行为可以表示成一个评分矩阵

  1. A
  2. (
  3. m
  4. n
  5. )
  6. A(m*n)
  7. A(mn),表示
  8. m
  9. m
  10. m个用户对
  11. n
  12. n
  13. n个物品的打分情况。如下图所示:

在这里插入图片描述
其中

  1. A
  2. (
  3. i
  4. ,
  5. j
  6. )
  7. A(i,j)
  8. A(i,j)表示用户
  9. u
  10. s
  11. e
  12. r
  13. i
  14. user i
  15. useri对物品
  16. i
  17. t
  18. e
  19. m
  20. j
  21. item j
  22. itemj的打分。但是,用户不会对所有物品打分,图中
  23. ?
  24. ?
  25. ?表示用户没有打分的情况,所以这个矩阵
  26. A
  27. A
  28. A很多元素都是空的,我们称其为“损失值(missing value)”,是一个稀疏矩阵。在推荐系统中,我们希望得到用户对所有物品的打分情况,如果用户没有对一个用户打分,那么就需要预测用户是否会对该物品打分,以及会打多少分。这就是所谓的“矩阵补全(填空)”

我们从另外一个层面考虑用户对物品的喜爱程度,而不是通过与用户的推荐。用户之所以喜欢一个物品,绝大多数是因为这个物品的某些属性和这个用户的属性是一致的或者是接近的,比如一个人总是具有爱国情况或者侠义情怀,那么根据这些推断一定喜欢比如《射雕英雄传》、抗战剧等电视剧,因为这些电视剧所表达的正是侠义和爱国。可以设想用户拥有某些隐含的特征、物品也具有某种隐含的特征,如果这些特征都相似,那么很大程度上用户会喜欢这个物品
根据上面的假设,我们可以把评分矩阵表示成两个低纬度的矩阵相乘,如下:
在这里插入图片描述
我们希望学习一个

  1. P
  2. P
  3. P代表
  4. u
  5. s
  6. e
  7. r
  8. user
  9. user的特征,
  10. Q
  11. Q
  12. Q代表
  13. i
  14. t
  15. e
  16. m
  17. item
  18. item的特征。特征的每一个维度代表一个隐性因子,比如对电影来说,这些隐性因子可能是导演、演员等。当然,这些隐性因子是机器学习到的,具体是什么含义我们不确定
  19. A
  20. L
  21. S
  22. ALS
  23. ALS的核心就是下面这个假设:打分矩阵
  24. A
  25. A
  26. A是近似低秩的。换句话说,一个
  27. m
  28. n
  29. m*n
  30. mn的打分矩阵
  31. A
  32. A
  33. A可以用两个小矩阵
  34. U
  35. (
  36. m
  37. k
  38. )
  39. U(m*k)
  40. U(mk)和
  41. V
  42. (
  43. n
  44. k
  45. )
  46. V(n*k)
  47. V(nk)的乘积来近似:
  48. A
  49. U
  50. V
  51. T
  52. ,
  53. K
  54. m
  55. ,
  56. n
  57. AUV^T,K \ll m,n
  58. AUVT,Km,n。这样我们就把整个系统的时间复杂度由
  59. O
  60. (
  61. m
  62. n
  63. )
  64. O(mn)
  65. O(mn)一下降到了
  66. O
  67. (
  68. (
  69. m
  70. +
  71. n
  72. )
  73. k
  74. )
  75. O((m+n)*k)
  76. O((m+n)∗k)。一个人的喜好程度映射到了一个低维向量
  77. u
  78. i
  79. u_i
  80. ui​,一个电影的特征就变成了维度相同的向量
  81. v
  82. j
  83. v_j
  84. vj​,那么这个人和这个电影的相似度就可以表述成这两个向量之间的内积
  85. u
  86. i
  87. T
  88. v
  89. j
  90. {u_i}^Tv_j
  91. uiTvj

我们可以把打分理解成相似度,那么“打分矩阵

  1. A
  2. (
  3. m
  4. n
  5. )
  6. A(m*n)
  7. A(mn)”就可以由"用户喜好特征矩阵
  8. U
  9. (
  10. m
  11. k
  12. )
  13. U(m*k)
  14. U(m∗k)"和“产品特征矩阵
  15. V
  16. (
  17. n
  18. k
  19. )
  20. V(n*k)
  21. V(nk)”的乘积
  22. U
  23. V
  24. T
  25. UV^T
  26. UVT来近似了。这种方法被称为概率矩阵分解算法(
  27. p
  28. r
  29. o
  30. b
  31. a
  32. b
  33. i
  34. l
  35. i
  36. s
  37. t
  38. i
  39. c
  40. m
  41. a
  42. t
  43. r
  44. i
  45. x
  46. f
  47. a
  48. c
  49. t
  50. o
  51. r
  52. i
  53. z
  54. a
  55. t
  56. i
  57. o
  58. n
  59. P
  60. M
  61. F
  62. probabilistic matrix factorizationPMF
  63. probabilisticmatrixfactorizationPMF)。
  64. A
  65. L
  66. S
  67. ALS
  68. ALS算法是
  69. P
  70. M
  71. F
  72. PMF
  73. PMF在数值计算方面的应用。

6.7.2 交替最小二乘法(

  1. A
  2. L
  3. S
  4. ALS
  5. ALS

为了使低秩矩阵

  1. X
  2. X
  3. X
  4. Y
  5. Y
  6. Y尽可能地逼近
  7. R
  8. R
  9. R,需要最小化下面地平方误差损失函数
  10. m
  11. i
  12. n
  13. x
  14. ,
  15. y
  16. u
  17. ,
  18. i
  19. i
  20. s
  21. k
  22. n
  23. o
  24. w
  25. n
  26. (
  27. r
  28. u
  29. i
  30. x
  31. u
  32. T
  33. y
  34. i
  35. )
  36. 2
  37. min_{x_*,y_*}\sum_{u,i \quad is \quad known}^{}(r_{ui}-{x_u}^Ty_i)^2
  38. minx∗​,y∗​​u,iisknown∑​(rui​−xuTyi​)2

考虑到矩阵的稳定性问题,使用吉洪诺夫正则化

  1. T
  2. i
  3. k
  4. h
  5. o
  6. n
  7. o
  8. v
  9. r
  10. e
  11. g
  12. u
  13. l
  14. a
  15. r
  16. i
  17. z
  18. a
  19. t
  20. i
  21. o
  22. n
  23. Tikhonov regularization
  24. Tikhonovregularization,则上式变为:
  25. m
  26. i
  27. n
  28. x
  29. ,
  30. y
  31. L
  32. (
  33. X
  34. ,
  35. Y
  36. )
  37. =
  38. m
  39. i
  40. n
  41. x
  42. ,
  43. y
  44. u
  45. ,
  46. i
  47. i
  48. s
  49. k
  50. n
  51. o
  52. w
  53. n
  54. (
  55. r
  56. u
  57. i
  58. x
  59. u
  60. T
  61. y
  62. i
  63. )
  64. 2
  65. +
  66. λ
  67. (
  68. x
  69. u
  70. 2
  71. +
  72. y
  73. i
  74. 2
  75. )
  76. min_{x_*,y_*} L(X,Y) = min_{x_*,y_*} \sum_{u,i \quad is \quad known}^{}(r_{ui}-{x_u}^Ty_i)^2+\lambda (|x_u|^2+|y_i|^2)
  77. minx∗​,y∗​​L(X,Y)=minx∗​,y∗​​u,iisknown∑​(rui​−xuTyi​)2+λ(∣xu​∣2+∣yi​∣2)

所以整个矩阵分解模型的损失函数为:

  1. C
  2. =
  3. (
  4. i
  5. ,
  6. j
  7. )
  8. R
  9. [
  10. (
  11. a
  12. i
  13. ,
  14. j
  15. u
  16. i
  17. T
  18. v
  19. j
  20. )
  21. 2
  22. +
  23. λ
  24. (
  25. u
  26. i
  27. 2
  28. +
  29. v
  30. j
  31. 2
  32. )
  33. ]
  34. C=\sum_{(i,j) \in R}^{}[(a_{i,j}-{u_i}^Tv_j)^2+\lambda (||u_i||^2+||v_j||^2)]
  35. C=(i,j)∈R∑​[(ai,j​−uiTvj​)2+λ(∣∣ui​∣∣2+∣∣vj​∣∣2)]

有了损失函数之后,下面就开始谈优化方法了,通常的优化方法分为两种:交叉最小二乘法(

  1. a
  2. l
  3. t
  4. e
  5. r
  6. n
  7. a
  8. t
  9. i
  10. v
  11. e
  12. l
  13. e
  14. a
  15. s
  16. t
  17. s
  18. q
  19. u
  20. a
  21. r
  22. e
  23. s
  24. alternative \quad least \quad squares
  25. alternativeleastsquares)和随机梯度下降法(
  26. s
  27. t
  28. o
  29. c
  30. h
  31. a
  32. s
  33. t
  34. i
  35. c
  36. g
  37. r
  38. a
  39. d
  40. i
  41. e
  42. n
  43. t
  44. d
  45. e
  46. s
  47. c
  48. e
  49. n
  50. t
  51. stochastic \quad gradient \quad descent
  52. stochasticgradientdescent)。本次使用交叉最小二乘法(
  53. A
  54. L
  55. S
  56. ALS
  57. ALS)来最优化损失函数。算法的思想就是:我们先随机生成
  58. U
  59. (
  60. 0
  61. )
  62. U^{(0)}
  63. U(0),然后固定它求解
  64. V
  65. (
  66. 0
  67. )
  68. V^{(0)}
  69. V(0),再固定
  70. V
  71. (
  72. 0
  73. )
  74. V^{(0)}
  75. V(0)求解
  76. U
  77. (
  78. 1
  79. )
  80. U^{(1)}
  81. U(1),这样交替进行下去,直到取得最优解
  82. m
  83. i
  84. n
  85. (
  86. C
  87. )
  88. min(C)
  89. min(C)。因为每步迭代都会降低误差,并且误差是有下界的,所以
  90. A
  91. L
  92. S
  93. ALS
  94. ALS一定会收敛。但由于问题是非凸的,
  95. A
  96. L
  97. S
  98. ALS
  99. ALS并不保证会收敛到全局最优解。但在实际应用中,
  100. A
  101. L
  102. S
  103. ALS
  104. ALS对初始点不是很敏感,是不是全局最优解造成的影响并不大

算法的执行步骤如下:

  1. 先随机生成一个 U ( 0 ) U^{(0)} U(0)。一般可以取0值或者全局均值

  2. 固定 U ( 0 ) U^{(0)} U(0)(即:认为 U ( 0 ) U^{(0)} U(0)是已知的常量),来求解 V ( 0 ) V^{(0)} V(0)

    1. 此时,损失函数为:
    2. C
    3. =
    4. (
    5. i
    6. ,
    7. j
    8. )
    9. R
    10. [
    11. (
    12. a
    13. i
    14. ,
    15. j
    16. (
    17. u
    18. i
    19. (
    20. 0
    21. )
    22. )
    23. T
    24. v
    25. j
    26. )
    27. 2
    28. +
    29. λ
    30. (
    31. u
    32. i
    33. (
    34. 0
    35. )
    36. 2
    37. +
    38. v
    39. j
    40. 2
    41. )
    42. ]
    43. C=\sum_{(i,j) \in R}^{}[(a_{i,j}-({u_i}^{(0)})^Tv_j)^2+\lambda (||{u_i}^{(0)}||^2+||v_j||^2)]

    C=(i,j)∈R∑​[(ai,j​−(ui​(0))Tvj​)2+λ(∣∣ui​(0)∣∣2+∣∣vj​∣∣2)]
    由于




    C



    C
    C中只有

    1. V
    2. j
    3. V_j

    Vj​一个未知变量,因此

    1. C
    2. C

    C的最优化问题转换为最小二乘问题,用最小二乘法求解

    1. V
    2. j
    3. V_j

    Vj​的最优解。固定

    1. j
    2. (
    3. j
    4. =
    5. 1
    6. ,
    7. 2
    8. ,
    9. ,
    10. n
    11. )
    12. j(j=1,2,……,n)

    j(j=1,2,……,n),则

    1. C
    2. C

    C的导数

    1. C
    2. v
    3. j
    4. =
    5. v
    6. j
    7. [
    8. i
    9. =
    10. 1
    11. m
    12. [
    13. (
    14. a
    15. i
    16. ,
    17. j
    18. (
    19. u
    20. i
    21. (
    22. 0
    23. )
    24. )
    25. T
    26. )
    27. v
    28. j
    29. )
    30. 2
    31. +
    32. λ
    33. (
    34. u
    35. i
    36. (
    37. 0
    38. )
    39. 2
    40. +
    41. v
    42. j
    43. 2
    44. )
    45. ]
    46. ]
    47. =
    48. i
    49. =
    50. 1
    51. m
    52. [
    53. 2
    54. (
    55. a
    56. i
    57. ,
    58. j
    59. (
    60. u
    61. i
    62. (
    63. 0
    64. )
    65. )
    66. T
    67. )
    68. v
    69. j
    70. )
    71. (
    72. u
    73. i
    74. (
    75. 0
    76. )
    77. )
    78. +
    79. 2
    80. λ
    81. v
    82. j
    83. ]
    84. =
    85. 2
    86. i
    87. =
    88. 1
    89. m
    90. [
    91. (
    92. (
    93. u
    94. i
    95. (
    96. 0
    97. )
    98. )
    99. T
    100. u
    101. i
    102. (
    103. 0
    104. )
    105. +
    106. λ
    107. )
    108. v
    109. j
    110. a
    111. i
    112. ,
    113. j
    114. u
    115. i
    116. (
    117. 0
    118. )
    119. ]
    120. \frac{\partial C}{\partial v_j}=\frac{\partial }{\partial v_j}[\sum_{i=1}^{m}[(a_{i,j}-({u_i}^{(0)})^T)v_j)^2+\lambda (||{u_i}^{(0)}||^2+||v_j||^2)]]=\sum_{i=1}^{m}[2(a_{i,j}-({u_i}^{(0)})^T)v_j)(-{u_i}^{(0)})+2\lambda v_j]=2\sum_{i=1}^{m}[(({u_i}^{(0)})^T{u_i}^{(0)}+\lambda )v_j-a_{i,j}{u_i}^{(0)}]

    ∂vj​∂C​=∂vj​∂​[i=1∑m​[(ai,j​−(ui​(0))T)vj​)2+λ(∣∣ui​(0)∣∣2+∣∣vj​∣∣2)]]=i=1∑m​[2(ai,j​−(ui​(0))T)vj​)(−ui​(0))+2λvj​]=2i=1∑m​[((ui​(0))Tui​(0)+λ)vj​−ai,j​ui​(0)]










    C








    v


    j





    =


    0



    \frac{\partial C}{\partial v_j}=0
    ∂vj​∂C​=0,得到:

    1. i
    2. =
    3. 1
    4. m
    5. [
    6. (
    7. (
    8. u
    9. i
    10. (
    11. 0
    12. )
    13. )
    14. T
    15. u
    16. i
    17. (
    18. 0
    19. )
    20. +
    21. λ
    22. )
    23. v
    24. j
    25. ]
    26. =
    27. i
    28. =
    29. 1
    30. m
    31. a
    32. i
    33. ,
    34. j
    35. u
    36. i
    37. (
    38. 0
    39. )
    40. \sum_{i=1}^{m}[(({u_i}^{(0)})^T{u_i}^{(0)}+\lambda )v_j]=\sum_{i=1}^{m}a_{i,j}{u_i}^{(0)}

    i=1∑m​[((ui​(0))Tui​(0)+λ)vj​]=i=1∑m​ai,j​ui​(0)
    即:





    (


    U



    U


    T



    +


    λ


    E


    )



    v


    j



    =


    U




    a


    j



    T




    (UU^T+\lambda E)v_j=U{a_j}^T
    (UUT+λE)vj​=Uaj​T
    令:






    M


    1



    =


    U



    U


    T



    +


    λ


    E


    ,



    M


    2



    =


    U




    a


    j



    T




    M_1 = UU^T+\lambda E,M_2 = U{a_j}^T
    M1​=UUT+λE,M2​=Uaj​T
    则:






    v


    j



    =




    M


    1







    1





    M


    2




    v_j = {M_1}^{-1}M_2
    vj​=M1​−1M2​
    按照上式依次计算





    v


    1



    ,



    v


    2



    ,








    ,



    v


    n




    v_1,v_2,……,v_n
    v1​,v2​,……,vn​,从而得到

    1. V
    2. (
    3. 0
    4. )
    5. V^{(0)}

    V(0)

  3. 固定 V ( 0 ) V^{(0)} V(0)(即:认为 V ( 0 ) V^{(0)} V(0)是已知的量),来求解 U ( 1 ) U^{(1)} U(1)。此时,损失函数为:

    1. C
    2. =
    3. (
    4. i
    5. ,
    6. j
    7. )
    8. R
    9. [
    10. (
    11. a
    12. i
    13. ,
    14. j
    15. (
    16. u
    17. i
    18. )
    19. T
    20. v
    21. j
    22. (
    23. 0
    24. )
    25. )
    26. 2
    27. +
    28. λ
    29. (
    30. u
    31. i
    32. 2
    33. +
    34. v
    35. j
    36. (
    37. 0
    38. )
    39. 2
    40. )
    41. ]
    42. C=\sum_{(i,j) \in R}^{}[(a_{i,j}-({u_i})^T{v_j}^{(0)})^2+\lambda (||{u_i}||^2+||{v_j}^{(0)}||^2)]

    C=(i,j)∈R∑​[(ai,j​−(ui​)Tvj​(0))2+λ(∣∣ui​∣∣2+∣∣vj​(0)∣∣2)]
    同理,用步骤2类似的方法,可以计算





    u


    i




    u_i
    ui​的值:

    1. C
    2. u
    3. i
    4. =
    5. 2
    6. j
    7. =
    8. 1
    9. n
    10. [
    11. (
    12. (
    13. v
    14. j
    15. (
    16. 0
    17. )
    18. )
    19. T
    20. v
    21. j
    22. (
    23. 0
    24. )
    25. +
    26. λ
    27. )
    28. u
    29. i
    30. a
    31. i
    32. ,
    33. j
    34. v
    35. j
    36. (
    37. 0
    38. )
    39. ]
    40. \frac{\partial C}{\partial u_i}=2\sum_{j=1}^{n}[(({v_j}^{(0)})^T{v_j}^{(0)}+\lambda )u_i-a_{i,j}{v_j}^{(0)}]

    ∂ui​∂C​=2j=1∑n​[((vj​(0))Tvj​(0)+λ)ui​−ai,j​vj​(0)]










    C








    u


    i





    =


    0



    \frac{\partial C}{\partial u_i}=0
    ∂ui​∂C​=0,得到:

    1. j
    2. =
    3. 1
    4. n
    5. [
    6. (
    7. (
    8. v
    9. j
    10. (
    11. 0
    12. )
    13. )
    14. T
    15. v
    16. j
    17. (
    18. 0
    19. )
    20. +
    21. λ
    22. )
    23. u
    24. i
    25. ]
    26. =
    27. j
    28. =
    29. 1
    30. n
    31. a
    32. i
    33. ,
    34. j
    35. v
    36. j
    37. (
    38. 0
    39. )
    40. \sum_{j=1}^{n}[(({v_j}^{(0)})^T{v_j}^{(0)}+\lambda )u_i]=\sum_{j=1}^{n}a_{i,j}{v_j}^{(0)}

    j=1∑n​[((vj​(0))Tvj​(0)+λ)ui​]=j=1∑n​ai,j​vj​(0)
    即:





    (


    V



    V


    T



    +


    λ


    E


    )



    u


    i



    =


    V




    a


    i



    T




    (VV^T+\lambda E)u_i=V{a_i}^T
    (VVT+λE)ui​=Vai​T
    令:






    M


    1



    =


    V



    V


    T



    +


    λ


    E


    ,



    M


    2



    =


    V




    a


    i



    T




    M_1 = VV^T+\lambda E,M_2 = V{a_i}^T
    M1​=VVT+λE,M2​=Vai​T
    则:






    u


    i



    =




    M


    1







    1





    M


    2




    u_i = {M_1}^{-1}M_2
    ui​=M1​−1M2​
    依照上式依次计算





    u


    1



    ,



    u


    2



    ,








    ,



    u


    m




    u_1,u_2,……,u_m
    u1​,u2​,……,um​,从而得到

    1. U
    2. (
    3. 1
    4. )
    5. U^{(1)}

    U(1)

    4.循环执行步骤2、3,直到损失函数

    1. C
    2. C

    C的值收敛(或者设置一个迭代次数

    1. N
    2. N

    N,迭代执行步骤2、3

    1. N
    2. N

    N次后)。这样,就得到了

    1. C
    2. C

    C最优解对应的矩阵

    1. U
    2. U

    U、

    1. V
    2. V

    V

七、组合推荐

推荐算法有很多种,本项目只涉及到了基于内容的推荐、基于模型的实时推荐以及协同过滤推荐。这种组合式的应用推荐就叫组合推荐(

  1. H
  2. y
  3. b
  4. r
  5. i
  6. d
  7. R
  8. e
  9. c
  10. o
  11. m
  12. m
  13. e
  14. n
  15. d
  16. a
  17. t
  18. i
  19. o
  20. n
  21. Hybrid \quad Recommendation
  22. HybridRecommendation)。研究和应用最多的是内容推荐和协同过滤推荐的组合。最简单的做法就是分别用基于内容的方法和协同过滤推荐方法去产生一个推荐预测结果,然后用某种方法组合其结果

八、我们要做什么

在这里插入图片描述


总结

哇,终于写完了,历时差不多四天,这篇博文又长又有难度,希望读者好好理解,里面有一些高等数学相关的知识,但是内容不是特别难,这里的理论对于后面的实践操作至关重要,我已经说过很多次了。后面的博客就是正式开始搭建我们整个系统了,下一篇先给大家带来关于系统展示的相关内容!


本文转载自: https://blog.csdn.net/IronmanJay/article/details/123487404
版权归原作者 IronmanJay 所有, 如有侵权,请联系我们删除。

“利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)”的评论:

还没有评论