前言

在生活中,我们经常给朋友推荐一些自己喜欢的东西,也时常接受别人的推荐。怎么能保证推荐的电影或者美食就是朋友喜欢的呢?一般来说,你们两个人经常对同一个电影或者美食感兴趣,那么你喜欢的东西就很大程度上朋友也会比较感兴趣。在大数据的背景下,算法会帮我寻找兴趣相似的那些人,并关注他们喜欢的东西,以此来给我们推荐可能喜欢的事物。

场景描述

某外卖店铺收集了一些用户对本店铺美食的评价和推荐分,并计划为一些新老客户推荐他们未曾尝试的美食。

数据分析

A  B  C  D  E  F  G  H  I  J  K
0[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],1[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],2[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],3[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],4[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],5[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],6[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],7[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],8[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],9[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]

横轴为美食品种,分为A--K 11中,竖轴为用户序号,有0-9 10个人。表内值为某个用户对某种美食的推荐分,0表示其未曾吃过,5分为最高的推荐分。以上数据为实验虚构数据。

场景抽象化

给定一个用户i,我们根据上面的数据为其推荐N个推荐分最高的美食。

模型选择

协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。

我们也将采用协同过滤来实现商品推荐,并在下面的章节一步步实现基于协同过滤的商品推荐系统。

数据处理

以上数据,不存在缺失和无意义推荐分,即不超出范围,格式正确。

搭建环境

  • 首先进入noteBook建模,链接

  • 然后创建新实例

  • 之后打开实例

现在基础环境以及搞定了,我们可以用terminal安装自己需要的包环境。同时可以选择python2或者python3的开发环境。而且左侧的文件系统,支持本地文件的上传下载等。

相似度计算

在推荐系统中,我们需要计算两个人或商品的相似度,我们可以采用余弦相似度,皮尔逊相关系数等。

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,表示完全一样,而其他任何角度的余弦值都不大于1;并且其最小值是-1,相似度为0。

皮尔逊相关系数( Pearson correlation coefficient),是用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。

新建文件recom.py,实现相似度计算函数

def cosSim(inA,inB):num = float(inA.T*inB)denom = la.norm(inA)*la.norm(inB)return 0.5+0.5*(num/denom)

推荐分计算

在文件recom.py,实现推荐分计算

#dataMat 用户与美食的矩阵
#user 用户序号
#simMeas 相似度算法
#item 美食商品def standEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]#商品数simTotal = 0.0; ratSimTotal = 0.0for j in range(n):#所有商品,遍历userRating = dataMat[user,j]#user对该商品的推荐分if userRating == 0: continue#如果user 未推荐该商品则过滤#logical_and逻辑与,nonzero非零判断,overLap为均为商品item,j推荐的用户overLap = nonzero(logical_and(dataMat[:,item].A>0, \dataMat[:,j].A>0))[0]if len(overLap) == 0: similarity = 0#以此overLap,计算两商品的相似度。else: similarity = simMeas(dataMat[overLap,item], \dataMat[overLap,j])print('the %d and %d similarity is: %f' % (item, j, similarity))simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: return ratSimTotal/simTotal

对于特征向量非常稀疏,或者特征之间关联关系明显,协方差较大则需要对原有维度的特征进行降维。这样既可以节省资源加快运算,也可以避免冗余特征带来的干扰。

def svdEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0; ratSimTotal = 0.0U,Sigma,VT = la.svd(dataMat) #奇异值分解Sig4 = mat(eye(4)*Sigma[:4]) #构建对角矩阵xformedItems = dataMat.T * U[:,:4] * Sig4.I  #数据维度转换for j in range(n):userRating = dataMat[user,j]if userRating == 0 or j==item: continuesimilarity = simMeas(xformedItems[item,:].T,\xformedItems[j,:].T)print('the %d and %d similarity is: %f' % (item, j, similarity))simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: return ratSimTotal/simTotal

通过计算待推荐商品与已推荐商品的相似度,并乘以该用户对已推荐商品的推荐分,来计算待推荐商品的推荐分。

在文件recom.py,加入recommend函数

#dataMat 用户与美食的矩阵
#user 用户序号
#N 推荐前N个商品
#simMeas 相似度计算算法
#estMethod 推荐分计算算法def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):#找出user未评分的商品unratedItems = nonzero(dataMat[user,:].A==0)[1]#find unrated items if len(unratedItems) == 0: return 'you rated everything'itemScores = []#依次计算这些商品的推荐分for item in unratedItems:estimatedScore = estMethod(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))#返回前N个较好分的结果return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]

算法演示

如果是本地编辑的文件,可以通过文件上传方式上传到服务器。

  • 新建noteBook演示

  • 加载算法模板

  • 数据展示

  • 为序号为2的用户推荐商品

总结

通常在计算相似度之前,我们需要确定是计算基于商品的相似度(上面的方式),还是计算基于用户的相似度。在现实情况下,我们要根据用户和商品的数据决定选择哪种计算方式。同时,在数据量变大时,我们通常需要先降维,在做商品推荐。部分代码参考《机器学习实战》,本篇文章主要介绍如何使用PAI-DSW实现算法实验。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

【机器学习PAI实战】—— 玩转人工智能之美食推荐相关推荐

  1. 【机器学习PAI实战】—— 玩转人工智能之综述

    摘要: 基于人工智能火热的大背景下,通过阿里云的机器学习平台PAI在真实场景中的应用,详细阐述相关算法及使用方法,力求能够让读者读后能够马上动手利用PAI搭建属于自己的机器学习实用方案,真正利用PAI ...

  2. 【机器学习PAI实战】—— 玩转人工智能之你最喜欢哪个男生?

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 分类问题是生活中最常遇到的问题之一.普通人在做出选择之前,可能会犹豫不决,但对机器而言,则是唯一必选的问题.我们可以通 ...

  3. 【机器学习PAI实战】—— 玩转人工智能之你最喜欢哪个男生?...

    模型训练与在线预测服务.推荐算法四部曲.机器学习PAI实战.更多精彩,尽在开发者分会场 [机器学习PAI实战]-- 玩转人工智能之综述 [机器学习PAI实战]-- 玩转人工智能之商品价格预测 [机器学 ...

  4. 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像...

    模型训练与在线预测服务.推荐算法四部曲.机器学习PAI实战.更多精彩,尽在 开发者分会场 [机器学习PAI实战]-- 玩转人工智能之综述 [机器学习PAI实战]-- 玩转人工智能之商品价格预测 [机器 ...

  5. 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像

    前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP.CV.物联网.无人机等多个领域都发挥了非常重要的作用.最近几年,各种深度学习算法层出不穷, Generative Adverarial Ne ...

  6. Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...

  7. 使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户、物品的协同过滤推荐算法实现 大数据、人工智能、机器学习项目开发

    使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户.物品的协同过滤推荐算法实现 大数据.人工智能.机器学习项目开发Fo ...

  8. Java语言开发在线美食推荐网 美食推荐系统 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis框架 人工智能、大数据、机器学习项目开发

    Java语言开发在线美食推荐网 美食推荐系统 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis框架 人工智能.大数据.机器学习项目开发FoodRecomm ...

  9. 玩转人工智能中的机器学习之学习路线

    机器学习的学习路线如图 3-14所示,供读者参考.首先,可以选择一本较为简单的入门教材打好基础,然后从提高的教材中再选一本进行学习,最后再根据自己的具体研究领域选择进阶的教材进行学习.比如,如果你从事 ...

最新文章

  1. DotNetBar12.1新控件——TokenEditor
  2. C#windows向窗体传递泛型类
  3. SQL Server : 如何让每次备份的目标文件文件名不一样
  4. mariadb数据库备份与恢复
  5. 【原创】分布式之redis复习精讲
  6. 以太坊是什么鬼?!媲美比特币的加密币大揭秘
  7. ArcGIS制图表达Representation实战篇3-控制点
  8. jquery 获取指定元素
  9. Atitit 网关协议cgi wsgi fcgi fastcgi 目录 1.1. CGI(common gateway unterface) 1 1.2. 2.1 WSGI: 1 1.3. 2.3
  10. c语言清华大学谭浩强笔记,(完整)C语言谭浩强学习笔记.doc
  11. Linux之unzip命令
  12. python实用库之schemdraw不只是绘制原理图
  13. Error: Network Error
  14. jointJS系列之一:jointJS的的初步使用
  15. 百分制转五分制(java)
  16. android删除本地图片,Android之删除图库照片
  17. 微信小程序setData的使用
  18. 学校标准化计算机室的设备配置,幸福小学创建标准化学校汇报材料
  19. 丝芙兰(Sephora)和悦诗风吟(Innisfree)如何用“购物篮”改善顾客购物体验
  20. 微信小程序即将上线,现在就可以开发啦

热门文章

  1. Java架构师除了必备的技术之外,这些技能也需必备?你们觉得呢?
  2. postscript怎么打开_怎么把在学习中用的Adobe PDF文件转换成Microsoft office Word
  3. jira使用教程pdf_jira项目管理系统使用指南.pdf
  4. 三维数据平滑处理_黑白象片的密度信息 卫星数据处理 遥感制图 三维建模 善图科技...
  5. python123数值运算_python123中 Hello World的条件输出 和数值运算
  6. java怎么给list集合排序_java list集合排序按某一属性排序操作
  7. MySQL故障检测_检测MySQL的表的故障的方法
  8. python增量更新数据_Python标准库——加密
  9. hbuid 集成svn_HBuilder如何配置SVN的步骤详解
  10. el-table跨页选中