一直使用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. Ado.Net小练习03(省市联动)

    前台界面:          后台代码: namespace _04省市联动 {     public partial class Form1 : Form     {         public ...

  2. wxpython 中 用鼠标拖动控件 总结

    #encoding: utf-8 import wx import os import noname class Frame( noname.MyFrame1 ): def __init__(self ...

  3. Android The content of the adapter has changed but ListView did not receive a notification终极解决方法

    这几天做一个自动扫描SD卡上所有APK文件的小工具,扫描过程中会把APK添加到LISTVIEW中显示,结果出现以下错误:(有时候触摸更新数据时候,触摸listview也会报错) E/AndroidRu ...

  4. 用matlab训练数字分类的深度神经网络Training a Deep Neural Network for Digit Classification

    This example shows how to use Neural Network Toolbox™ to train a deep neural network to classify ima ...

  5. jumplist和changlist

    用jumplist可以在不同的访问过的位置之间跳转 C-O到上一个 C-I到下一个位置 :jumps列出跳转列表 changlist列出最近的改动点 g;到上一个,g,到下一个 :changes列出相 ...

  6. TeeChart的X轴为时间,多个Y轴的显示

    最后上代码 public partial class Test : Form { private TChart tChart = new TChart(); ; public Test() { Ini ...

  7. null和""的区别

    从字面上看,null表示空(用str==null判定),""表示空字符串(用str.equals("")或者str.length()==0判定) 问题一: nu ...

  8. LA 5009 (三分法求极值) Error Curves

    给出的曲线要么是开口向上的抛物线要么是直线,但所定义的F(x)的图形一定是下凸的. 注意一点就是求得是极小值,而不是横坐标,样例也很容易误导人. #include <cstdio> #in ...

  9. Java [Leetcode 67]Add Binary

    题目描述: Given two binary strings, return their sum (also a binary string). For example,a = "11&qu ...

  10. (5)Quartz学习

    原文:http://blog.csdn.net/zxl315/article/details/10879927 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行. 运 ...