SGD实现推荐系统

对数据集movie ml-100k

有用户,电影,评分,时间戳四个数据字段, 以用户-电影组成的评分矩阵R,可以用SVD方法转化成两个因子矩阵P,Q ,用两个因子的乘积R‘来作为原先矩阵的近似,R由于用户看的电影数目及一个电影所能吸引用户的数量,决定了R是稀疏的,然而R‘是R的近似,相对于R是稠密的,因而可以通过减小他们之间的误差来计算得到R‘,进而对于没有看过某类电影的用户给个预估分,这就能直观的看出用户对于电影的兴趣,进而考虑是否推荐

首先是最小化目标函数

def prediction(P,Q):
    return np.dot(P.T,Q)

lmbda = 0.1
k = 20
m, n = R.shape  # R是由用户-电影组成的评分矩阵 训练集
n_epochs = 100  # 迭代数
gamma=0.01  

P = 3 * np.random.rand(k,m) # 对P,Q 随机取初始值
Q = 3 * np.random.rand(k,n) 

# 计算RMSE
def rmse(I,R,Q,P):
    return np.sqrt(np.sum((I * (R - prediction(P,Q)))**2)/len(R[R > 0]))
#存储误差,可用matplotlib画图显示误差变化
train_errors = []
test_errors = []

users,items = R.nonzero()
for epoch in xrange(n_epochs):
    for u, i in zip(users,items):
        e = R[u, i] - prediction(P[:,u],Q[:,i])  # 公式5
        P[:,u] += gamma * ( e * Q[:,i] - lmbda * P[:,u]) # 公式4
        Q[:,i] += gamma * ( e * P[:,u] - lmbda * Q[:,i])  # 公式3
    train_rmse = rmse(I,R,Q,P) # I表示与R相同规模的矩阵,R的元素不为0时相应位置为1,为0置为0
    test_rmse = rmse(I2,T,Q,P) # T为R一样,是测试集
    train_errors.append(train_rmse)
    test_errors.append(test_rmse)  

  

时间: 2024-10-28 10:58:13

SGD实现推荐系统的相关文章

推荐系统相关算法

摘要: 热门推荐 协同过滤算法 矩阵分解 基于内容的推荐(文本,标签,特征/profile)   基于图的算法 内容: 热门推荐: 热门推荐本质上是一个排行榜,可能会考虑到时间衰减,商品的销量/流行度,好评,差评等因素,对于新用户引导有一定的作用,但是并不是一个个性化的算法 以下是一些热门排名的公式实现: 1 def hacker_news_rank( ): 2 #参考自http://www.oschina.net/news/43456/how-hacker-news-ranking-algor

推荐系统——(一)经典论文文献及业界应用

转: http://www.360doc.com/content/14/0315/11/14268060_360747574.shtml http://semocean.com/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E7%BB%8F%E5%85%B8%E8%AE%BA%E6%96%87%E6%96%87%E7%8C%AE%E5%8F%8A%E8%B5%84%E6%96%99/ 列了一些之前设计开发百度关键词搜索推荐引擎时, 参考过的论文, 书籍, 以及调研过的

TOP 10开源的推荐系统简介

最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature.LibMF.LibFM等,也有重量级的适用于工业系统的 Mahout.Oryx.EasyRecd等,供大家参考.PS:这里的top 10仅代表个人观点. #1.SVDFeature 主页:http://svdfeature.apexlab.org/wiki/Main_Page 语言:C++一个feature-based协同过滤和排序工具,由上海交大Apex实验室开发,代码质量较高.在

开源的推荐系统

我收集和整理的目前互联网上所能找到的知名开源推荐系统(open source project for recommendation system),并附上了个人的一些简单点评(未必全面准确), 这方面的中文资料很少见,希望对国内的朋友了解掌握推荐系统有帮助 陈运文 SVDFeature 由上海交大的同学开发的,C++语言,代码质量很高 .去年我们参加KDD竞赛时用过,非常好用,而且出自咱们国人之手,所以置顶推荐! 项目地址: http://svdfeature.apexlab.org/wiki/

10款开源的推荐系统简介

最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature.LibMF.LibFM等,也有重量级的适用于工业系统的 Mahout.Oryx.EasyRecd等,供大家参考.PS:这里的top 10仅代表个人观点. 1.SVDFeature 主页:http://svdfeature.apexlab.org/wiki/Main_Page 语言:C++ 一个feature-based协同过滤和排序工具,由上海交大Apex实验室开发,代码质量较高.在

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石. 矩阵分解根据用户对物品的评分, 推断出用户和物品的隐语义向量, 然后根据用户和物品的隐语义向量来进行推荐. 推荐系统用到的数据可以有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常非常稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵. 1. 基本矩阵分解 矩阵分

推荐系统开源软件列表汇总和点评(转载)

我收集和整理的目前互联网上所能找到的知名开源推荐系统(open source project for recommendation system),并附上了个人的一些简单点评(未必全面准确), 这方面的中文资料很少见,希望对国内的朋友了解掌握推荐系统有帮助 陈运文 SVDFeature 由上海交大的同学开发的,C++语言,代码质量很高 .去年我们参加KDD竞赛时用过,非常好用,而且出自咱们国人之手,所以置顶推荐! 项目地址: http://svdfeature.apexlab.org/wiki/

TOP 10 开源的推荐系统简介

最 近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature.LibMF.LibFM等,也有重 量级的适用于工业系统的 Mahout.Oryx.EasyRecd等,供大家参考.PS:这里的top 10仅代表个人观点. #1.SVDFeature 主页:http://svdfeature.apexlab.org/wiki/Main_Page 语言:C++一个feature-based协同过滤和排序工具,由上海交大Apex实验室开发,代码质量较高

因子分解机FM原理及SGD训练

1.背景 Steffen Rendle于2010年提出Factorization Machines(下面简称FM),并发布开源工具libFM.FM的提出主要对比对象是SVM,与SVM相比,有如下几个优势 (1)对于输入数据是非常稀疏(比如自动推荐系统),FM可以,而SVM会效果很差,因为训出的SVM模型会面临较高的bias. (2)FMs拥有线性的复杂度, 可以通过 primal 来优化而不依赖于像SVM的支持向量机. 2.模型 2-way FM(degree = 2)是FM中具有代表性,且比较