最近一直在做基于SVD推荐方面的工作,主要使用的是Mahout提供的cf.taste.impl.recommender.svd包下的推荐器,这里有一段参考代码,使用的推荐器是SVDRecommender,如下所示:

public class SVDRecommenderEx {private static String input = "/Users/harikrishna_gurram/customer.csv";private static DataModel model = null;private static SVDRecommender recommender = null;private static ALSWRFactorizer fatorizer = null;private static String[] books = { "Meet Big Brother", "Explore the Universe", "Memoir as metafiction","A child-soldier's story", "Wicked good fun", "The 60s kids classic", "A short-form master","Go down the rabbit hole", "Unseated a president", "An Irish-American Memoir" };private static String[] userNames = { "Hari Krishna Gurram", "Gopi Battu", "Rama Krishna Gurram", "Sudheer Ganji","Kiran Darsi", "Joel Chelli", "Sankalp Dubey", "Sunil Kumar", "Janaki Sriram", "Phalgun Garimella","Reshmi george", "Sailaja Navakotla", "Aravind Phaneendra", "Keerthi Shetty", "Sujatha","Vadiraj Kulakarni", "Arpan", "Suprabath Bisoi", "Sravani", "Gireesh Amara" };public static void main(String args[]) throws IOException, TasteException {model = new FileDataModel(new File(input));fatorizer = new ALSWRFactorizer(model, 5, 0.05, 10);recommender = new SVDRecommender(model, fatorizer);List<RecommendedItem> recommendations = recommender.recommend(1, 5);System.out.println("Recommendations for customer " + userNames[0] + " are:");System.out.println("*************************************************");System.out.println("BookId\title\t\testimated preference");for (RecommendedItem recommendation : recommendations) {int bookId = (int) recommendation.getItemID();float estimatedPref = recommender.estimatePreference(1, bookId);System.out.println(bookId + " " + books[bookId - 1] + "\t" + estimatedPref);}System.out.println("*************************************************");}
}

在上一段代码中,用到的矩阵分解器Factorizer是基于最小二乘分解的分解器ALSWRFactorizer,还有一种常用的分解器SVDPlusPlusFactorizer。

其实,基于潜在(隐藏)因子的推荐,即基于隐语义模型的推荐,通常采用SVD或改进的SVD(SVD++)方式。

奇异值分解(SVD):

考虑协同过滤中最为常见的场景:用户给电影评分的,我们需要一个数学模型来模拟这个评分场景,比如对电影做评分预测。

将评分矩阵U看作是两个矩阵的乘积:

其中,可以看作是user x对电影的隐藏特征y的喜好程度,而可以看作是特征y在电影z中的体现程度。那么上述模型的评分预测公式为:

其中,q 和 p 分别对应了电影和用户在各个隐藏特质上的特征向量。

以上的模型中,用户和电影都体现得无差别,例如某些用户非常挑剔,总是给予很低的评分;或是某部电影拍得奇烂,恶评如潮。为了模拟以上的情况,需要引入 baseline predictor.

其中 μ 为所有评分基准,bi 为电影 i 的评分均值相对μ的偏移,bu 类似。注意,这些都是参数,需要通过训练得到具体数值,但可以用相应的均值作为初始化时的估计。

模型参数bi,bu,qi,pu通过最优化下面这个目标函数获得:

其中,前一项是一种最小二乘损失函数的表达形式,第二项和第三项分别是正则化项。可以用梯度下降方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定pu优化qi,然后固定qi优化pu,然后交替更新。梯度下降方法中参数的更新式子如下(为了简便,把目标函数中的μ+bi+bu+q⊤ipu整体替换为r^ui):

其中α是学习速率,也是更新步长。

SVD++:

某个用户对某个电影进行了评分,那么说明他看过这部电影,那么这样的行为事实上蕴含了一定的信息,因此我们可以这样来理解问题:评分的行为从侧面反映了用户的喜好,可以将这样的反映通过隐式参数的形式体现在模型中,从而得到一个更为精细的模型,便是 SVD++.

其中 I(u) 为该用户所评价过的所有电影的集合,yj为隐藏的“评价了电影 j”反映出的个人喜好偏置。收缩因子取集合大小的根号是一个经验公式,并没有理论依据。

模型参数bi,bu,qi,pu,yj通过最优化下面这个目标函数获得:

与SVD方法类似,可以通过梯度下降算法进行求解。

svd与svd++联系与区别相关推荐

  1. SVD、SVD++和Asymmetric SVD 以及实例

    这里是关于SVD.SVD++和Asymmetric SVD 相关资料汇总,以及一个使用surprise编写SVD的实例. 1. 资料汇总 SVD的论文: https://www.netflixpriz ...

  2. SVD与SVD++的学习

    SVD在推荐系统中的应用详解以及算法推导 查看全文 http://www.taodudu.cc/news/show-6192782.html 相关文章: SVD算法和应用 SVD系列算法 opencv ...

  3. ML之DR之SVD:SVD算法相关论文、算法过程、代码实现、案例应用之详细攻略

    ML之DR之SVD:SVD算法相关论文.算法过程.代码实现.案例应用之详细攻略 目录 SVD算法相关论文 SVD算法过程 1.公式的推导 2.SVD算法两步过程 SVD代码实现 SVD的案例应用 1. ...

  4. 矩阵分解之: 特征值分解(EVD)、奇异值分解(SVD)、SVD++

    目录: 1.矩阵分解 1.1 矩阵分解的产生原因 1.2 矩阵分解作用 1.3 矩阵分解的方法 1.4 推荐学习的经典矩阵分解算法 2. 特征值分解(EVD) 3. 奇异值分解(SVD) 4. SVD ...

  5. 【SVD】SVD 分解

    什么是SVD分解,为什么要进行SVD分解 SVD分解就是将一个矩阵A,分解为如下的形式 A=UΣVTA=U \Sigma V^TA=UΣVT 分解的动机一般是为了减少矩阵AAA的存储空间,如AAA原本 ...

  6. matlab svd 含义,SVD 几何意义(转载)

    PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理问题,简单形象,真 ...

  7. 矩阵分解之特征值分解(EVD)、奇异值分解(SVD)、SVD++

    矩阵分解之: 特征值分解(EVD).奇异值分解(SVD).SVD++_人鱼线的博客-CSDN博客_evd分解 矩阵的特征分解和奇异值(SVD)分解--求法和意义_奔跑的Yancy的博客-CSDN博客_ ...

  8. 基于矩阵分解模型的协同过滤理论概述(涉及到SVD,SVD++,TimeSVD++)

    前言 本篇文章是对博客:从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现的补全,感谢该作者的分享 本文补全的内容为: SVD++中 ...

  9. 矩阵分解模型——SVD与SVD++

    推荐的框架可简单的理解为: 在召回过程中,模型一般使用协同过滤或者深度模型等.协同过滤的方法大致可分为两大类,一类为基于领域的方法,例如User-based CF.Item-based CF,第二类为 ...

最新文章

  1. 一分钟明白各种SQL语句加的什么锁——《深究Mysql锁》
  2. 《移动应用开发》实验报告——轮播图
  3. (MariaDB/MySQL)之DML(2):数据更新、删除
  4. 【译】ES2018 新特性: 正则表达式的 s (dotAll) 标志
  5. 关于编译Lambda时报告返回的为void的错误
  6. Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)
  7. C# Span 源码解读和应用实践
  8. kafka系统设计开篇
  9. js图片压缩java上传,JS实现异步上传压缩图片
  10. 成都睿铂M6Pros近景摄影测量:西安古城墙数字化建设应用介绍
  11. 华为程序员:加了六天班,加班费一万四,网友:还缺人不?我能加到它破产...
  12. vs2008的预编译命令
  13. java Hashtable 和 HashiMap 的区别
  14. 数据库表的建立与基本操作
  15. 综合富贵论坛,富贵网,新老富贵的简单解释
  16. 68dva的相关知识
  17. Python3 parse.urlencode() 与parse.unquote()
  18. vs code修改代码后再次运行,报错:file“<stdin>“,line 1
  19. 2022团体程序设计天梯赛
  20. android studio 引入vitamio,Android Studio对 vitamio 的导入及demo运行

热门文章

  1. .obj文件格式与.mtl文件格式(转)
  2. 2020年教师资格证考试课件百度云网盘地址分享
  3. 关于socket error 10054
  4. shiro漏洞原理以及检测key值原理
  5. 腾讯笔试算法题-开锁
  6. Socket网络编程详解
  7. sklearn中的支持向量机SVM(下)
  8. 汇编语言: 试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不 是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空 格符不存入),直到接收
  9. 工科学术论文书写攻略
  10. JAVA我的世界突然没声音_我的世界电脑版没声音怎么办