当前位置: 首页 > news >正文

python内容推荐算法_python 推荐算法

每个人都会有这样的经历:当你在电商网站购物时,你会看到天猫给你弹出的“和你买了同样物品的人还买了XXX”的信息;当你在SNS社交网站闲逛时,也会看到弹出的“你可能认识XXX“的信息;你在微博添加关注人时,也会看到“你可能对XXX也感兴趣”;等等。

所有这一切,都是背后的推荐算法运作的结果。最经典的关联规则算法是大名鼎鼎的Apriori算法,源自一个超市购物篮的故事:啤酒总是和尿布一起被购买。有兴趣的可以去看看。

本章我们来学习一种最简单的推荐算法:推荐矩阵。虽然简单,但是却被广泛应用着。

1、推荐矩阵

为描述方便,以下我们以“购物推荐”作为背景进行介绍。假设你有个卖商品的网站,拥有每个用户购买每个物品的数据。现在,某个用户A购买了商品a,如何向他推荐他最有可能感兴趣的其他商品呢?

为达到这个目的,通常有两种思路:

1:寻找与该用户(A)购买习惯最为相似的用户(B),认为B购买的物品,A也最有可能感兴趣。

这种情况适用于A已经购买过一些商品,算法能够根据A已经购买的物品作为特征,去匹配与A购买习惯最相近的用户。这种方式是以用户为中心的,推荐出来的商品b可能跟商品a风流马不相及,因此更适合于类似SNS和微博这样的平台,根据用户的已知兴趣集合来向其推荐其他具有相同兴趣的用户;

2:寻找与商品(a)最为相似的商品(b),认为A既然对a感兴趣,也有可能对b感兴趣;

这种情况是以商品为中心的,因此更适合购物推荐这样的场景。

而要计算两个向量“最相似”的程度,有很多方法,如KNN中用到的欧式距离,或者海明距离等。但是欧式距离并不适用于本场合。比如用户A购买了5个商品a,5个商品b,用户B购买了5个商品a,0个商品b,用户C购买了10个商品a,10个商品b,用距离来度量的结果必然是A与B更近。而实际上A跟C是极其相似的。

因此这里,我们介绍皮尔森相关系数(Pearson correlation coefficient)。其定义如下:

20141129222844101

该系数定义的是两个向量的线性相关程度,取值范围为[-1,+1],0表示线性无关,绝对值越大线性相关程度越大,正/负表示正/负线性相关。

简单的给几个例子:

[1,2,3],[4,5,6]:1

[1,2,3],[6,5,4]:-1

[1,2,3],[1,2,4]:0.98

[1,2,3],[-1,-11,-111]:-0.9

皮尔逊相关系数理解:http://www.cnblogs.com/cxscode/p/8496337.html

皮尔逊相关系数的计算(python代码版)

from math import sqrt

def multipl(a,b):

sumofab=0.0

for i in range(len(a)):

temp=a[i]*b[i]

sumofab+=temp

return sumofab

def corrcoef(x,y):

n=len(x)

#求和

sum1=sum(x)

sum2=sum(y)

#求乘积之和

sumofxy=multipl(x,y)

#求平方和

sumofx2 = sum([pow(i,2) for i in x])

sumofy2 = sum([pow(j,2) for j in y])

num=sumofxy-(float(sum1)*float(sum2)/n)

#计算皮尔逊相关系数

den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))

return num/den

x = [0,1,0,3]

y = [0,1,1,1]

print corrcoef(x,y) #0.471404520791

因此,我们将构造一个矩阵来描述用户购买商品的情况,该矩阵以用户为行、商品为列。要计算某个商品a最相似的商品,我们通过计算商品a所在的列与其他的每一列的皮尔森相关系数,找出最大的前N个推荐给用户即可。

2、测试数据

数据为一份简单的购物清单,每一行对应着用户id——商品id这样的数据对。如下图所示:

1 1 3

1 2 3

1 3 3

1 4 1

2 1 1

2 2 1

2 3 1

2 4 1

......

如第一行对应着用户1购买了商品1,数量为3。可以认为该数据是一个稀疏矩阵。该矩阵可视化出来结果如下:

20141129222342062

上图中每一行代表一个用户,每一列代表一个商品,对应的颜色不同表示购买的数量不同,深蓝色表示购买数为0。

从图上很容易看出,用户0与用户1同时购买了商品0,1,2,仅仅数量不一样;而商品0和商品1售出的情况一模一样——只被用户0,1,3,8购买过,看上去就像是捆绑销售的一般。

3、代码与分析

github代码:https://github.com/cxs1994/recommend_system

输出如下:

Buy Item 0, recommond item 3,2,1

Buy Item 1, recommond item 3,2,0

Buy Item 2, recommond item 3,0,1

Buy Item 3, recommond item 0,1,5

Buy Item 4, recommond item 6,7,8

Buy Item 5, recommond item 0,1,3

Buy Item 6, recommond item 4,7,8

Buy Item 7, recommond item 4,8,6

Buy Item 8, recommond item 4,7,6

time spent: 1.9111089706420898

代码中,我们计算了每一个Item与其他所有item的相关性,然后排序选取最大的前3个作为推荐。

最需要注意的是,真正的应用中,大量的用户与大量的商品之间建立矩阵,计算量是巨大的。从皮尔森相关系数的定义来看,其计算量也是巨大的。因此代码中给了luispedro提供的一种计算相关系数的替换函数,效率能提高不少。

相关文章:

如何理解皮尔逊相关系数(Pearson Correlation Coefficient)?:https://segmentfault.com/q/1010000000094674

知乎:如何理解皮尔逊相关系数(Pearson Correlation Coefficient):https://www.zhihu.com/question/19734616

皮尔逊相关系数的计算(python代码版):https://www.cnblogs.com/ryuham/p/4764015.html

用Python开始机器学习(9:推荐算法之推荐矩阵):http://blog.csdn.net/fishineye/article/details/69502068

利用python实现电影推荐:http://blog.csdn.net/elecjack/article/details/50913776

相关文章:

  • 新闻类app页面使用说明书_【好物推荐】备忘录类APP“知了清单”深度使用体验...
  • grep 与条件_【命令解析】Linux系统 grep命令用法详解
  • 左斜杠和右斜杠有什么区别_优先通行权中右方来车先行,右转弯让左转弯,为什么呢?...
  • matlab lu分解求线性方程组_计算方法(三)平方根法及其改进解线性方程组
  • python chdir_Python os.chdir()用法及代码示例
  • python工业应用_python工业互联网应用实战3—模型层构建
  • python删除首行_python 删除文件首行或指定行(修改文件)
  • python蟒蛇绘制加眼睛_python蟒蛇绘制 - osc_sm6rxbzs的个人空间 - OSCHINA - 中文开源技术交流社区...
  • 4n35光耦引脚图_数字隔离器的演进推动了光耦合器的替换进程
  • c# combobox集合数据不显示_使用C#开发第一个应用程序
  • cmd运行jar包报错找不到主类_jar包天天见,可是你知道它的运行机制吗?
  • qt tcp通信_(7)基于TCP/IP的网络通信应用程序(TCPClient)
  • jwt token长度限制_OAUTH.令牌存储介绍以及JWT实现强制登出、登录个数控制
  • 空间日志代码_蚂蚁金服研发框架日志隔离解析 | SOFABoot 框架剖析
  • c语言音乐小星星代码_慧编程:编程小课堂NO.1——代码也能唱歌!
  • CSS 专业技巧
  • Java到底能干嘛?
  • js 实现textarea输入字数提示
  • leetcode46 Permutation 排列组合
  • Linux下的乱码问题
  • mysql 5.6 原生Online DDL解析
  • Python利用正则抓取网页内容保存到本地
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • springMvc学习笔记(2)
  • 彻底搞懂浏览器Event-loop
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从PHP迁移至Golang - 基础篇
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端之React实战:创建跨平台的项目架构
  • 前端知识点整理(待续)
  • 通过git安装npm私有模块
  • 小程序开发中的那些坑
  • 学习ES6 变量的解构赋值
  • 一个完整Java Web项目背后的密码
  • 与 ConTeXt MkIV 官方文档的接驳
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 再谈express与koa的对比
  • 《天龙八部3D》Unity技术方案揭秘
  • 国内开源镜像站点
  • ​iOS安全加固方法及实现
  • ​业务双活的数据切换思路设计(下)
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (强烈推荐)移动端音视频从零到上手(上)
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)LINQ之路
  • (转)Oracle存储过程编写经验和优化措施
  • (转)原始图像数据和PDF中的图像数据
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算