一直使用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. 在Eclipse下debug 出现Source not found for ...

    在Eclipse下debug 出现Source not found for ... 在Eclipse下调试Servlet出现了Source not found for XxxAction.execut ...

  2. android logcat里面AndroidRuntime FATAL EXCEPTION: main这个是什么问题啊。

    android logcat里面AndroidRuntime FATAL EXCEPTION: main这个是什么问题啊. http://zhidao.baidu.com/link?url=mUI11 ...

  3. jquery学习以及下载链接

    jquery学习链接 http://www.w3school.com.cn/jquery/jquery_intro.asp jquery 脚本库下载链接 http://jquery.com/downl ...

  4. 一个简单json数据提交实例

    1.客户端编程:jsp页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  5. 概述什么是OSGi框架

    现 在越来越多的Java开发人员在谈论OSGi是有其道理的.在几年前上学的时候我进行了比较多的Eclipse插件开发,当时就亲身感觉到Eclipse 插件体系的灵活与强大,而该体系与OSGi也可谓一脉 ...

  6. ASP.NET MVC ActionResult的实现

    1.11种ActionResult 在System.Web.Mvc命名空间下: ActionResult是一个抽象类, 在Action中返回的都是其派生类.下面是我整理的ASP.NET MVC 1.0 ...

  7. fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭

    在默认情况下,fancybox点击之后弹出窗口,右上角带有一个XX,但是点击窗口的其他遮罩层或者是其他地方,都是可以关闭fancybox的,有些时候,我们不希望这样关闭,而是只能点击右上角关闭,那么设 ...

  8. 使php支持mbstring库

    多国语言并存就意味着多字节,PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数.对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF ...

  9. VS2008+ffmpeg SDK3.2调试tutorial01

    最近研究ffmpeg,在ubuntu下感觉不太好调试,老是找不到函数的声明.所以我就把他移到windows下用vs2008分析 关于环境的搭建,我参考了 http://hi.baidu.com/for ...

  10. ftp在shell脚本中的使用方法

    1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地的/home/databackup#####!/bin/bashftp -n<<!open 1 ...