python实现推荐系统代码_推荐系统之矩阵分解及其Python代码实现

有如下R(5,4)的打分矩阵:(“-”表示用户没有打分)

其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数

那么,如何根据目前的矩阵R(5,4)如何对未打分的商品进行评分的预测(如何得到分值为0的用户的打分值)?

——矩阵分解的思想可以解决这个问题,其实这种思想可以看作是有监督的机器学习问题(回归问题)。

矩阵R可以近似表示为P与Q的乘积:R(n,m)≈ P(n,K)*Q(K,m)

矩阵分解的过程中,将原始的评分矩阵

分解成两个矩阵

的乘积: 

矩阵P(n,K)表示n个user和K个特征之间的关系矩阵,这K个特征是一个中间变量,矩阵Q(K,m)的转置是矩阵Q(m,K),矩阵Q(m,K)表示m个item和K个特征之间的关系矩阵,这里的K值是自己控制的,可以使用交叉验证的方法获得最佳的K值。为了得到近似的R(n,m),必须求出矩阵P和Q,如何求它们呢?

【方法】

1. 首先令

2. 损失函数:使用原始的评分矩阵

与重新构建的评分矩阵

之间的误差的平方作为损失函数,即:

如果R(i,j)已知,则R(i,j)的误差平方和为:

最终,需要求解所有的非“-”项的损失之和的最小值:

3. 使用梯度下降法获得修正的p和q分量:

求解损失函数的负梯度:

根据负梯度的方向更新变量:

4. 不停迭代直到算法最终收敛(直到sum(e^2) <=阈值)

(Plus:为了防止过拟合,增加正则化项)

【加入正则项的损失函数求解】

1.  首先令

2.  通常在求解的过程中,为了能够有较好的泛化能力,会在损失函数中加入正则项,以对参数进行约束,加入

正则的损失函数为:

也即:

3.  使用梯度下降法获得修正的p和q分量:

求解损失函数的负梯度:

根据负梯度的方向更新变量:

4. 不停迭代直到算法最终收敛(直到sum(e^2) <=阈值)

【预测】利用上述的过程,我们可以得到矩阵

,这样便可以为用户 i 对商品  j 进行打分:

【Python代码实现如下】(基于Python 3.X ;使用正则项)

1 #!/usr/bin/env python

2 #encoding: utf-8

3 __author__ = 'Scarlett'

4 #矩阵分解在打分预估系统中得到了成熟的发展和应用

5 #from pylab import *

6 importmatplotlib.pyplot as plt7 from math importpow8 importnumpy9

10

11 def matrix_factorization(R,P,Q,K,steps=5000,alpha=0.0002,beta=0.02):12 Q=Q.T #.T操作表示矩阵的转置

13 result=[]14 for step inrange(steps):15 for i inrange(len(R)):16 for j inrange(len(R[i])):17 if R[i][j]>0:18 eij=R[i][j]-numpy.dot(P[i,:],Q[:,j]) #.dot(P,Q) 表示矩阵内积

19 for k inrange(K):20 P[i][k]=P[i][k]+alpha*(2*eij*Q[k][j]-beta*P[i][k])21 Q[k][j]=Q[k][j]+alpha*(2*eij*P[i][k]-beta*Q[k][j])22 eR=numpy.dot(P,Q)23 e=024 for i inrange(len(R)):25 for j inrange(len(R[i])):26 if R[i][j]>0:27 e=e+pow(R[i][j]-numpy.dot(P[i,:],Q[:,j]),2)28 for k inrange(K):29 e=e+(beta/2)*(pow(P[i][k],2)+pow(Q[k][j],2))30 result.append(e)31 if e<0.001:32 break

33 returnP,Q.T,result34

35 if __name__ == '__main__':36 R=[37 [5,3,0,1],38 [4,0,0,1],39 [1,1,0,5],40 [1,0,0,4],41 [0,1,5,4]42 ]43

44 R=numpy.array(R)45

46 N=len(R)47 M=len(R[0])48 K=2

49

50 P=numpy.random.rand(N,K) #随机生成一个 N行 K列的矩阵

51 Q=numpy.random.rand(M,K) #随机生成一个 M行 K列的矩阵

52

53 nP,nQ,result=matrix_factorization(R,P,Q,K)54 print("原始的评分矩阵R为:\n",R)55 R_MF=numpy.dot(nP,nQ.T)56 print("经过MF算法填充0处评分值后的评分矩阵R_MF为:\n",R_MF)57

58 #-------------损失函数的收敛曲线图---------------

59

60 n=len(result)61 x=range(n)62 plt.plot(x,result,color='r',linewidth=3)63 plt.title("Convergence curve")64 plt.xlabel("generation")65 plt.ylabel("loss")66 plt.show()

运行结果如下:

损失函数的收敛曲线图:

【代码的GitHub地址】

【Reference】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库分区分表以及读写分离

谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法&#xff0c;做手头的项目以前&#xff0c;只聆听过分区的大名&#xff0c;感觉特神秘&#xff0c;看见某某高手在讨论会上夸夸其谈时&#xff0c;真是骂自己学艺不精&#x…

java第二章_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用做专门用途的字符串(单词)特点&#xff1a;关键字中所有字母都为小写保留字(rese…

JSP Workshop

http://www.cnblogs.com/ITtangtang/p/4126395.html 发现http://www.tutorialspoint.com/里的资料很全也很不错啊&#xff01; 资料&#xff1a;http://www.tutorialspoint.com/jsp/jsp_tutorial.pdf 另外&#xff0c;http://www.runoob.com/jsp/jsp-tutorial.html 中关于JSP…

崇天老师python123测验6_嵩天老师python123测验1: Python基本语法元素 (第1周)

选择题**Guido van Rossum正式对外发布Python版本的年份是&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪…

从链接中获取文件名及扩展名

exeStr [filePath lastPathCompoment];   从链接中读取完整的带后缀文件名称 exeStr [filePath stringByDeleteExtension]; 从链接中读取不带后缀名的文件名称 fileType [filePath pathExtension];       获得链接中文件扩展名&#xff0c;不带"." …

mysql的学习要点_MySQL中的联合索引的学习要点总结

MySQL中的联合索引的学习要点总结联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段&#xff0c;一个查询可以只使用索引中的一部份&#xff0c;但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找&#xff0c;但不…

h5页面不可 移动_H5营销|为什么H5适合于微信营销

随着互联网技术的不断发展&#xff0c;更新在移动互联网时代&#xff0c;网络营销也开始越来越新颖化&#xff0c;而微信H5就是其中的佼佼者。它的出现满足了用户视觉上的审美要求&#xff0c;并且可以使营销方式变得更加的美观整洁&#xff0c;那么这里就有一个问题。为什么微…

input框

input: 输入时与输入框有点距离 padding-left: 5px; 点击时没有浅蓝色的框&#xff1a; outline: none; 设置输入框背景颜色&#xff1a;background: seagreen; 提示语&#xff1a; placeholder"请输入搜索内容" 放在HTML 输入框有图像&#xff1a; background-image…

python3 image_python3 ImageTk 安装方法

标签&#xff1a;使用命令&#xff1a;$ sudo yum search PIL | grep python3可显示得知&#xff1a;python3-dogpile-cache.noarch : A caching front-end based on the Dogpile lock.python3-dogpile-core.noarch : A ‘dogpile‘ lock, typically used as a component ofpyt…

亚太地区数学建模优秀论文_数学建模美赛强势来袭!

01美赛&#xff0c;即美国大学生数学建模竞赛(MCM/ICM)又要来啦&#xff01;赛题内容涉及经济、管理、环境、资源、生态、医学、安全、未来科技等众多领域。竞赛要求三人(本科生)为一组&#xff0c;在四天时间内&#xff0c;就指定的问题完成从建立模型、求解、验证到论文撰写的…

《软件调试》读书笔记:第13章 硬错误和蓝屏

会话管理器进程SMSS.exe是系统启动后的第一个用户态进程&#xff0c;负责启动和监护windows子系统进程&#xff1a;CSRSS.exe和登陆管理进程&#xff1a;WinLogonSMSS.exe从注册表中查询子系统exe文件的位置&#xff0c;并且启动它 CSRSS是windows子系统进程&#xff0c;自NT4以…

java selenium教程_Selenium3 Java自动化测试完整教程

本课程为一个完整的selenium自动化测试实战课程&#xff0c;采用当前**的版本3。学完后可以独立构建起企业级/项目级的自动化测试&#xff0c;从搭建环境、编写脚本、使用框架组织运行脚本与输出报告、及与持续集成工具Jenkins结合达到构建后即测试或指定晚上运行等方式&#x…

信息安全技术网络安全等级保护定级指南_行业标准 |报业网络安全等级保护定级参考指南V2.0发布,明确保护对象、定级要求...

近期&#xff0c;中国新闻技术工作者联合会正式发布《报业网络安全等级保护定级参考指南V2.0》。该指南由中国新闻技术工作者联合会组织网络安全领域的专家、报业技术专家以及业务专家经过多次调研、学习、探讨后&#xff0c;在原《报业网络安全等级保护定级参考指南V1.0》的基…

nRF51822 硬件复位引脚

nRF51822 有一个硬件复位引脚和Debug 口SWDIO是共用的&#xff0c;名字叫做nReset. 实现硬件复位是怎样子的&#xff1a; 1、这个引脚引出来&#xff0c; 2、给这个引脚低电平&#xff0c; 3、从低电平拉到高电平&#xff0c;即复位。 其实就是给这个引脚一个低电平脉冲。 转载…

java点赞功能实现_JavaWeb中点赞功能的实现及完整实例

实现原理1、功能描述&#xff1a;一个用户对同一文章只能点赞一次&#xff0c;第二次就是取消赞2、建立一个点赞表great&#xff0c;字段有文章ID(aid)&#xff0c;点赞用户ID(uid)3、当有用户进行点赞行为时&#xff0c;使用aid和uid搜索点赞表。若有该记录&#xff0c;则表示…

数学作图工具_科研论文作图系列-从PPT到AI (一)

导语&#xff1a;之前的推送中&#xff0c;小编给大家介绍过几款科研作图软件&#xff0c;包括统计分析软件Origin和Prism&#xff0c;图像处理软件ImageJ等等。从本期开始&#xff0c;小编将和大家一起继续学习科研论文作图。重点介绍图像的处理和排版&#xff0c;用到的工具主…

传送图片程序

前言&#xff1a;以C#为程序设计基础&#xff0c;传输大图片&#xff0c;并现实。在过程中&#xff0c;采用套接字&#xff0c;单线程同步机制为例子。需要深化&#xff0c;可以采用异步或者多线程的机制&#xff0c;保障能够顺利执行。具体代码可以到微云下载【链接&#xff1…

java中no1_【Java】-- 网络编程のNo.1

在现有的网络中&#xff0c;网络通讯的方式主要有两种&#xff1a;TCP(传输控制协议)方式UDP(用户数据报协议)方式在网络通讯中&#xff0c;TCP方式就类似于拨打电话&#xff0c;使用该种方式进行网络通讯时&#xff0c;需要建立专门的虚拟连接&#xff0c;然后进行可靠的数据传…

优启通怎么重装系统win10_重装系统失败?小编教你安全给神舟战神GX9 Pro重装win10系统方法...

神舟战神GX9 Pro 上市于2016年1月&#xff0c;虽然现在已经停产&#xff0c;但是还是有不少用户依旧十分喜爱这款笔记本。这款笔记本的性能完全对得起它的售价&#xff0c;很多用户都反馈其比外星人电脑要好。对于爱玩游戏的用户而言&#xff0c;对它17.3英寸的显示屏简直欲罢不…

.NET小细节

1、equals()和运算符的区别 C#中有两种不同的相等&#xff1a;引用相等和值相等。值相等是两个对象包含相同的值&#xff1b;引用相等是两个对象引用的是同一个对象。 “”操作符比较的是两个变量的值是否相等&#xff0c;或两个引用是不是指向同一个内存地址&#xff08;类似比…