SVD综述和Mahout中实现

基本介绍

伴随的电商业务蓬勃发展,推荐系统也受到了格外重视,在通常电商系统中都是采用基于CF(Collaborative filtering)算法原型来做的。该算法是基于这样基本假设:people who agreed in the past will agree in the future 。

说到SVD算法不能不说到Netflix举办的推荐大赛,这次比赛对推荐系统工业界产生了很大影响,伴随着提出了很多算法思路,所以本文也是以这次比赛为主线,参考其中相关的两篇经典论文,两篇文章会上传。

CF算法的挑战:对于每个user ,未知的item 评分会大体上相似,因此对于那些只给少量item有评分的user将会有比较大的预测误差,因为这样的user缺乏足够信息做预测。

Netflix比赛中最简单直观思路就是利用KNN算法思想,对于某个user 某个未评分的item,找到那个user 近邻的users,然后多个近邻user通过相似性加权来预测这个未评分的item,这个思路很简单实现上也不难,但是这里有个关键问题就是如何计算近邻,如何定义近邻的相似性,我们通过计算users 和 objects特征来计算相似性,但是这个特征很难去构建好。

另外一种思路:matrix factorization 矩阵分解,这其中最常用的就是Singular Value Decomposition算法,SVD直接找到每个user和object的特征,通过user 和object特征对未评分的item进行评分预测。

SVD

SVD跟别的矩阵分解算法相比:没有强加任何限制并且更容易实现

上面是最基本的SVD算法形态,预测函数p 通常就是用简单的dot product 运算,我们知道当我们把一个问题损失函数定义好了,下面要做的就是最优化的问题。

这个算法考虑到评分区间问题,需要把预测值限定在指定评分区间

对上面损失函数求偏导如公式(5)(6)所示。

Batch learning of SVD

所以整个算法流程就如下:(Batch learning of SVD)

然后论文中也给出了如何给U、V矩阵赋初值的算法。

公式中a是评分的下界,n(r)是在[-r,r]的均匀分布,上面提到的SVD算法是其最标准的形式,但是这个形式不是和大规模并且稀疏的矩阵学习,在这种情况下梯度下降会有很大的方差并且需要一个很小的学习速率防止发散。

前面提到了Batch learning of SVD ,我们会发现一个问题就是:如果评分矩阵V 有一些小的变动,比如某个user增加了评分,这是我们利用Batch learning of SVD 又需要把所有数据学习一次,这会造成很大的计算浪费。

如上所述我们每次针对Ui :feature vector of user i 进行学习更新

更极端的情况我们可以针对每一个评分来进行学习如下图:

Incomplete incremental learning of SVD

针对上面基于某个user 学习或者基于某个评分学习算法我们称为增量学习(incremental learning)

算法 2 是基于某个user 的 叫做非完全的增量学习

Complete incremental learning of SVD

算法 3 是基于某个评分进行更新的算法,叫做完全增量学习算法。

算法3还可以有一些改进提升空间:加入per-user bias and per-object bias

在论文结论部分:batch learning or incomplete incremental learning 需要一个很小的学习速率并且跟 complete incremental learning 相比性能不稳定,所以综合得出结论就是complete incremental learning 是对于millions 训练数据最好选择。

Mahout中实现

在Mahout中也会发现时基于complete incremental learning 算法进行的实现

 protected void updateParameters(long userID, long itemID, float rating, double currentLearningRate) {
    int userIndex = userIndex(userID);
    int itemIndex = itemIndex(itemID);

    double[] userVector = userVectors[userIndex];
    double[] itemVector = itemVectors[itemIndex];
    double prediction = predictRating(userIndex, itemIndex);
    double err = rating - prediction;

    // adjust user bias
    userVector[USER_BIAS_INDEX] +=
        biasLearningRate * currentLearningRate * (err - biasReg * preventOverfitting * userVector[USER_BIAS_INDEX]);

    // adjust item bias
    itemVector[ITEM_BIAS_INDEX] +=
        biasLearningRate * currentLearningRate * (err - biasReg * preventOverfitting * itemVector[ITEM_BIAS_INDEX]);

    // adjust features
    for (int feature = FEATURE_OFFSET; feature < numFeatures; feature++) {
      double userFeature = userVector[feature];
      double itemFeature = itemVector[feature];

      double deltaUserFeature = err * itemFeature - preventOverfitting * userFeature;
      userVector[feature] += currentLearningRate * deltaUserFeature;

      double deltaItemFeature = err * userFeature - preventOverfitting * itemFeature;
      itemVector[feature] += currentLearningRate * deltaItemFeature;
    }
  }

  private double predictRating(int userID, int itemID) {
    double sum = 0;
    for (int feature = 0; feature < numFeatures; feature++) {
      sum += userVectors[userID][feature] * itemVectors[itemID][feature];
    }
    return sum;
  }
时间: 2024-10-30 10:57:10

SVD综述和Mahout中实现的相关文章

Mahout 中基于SVD 的协同过滤原理

SVD原理: http://blog.csdn.net/wuyanyi/article/details/7964883Mahout 中基于SVD 的协同过滤原理

mahout中map-reduce版的itembased推荐算法思想

最近想写一个map-reduce版的userbased,于是先研究mahout中已实现的itembased算法.itembased看起来简单,但是深入到实现细节还是有点复杂的,用map-reduce实现就更复杂了. itembased的本质: 预测某用户user对某物品item的打分, 看看该用户对其他item的打分,如果其他item跟该item越相似,则权重越高. 最后加权平均. itembased核心步骤: 1 计算item相似度矩阵(利用两个矩阵相乘) 2 user打分矩阵 乘以 item

Mahout中相似度计算方法介绍

在现实中广泛使用的推荐系统一般都是基于协同过滤算法的,这类算法通常都需要计算用户与用户或者项目与项目之间的相似度,对于数据量以及数据类型不 同的数据源,需要不同的相似度计算方法来提高推荐性能,在mahout提供了大量用于计算相似度的组件,这些组件分别实现了不同的相似度计算方法.下图用 于实现相似度计算的组件之间的关系: 图1.项目相似度计算组件 图2.用户相似度计算组件 下面就几个重点相似度计算方法做介绍: 皮尔森相关度 类名:PearsonCorrelationSimilarity 原理:用来

hadoop Mahout中相似度计算方法介绍(转)

来自:http://blog.csdn.net/samxx8/article/details/7691868 相似距离(距离越小值越大) 优点 缺点 取值范围 PearsonCorrelation 类似于计算两个矩阵的协方差 不受用户评分偏高 或者偏低习惯影响的影响 1. 如果两个item相似个数小于2时 无法计算相似距离. [可以使用item相似个数门限来解决.] 没有考虑两个用户之间的交集大小[使用weight参数来解决] 2. 无法计算两个完全相同的items [-1, 1] Euclid

mahout中得距离测度

假设向量1为(a1,a2,...an) 向量2为(b1,b2,...bn) 1.欧式距离测度 公式为 d=sqrt((a1-b1)^2+(a2-b2)^2+-+(an-bn)^2) mahout类为EuclideanDistanceMeasure 2.平方欧式距离测度 公式为 d=(a1-b1)^2+(a2-b2)^2+-+(an-bn)^2 mahout类为SquaredEuclideanDistanceMeasure 3.曼哈顿距离测度 公式为 d=|a1-b1|+|a2-b2|+-+|an

mahout之旅---分布式推荐算法ALS-MR

Mahout分布式推荐系统--基于矩阵分解的协同过滤系统 1.实例环境 Mahout版本:mahout-0.9: Hadoop版本:hadoop-1.2.1: Jdk版本:java1.7.0_13 分布式系统:centos: 集群规模:master .slavex.slavey.slavez 2.实例脚本 目前技术博文对mahout0.9版本的简介的也是不忍直视.这里系列博客对mahout0.9版本自带的基于矩阵分解的协同过滤系统算法的讲解.一个首先不管怎么样,先把程序跑起来,mahout自带了

Mahout快速入门教程

Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能. 一.Mahout安装.配置 1.下载并解压Mahout http://archive.apache.org/dist/mahout/ tar -zxvf mahout-distribution-0.9.tar.

奇异分解(SVD)理论介绍

一.前言 奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,主要应用如下: 信息检索(LSA:隐性语义索引,LSA:隐性语义分析),分解后的奇异值代表了文章的主题或者概念,信息检索的时候同义词,或者说同一主题下的词会映射为同一主题,这样就可以提高搜索效率 数据压缩:通过奇异值分解,选择能量较大的前N个奇异值来代替所有的数据信息,这样可以降低噪声,节省空间. 推荐系统:主要是降噪,矩阵变换至低维空间(分解后还原的矩阵元素值作为原本

奇异值分解(SVD) --- 几何意义 (转载)

PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把 这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理问题,简单形象,真心希望路过的各路朋友能从不同的角度阐述下自己对SVD实际意义的理 解,比如 个性化推荐中应用了SVD,文本以及Web挖掘的时候也经常会用到SVD. 原文:We recommend a singular value decomposition 关于线性变换部分的一些知识可以猛戳这里  奇异值分解(S