一直使用mahout的RowSimilarity来计算物品间的相似度,今晚仔细看了其实现,终于搞明白了他的计算逻辑。

上篇中介绍了整个itemBaseCF的mapreducer过程,主要有三个大的步骤吧,我把他称为prepare阶段,计算相似阶段和利用相似性计算推荐阶段。

prepare阶段主要完成的是矩阵转换变换以及统计一些相似及推荐时用到的一些属性。

第二阶段是计算相似性:有几个数据较为重要,如下所示。

  • norms.bin:是用来存放所有用户对一个商品的平方和,数据存储为itemA:double
  • numNonZeroEntries.bin:存放itemID对应的不为零的用户评分个数
  • maxValues.bin:最大的那个用户评分

之后经过一次矩阵的转置以userID为行itemID为列,计算一个用户评分过的所有商品的乘积,(一个自循环计算其与其他商品评分的乘积)

接下来就是计算相似度了,以欧氏距离为例:d = sqrt( (x1-x2)x1+(y1-y2)^2+(z1-z2)^2 )...三维空间中的算法

他是和x12+x22+y12+y22+z12+z22-2(x1*x2+y1*y2+z1*z2)...同理扩展到多维空间中,而mahout中的相似度算法就是这么搞的,先统计所有用户对此商品(A)的评分的平方和,然后在计算所有用户对此商品(A)与要计算相似的商品(B)的所有乘积之和,这样计算相似时直接获取以上结果,也就是平方和减去2倍的乘积之和,再开方。最后转化成相似的表示形式【1/(1+d)】。完成相似度的计算。

太晚了明天继续预测评分。

====================================================================================================================

接着昨天的,下面是预测评分。

经过前面两步的工作已经将以user为key的矩阵写入userVectors目录下,而相似矩阵也已经有了,下面应该是将用户A已经评过分的商品的相似商品找出来,这些就应该是要推荐的备选商品了。现在要根据相似度预测备选商品的评分了。

  • 利用相似矩阵和用户的评分数据,得到以下形式的数据结构:
user1 pref1 similarityColumn1
user1 pref2 similarityColumn2
user2 ... ...

在程序里也就是以userID为key,value为PrefAndSimilarityColumnWritable的Vector,这样就得到,某个用户评过分的商品评分和与其相似的商品的矩阵,这些就是为此用户做推荐的备选商品。下一步就是预测这些商品的评分,有个细节就是在此就已经过滤掉此用户已经评过分的商品,也就是预测评分时评过分的商品不会出现在推荐列表中,以上图第一行为例,mahout是采用将similarityColumn1中pref1评分的商品的相似度设置为Double.NAN,这很巧妙,NAN的话以后进行任何计算得出的结果都是NAN,也就不会出现在最后的推荐列表中了。预测评分采用的也是简单(相似向量*评分再做加权)/(相似向量加权),mahout为了减少预测次数,他是只预测某个商品在这些similarityColumn的中出现两次以上的。

最后的推荐列表是推预测的商品做个倒排序,推荐列表就生成了。

mahout协同过滤算法的更多相关文章

  1. mahout协同过滤算法各接口

    Mahout协同过滤算法 Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎.Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供 ...

  2. 012_流式计算系统(Mahout协同过滤)

    课程介绍 课程内容 1.Mahout是什么 l  Mahout是一个算法库,集成了很多算法. l  Apache Mahout 是 Apache Software Foundation(ASF)旗下的 ...

  3. Mahout实现基于用户的协同过滤算法

    Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序 ...

  4. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...

  5. SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

    1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:

  6. GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法

    GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...

  7. Spark机器学习之协同过滤算法

    Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...

  8. Collaborative Filtering(协同过滤)算法详解

    基本思想 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分.根据不同用户对相同商品或内容的态度和偏好程度计算用户 ...

  9. 【机器学习笔记一】协同过滤算法 - ALS

    参考资料 [1]<Spark MLlib 机器学习实践> [2]http://blog.csdn.net/u011239443/article/details/51752904 [3]线性 ...

随机推荐

  1. Java API —— BigInteger类

    1.BigInteger类概述        可以让超过Integer范围内的数据进行运算 2.构造方法     public BigInteger(String val) 3.BigInteger类 ...

  2. UVa 1301 - Fishnet

    求出所有交点枚举每个四边形找最大面积即可. #include <cstdio> #include <cmath> #include <algorithm> usin ...

  3. 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

    这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...

  4. android.content.Context 含义及使用

    Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Con ...

  5. JSP中嵌入java代码方式以及指令

    JSP中嵌入java代码的三种方式: (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% j ...

  6. SQLserver游标原理和使用方法

    在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录.那么如何解决这种问题呢 ...

  7. ER模型到关系模型的转换规则

    E-R模型向关系模型的转换规则: 一.两元联系的转换规则 (1)实体类型的转换 将每个实体类型转换成一个关系模式,实体的属性即为关系的属性,实体标识符即为关系的键. (2)联系类型的转换 a实体间的联 ...

  8. tomcat web.xml配置

    关于Tomcat 中 web.xml 文件的配置问题: 1.下面的配置是合法的     <servlet>        <servlet-name>test</serv ...

  9. Android 开机动画启动过程详解

    Android 开机会出现3个画面: 1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片): 2. Android平台启动初始化,出 ...

  10. UVA 11865 Stream My Contest(最小树形图)

    题意:N台机器,M条有向边,总资金C,现要到搭建一个以0号机(服务器)为跟的网路,已知每条网线可以把数据从u传递到v,其带宽为d,花费为c,且d越大,传输速度越快,问能够搭建的传输速度最快的网络d值是 ...