文章主要介绍的是koren 08年发的论文[1],  2.1 部分内容(其余部分会陆续补充上来)。

koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长。考虑到写文章目地主要是已介绍总结方法为主,所以采用Movielens 数据集。

要用到的变量介绍:

Baseline estimates

     

object function:

梯度变化(利用stochastic gradient descent算法使上述的目标函数值,在设定的迭代次数内,降到最小)

系统评判标准:

参数设置:

迭代次数maxStep = 100, 学习速率(梯度变化速率)取0.99  还有的其他参数设置参考引用论文[2]

具体的代码实现

  1. '''''
  2. Created on Dec 11, 2012
  3.  
  4. @Author: Dennis Wu
  5. @E-mail: hansel.zh@gmail.com
  6. @Homepage: http://blog.csdn.net/wuzh670
  7.  
  8. Data set download from : http://www.grouplens.org/system/files/ml-100k.zip
  9.  
  10. '''
  11. from operator import itemgetter, attrgetter
  12. from math import sqrt
  13. import random
  14.  
  15. def load_data():
  16.  
  17. train = {}
  18. test = {}
  19.  
  20. filename_train = 'data/ua.base'
  21. filename_test = 'data/ua.test'
  22.  
  23. for line in open(filename_train):
  24. (userId, itemId, rating, timestamp) = line.strip().split('\t')
  25. train.setdefault(userId,{})
  26. train[userId][itemId] = float(rating)
  27.  
  28. for line in open(filename_test):
  29. (userId, itemId, rating, timestamp) = line.strip().split('\t')
  30. test.setdefault(userId,{})
  31. test[userId][itemId] = float(rating)
  32.  
  33. return train, test
  34.  
  35. def calMean(train):
  36. sta = 0
  37. num = 0
  38. for u in train.keys():
  39. for i in train[u].keys():
  40. sta += train[u][i]
  41. num += 1
  42. mean = sta*1.0/num
  43. return mean
  44.  
  45. def initialBias(train, userNum, movieNum):
  46.  
  47. mean = calMean(train)
  48. bu = {}
  49. bi = {}
  50. biNum = {}
  51. buNum = {}
  52.  
  53. u = 1
  54. while u < (userNum+1):
  55. su = str(u)
  56. for i in train[su].keys():
  57. bi.setdefault(i,0)
  58. biNum.setdefault(i,0)
  59. bi[i] += (train[su][i] - mean)
  60. biNum[i] += 1
  61. u += 1
  62.  
  63. i = 1
  64. while i < (movieNum+1):
  65. si = str(i)
  66. biNum.setdefault(si,0)
  67. if biNum[si] >= 1:
  68. bi[si] = bi[si]*1.0/(biNum[si]+25)
  69. else:
  70. bi[si] = 0.0
  71. i += 1
  72.  
  73. u = 1
  74. while u < (userNum+1):
  75. su = str(u)
  76. for i in train[su].keys():
  77. bu.setdefault(su,0)
  78. buNum.setdefault(su,0)
  79. bu[su] += (train[su][i] - mean - bi[i])
  80. buNum[su] += 1
  81. u += 1
  82.  
  83. u = 1
  84. while u < (userNum+1):
  85. su = str(u)
  86. buNum.setdefault(su,0)
  87. if buNum[su] >= 1:
  88. bu[su] = bu[su]*1.0/(buNum[su]+10)
  89. else:
  90. bu[su] = 0.0
  91. u += 1
  92.  
  93. return bu,bi,mean
  94.  
  95. def sgd(train, test, userNum, movieNum):
  96.  
  97. bu, bi, mean = initialBias(train, userNum, movieNum)
  98.  
  99. alpha1 = 0.002
  100. beta1 = 0.1
  101. slowRate = 0.99
  102. step = 0
  103. preRmse = 1000000000.0
  104. nowRmse = 0.0
  105. while step < 100:
  106. rmse = 0.0
  107. n = 0
  108. for u in train.keys():
  109. for i in train[u].keys():
  110. pui = 1.0 * (mean + bu[u] + bi[i])
  111. eui = train[u][i] - pui
  112. rmse += pow(eui,2)
  113. n += 1
  114. bu[u] += alpha1 * (eui - beta1 * bu[u])
  115. bi[i] += alpha1 * (eui - beta1 * bi[i])
  116.  
  117. nowRmse = sqrt(rmse*1.0/n)
  118. print 'step: %d Rmse: %s' % ((step+1), nowRmse)
  119. if (nowRmse < preRmse):
  120. preRmse = nowRmse
  121. alpha1 *= slowRate
  122. step += 1
  123. return bu, bi, mean
  124.  
  125. def calRmse(test, bu, bi, mean):
  126.  
  127. rmse = 0.0
  128. n = 0
  129. for u in test.keys():
  130. for i in test[u].keys():
  131. pui = 1.0 * (mean + bu[u] + bi[i])
  132. eui = pui - test[u][i]
  133. rmse += pow(eui,2)
  134. n += 1
  135. rmse = sqrt(rmse*1.0 / n)
  136. return rmse;
  137.  
  138. if __name__ == "__main__":
  139.  
  140. # load data
  141. train, test = load_data()
  142.  
  143. # baseline + stochastic gradient descent
  144. bu, bi, mean = sgd(train, test, 943, 1682)
  145.  
  146. # compute the rmse of test set
  147. print 'the Rmse of test test is: %s' % calRmse(test, bu, bi, mean)

实验结果

REFERENCES

1.Y. Koren. Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model. Proc. 14th ACM SIGKDD Int. Conf. On Knowledge Discovery and Data Mining  (KDD’08), pp. 426–434, 2008.

2. Y.Koren.  The BellKor Solution to the Netflix Grand Prize  2009

基于baseline和stochastic gradient descent的个性化推荐系统的更多相关文章

  1. 基于baseline、svd和stochastic gradient descent的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.3部分内容(其余部分会陆续补充上来).koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长.考虑到写文章目 ...

  2. FITTING A MODEL VIA CLOSED-FORM EQUATIONS VS. GRADIENT DESCENT VS STOCHASTIC GRADIENT DESCENT VS MINI-BATCH LEARNING. WHAT IS THE DIFFERENCE?

    FITTING A MODEL VIA CLOSED-FORM EQUATIONS VS. GRADIENT DESCENT VS STOCHASTIC GRADIENT DESCENT VS MIN ...

  3. Stochastic Gradient Descent

    一.从Multinomial Logistic模型说起 1.Multinomial Logistic 令为维输入向量; 为输出label;(一共k类); 为模型参数向量: Multinomial Lo ...

  4. Stochastic Gradient Descent 随机梯度下降法-R实现

    随机梯度下降法  [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 批量梯度下降法在权值更新前对所有样本汇总 ...

  5. 机器学习-随机梯度下降(Stochastic gradient descent)

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  6. 几种梯度下降方法对比(Batch gradient descent、Mini-batch gradient descent 和 stochastic gradient descent)

    https://blog.csdn.net/u012328159/article/details/80252012 我们在训练神经网络模型时,最常用的就是梯度下降,这篇博客主要介绍下几种梯度下降的变种 ...

  7. Stochastic Gradient Descent收敛判断及收敛速度的控制

    要判断Stochastic Gradient Descent是否收敛,可以像Batch Gradient Descent一样打印出iteration的次数和Cost的函数关系图,然后判断曲线是否呈现下 ...

  8. Gradient Descent 和 Stochastic Gradient Descent(随机梯度下降法)

    Gradient Descent(Batch Gradient)也就是梯度下降法是一种常用的的寻找局域最小值的方法.其主要思想就是计算当前位置的梯度,取梯度反方向并结合合适步长使其向最小值移动.通过柯 ...

  9. 随机梯度下降法(Stochastic gradient descent, SGD)

    BGD(Batch gradient descent)批量梯度下降法:每次迭代使用所有的样本(样本量小)    Mold 一直在更新 SGD(Stochastic gradientdescent)随机 ...

随机推荐

  1. 最大流——hdu4292(类似poj3281 带间隔的流)

    #include<bits/stdc++.h> using namespace std; #define maxn 100005 #define inf 0x3f3f3f3f ]; int ...

  2. duilib教程之duilib入门简明教程8.完整的自绘标题栏

    看了前面那么多教程,相信对duilib已有基本映像了,我们就快马加鞭,做出一个完整的自绘标题栏吧~    看到下面这个效果图,小伙伴们是不是有点惊呆了呢~O(∩_∩)O~      duilib实现以 ...

  3. 框架前期准备篇之AutoFac常见用法总结 转载

    框架前期准备篇之AutoFac常见用法总结 一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点 ...

  4. python编码(31-01)

    以什么方式编码,就以什么方式解码! 第一种编码与解码方式: encode()编码 decode()解码 type()查看数据类型 repr()查看数据内容 s = '你好'print(type(s)) ...

  5. Java学习之Java历史版本

    Java有三个版本,标准版Java SE,企业版Java EE,移动版Java ME.按理来说,每一种版本都会有自己的版本号,但是约定俗成:JDK版本号=Java SE版本号=Java版本号,这是因为 ...

  6. Python接口测试框架实战与自动化进阶✍✍✍

    Python接口测试框架实战与自动化进阶  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看 ...

  7. Python自学--part1

    概要 Python介绍 Python安装 Hello World程序 变量 字符编码 用户输入 pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式while 循环 表达 ...

  8. <Python基础>集合的基本操作

    #小知识点:返回对象的内存地址 i,j = 1,2 print(id(i),id(j)) #集合的基本操作, #相当于没有键值对的字典,里面的元素是无序且不重复的 #一般写法 s = set({1,2 ...

  9. git使用中的问题

    一.github ssh_exchange_identification: read: Connection reset by peer 和电脑环境有关,检查防火墙关了没有,是不是杀毒软件.安全卫士的 ...

  10. css 图片波浪效果

    参考:https://blog.csdn.net/zhichaosong/article/details/80944924#_99 效果: wave2.png html: <!DOCTYPE h ...