近期在看CF的相关论文,《Collaborative Filtering for Implicit Feedback Datasets》思想非常好,非常easy理解。可是从目标函数

是怎样推导出Xu和Yi的更新公式的推导过程却没有非常好的描写叙述。所以以下写一下
推导:
首先对Xu求导:

当中Y是item矩阵,n*f维,每一行是一个item_vec,C^u是n*n维的对角矩阵。
对角线上的每个元素是c_ui,P(u)是n*1的列向量,它的第i个元素为p_ui。
然后令导数=0,可得:

因为x_u和y_i在目标函数中是对称的。所以非常easy得到:

当中X是user矩阵,m*f维度,每一行是一个user_vec,C^i是m*m的对角矩阵。对角线上的每个元素是c_ui。P(i)是m*1的列向量。它的第u和元素是p_ui
然后令导数=0,可得:

以下是论文算法思想的Python实现:

import numpy as np
import scipy.sparse as sparse
from scipy.sparse.linalg import spsolve
import timedef load_matrix(filename, num_users, num_items):t0 = time.time()counts = np.zeros((num_users, num_items))total = 0.0num_zeros = num_users * num_items'''假设要对一个列表或者数组既要遍历索引又要遍历元素时。能够用enumerate,当传入參数为文件时,索引为行号,元素相应的一行内容'''for i, line in enumerate(open(filename, 'r')): #strip()去除最前面和最后面的空格user, item, count = line.strip().split('\t')user = int(user)item = int(item)count = float(count)if user >= num_users:continueif item >= num_items:continueif count != 0:counts[user, item] = counttotal += countnum_zeros -= 1if i % 100000 == 0:print 'loaded %i counts...' % i#数据导入完成后计算稀疏矩阵中零元素个数和非零元素个数的比例,记为alphaalpha = num_zeros / totalprint 'alpha %.2f' % alphacounts *= alpha#用CompressedSparse Row Format将稀疏矩阵压缩counts = sparse.csr_matrix(counts)t1 = time.time()print 'Finished loading matrix in %f seconds' % (t1 - t0)return countsclass ImplicitMF():def __init__(self, counts, num_factors=40, num_iterations=30,reg_param=0.8):self.counts = countsself.num_users = counts.shape[0]self.num_items = counts.shape[1]self.num_factors = num_factorsself.num_iterations = num_iterationsself.reg_param = reg_paramdef train_model(self):#创建user_vectors和item_vectors,他们的元素~N(0,1)的正态分布self.user_vectors = np.random.normal(size=(self.num_users,self.num_factors))self.item_vectors = np.random.normal(size=(self.num_items,self.num_factors))'''要生成非常大的数字序列的时候,用xrange会比range性能优非常多,因为不须要一上来就开辟一块非常大的内存空间,这两个基本上都是在循环的时候用'''for i in xrange(self.num_iterations):t0 = time.time()print 'Solving for user vectors...'self.user_vectors = self.iteration(True, sparse.csr_matrix(self.item_vectors))print 'Solving for item vectors...'self.item_vectors = self.iteration(False, sparse.csr_matrix(self.user_vectors))t1 = time.time()print 'iteration %i finished in %f seconds' % (i + 1, t1 - t0)def iteration(self, user, fixed_vecs):#相当于C的三木运算符。if user=True num_solve = num_users,反之为num_itemsnum_solve = self.num_users if user else self.num_itemsnum_fixed = fixed_vecs.shape[0]YTY = fixed_vecs.T.dot(fixed_vecs)eye = sparse.eye(num_fixed)lambda_eye = self.reg_param * sparse.eye(self.num_factors)solve_vecs = np.zeros((num_solve, self.num_factors))t = time.time()for i in xrange(num_solve):if user:counts_i = self.counts[i].toarray()else:#假设要求item_vec,counts_i为counts中的第i列的转置counts_i = self.counts[:, i].T.toarray()''' 原论文中c_ui=1+alpha*r_ui,可是在计算Y’CuY时为了减少时间复杂度,利用了Y'CuY=Y'Y+Y'(Cu-I)Y,因为Cu是对角矩阵,其元素为c_ui,即1+alpha*r_ui。所以Cu-I也就是对角元素为alpha*r_ui的对角矩阵'''CuI = sparse.diags(counts_i, [0])pu = counts_i.copy()#np.where(pu != 0)返回pu中元素不为0的索引,然后将这些元素赋值为1,不知道这里为什么要赋值为1?pu[np.where(pu != 0)] = 1.0YTCuIY = fixed_vecs.T.dot(CuI).dot(fixed_vecs)YTCupu = fixed_vecs.T.dot(CuI + eye).dot(sparse.csr_matrix(pu).T)xu = spsolve(YTY + YTCuIY + lambda_eye, YTCupu)solve_vecs[i] = xuif i % 1000 == 0:print 'Solved %i vecs in %d seconds' % (i, time.time() - t)t = time.time()return solve_vecs

Alternating Least Squares(ASL) for Implicit Feedback Datasets的数学推导以及用Python实现相关推荐

  1. Collaborative Filtering for Implicit Feedback Datasets结论公式推导

    Collaborative Filtering for Implicit Feedback Datasets[1]公式推导 精确反馈的模型 min⁡x∗,y∗∑ru,iis known(ru,i−xu ...

  2. 【论文阅读】 BPR: Bayesian Personalized Ranking from Implicit Feedback

    BPR: Bayesian Personalized Ranking from Implicit Feedback 论文链接:https://arxiv.org/abs/1205.2618 Abstr ...

  3. 论文笔记二 Positive, Negative and Neutral: Modeling Implicit Feedback inSession-based News Recommendatio。

    目录 一  论文简介 论文名称 :Positive, Negative and Neutral: Modeling Implicit Feedback in 中文名称:积极.消极和中立:在基于会话的新 ...

  4. BPR: Bayesian Personalized Ranking from Implicit Feedback 论文笔记

    有什么问题欢迎讨论呀! 论文标题:BPR: Bayesian Personalized Ranking from Implicit Feedback BPR 主要采用用户的隐式反馈(如点击.收藏等), ...

  5. 论文笔记:BPR-Bayesian Personalized Ranking from Implicit Feedback | 推荐系统BPR算法分析

    BPR:Bayesian Personalized Ranking from Implicit Feedback 论文链接:BPR:Bayesian Personalized Ranking from ...

  6. implicit feedback

    在推荐系统的paper中经常出现的一个词是implicit feedback,中文是隐式反馈. 对于推荐系统的数据来说,一般分为显式反馈和隐式反馈. 显式反馈就是用户对item的打分.例如按照评分1- ...

  7. 【论文阅读+实现】BPR: Bayesian Personalized Ranking from Implicit Feedback

    1.BPR是什么? BPR 的全称是贝叶斯个性化排序(Bayesian Personalized Ranking),它是一种排序算法,做的是TopN任务. 适用于隐性反馈数据,当然显性反馈数据把评分变 ...

  8. 【论文阅读】BPR: Bayesian personalized ranking from implicit feedback

    Rendle S, Freudenthaler C, Gantner Z, et al. BPR: Bayesian personalized ranking from implicit feedba ...

  9. 论文翻译-Denoising Implicit Feedback for Recommendation

    去噪内隐反馈 ABSTRACT 内隐反馈的普遍性使它们成为构建在线推荐系统的默认选择.虽然大量的隐式反馈减轻了数据的稀疏性问题,但缺点是它们在反映用户的实际满意度方面没有那么干净.例如,在电子商务中, ...

最新文章

  1. lftp 4.4.0 发布,命令行的FTP工具
  2. 计算机网络第五章:运输层
  3. Sencha Touch 笔记
  4. 3. 回归的线性模型(2)
  5. Python爬虫入门教程 1-100 CentOS环境安装
  6. boost::fusion::push_back用法的测试程序
  7. aws创建html网页,AWS: 在AWS上创建一个网站,综合运用(Lambda + Api Gateway + Dynamodb + S3)...
  8. phpstudy mysql端口_完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存...
  9. sonyflake.go
  10. Android深入浅出之Binder机制(转)
  11. java控制器_Java用户界面 模型-视图-控制器(MVC)模式
  12. kettle清洗mysql数据_ETL工具Kettle使用以及与Java整合实现数据清洗
  13. java-第十章-类和对象-创建管理员对象
  14. 极光推送java服务器端_极光推送服务器端(JAVA)
  15. 思科模拟器去除登陆界面
  16. python类似图片查找_python检测相似图片
  17. 计算思维,工程思维,数学思维的思考
  18. iOS Safari调试webview时 页面空白或者闪退解决
  19. Apollo 3.0来了!百度自动驾驶硬件系统全解读
  20. 【excel】三维地图演示

热门文章

  1. Spring中的注解@Service @Component @Controller @Repository区别
  2. Symantec Backup Exec Remote Agent 2010在Redhat Enterprise 6.6上启动问题
  3. ListItem.Update与ListItem.SystemUpdate
  4. SqlServer_Case_When用法
  5. ToString()的格式设置
  6. python人工智能基础课免费_【领卡免费学】Python基础课(完整大课)
  7. Python练习1-文档格式化成html
  8. hdu3472 混合欧拉
  9. 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
  10. 【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )