提供推荐

协作型过滤算法:对一大群人进行搜索,找出品味相近的一小群人。

1.搜集偏好。每位影评人对给定影片的喜好程度

2.寻找相近的用户。计算相似度评价值,欧几里得距离,皮尔逊相关度。

3.为评论者打分。找出最具有相似度的列表。

4.推荐物品。把用户之间的相似度最为加权值,为影片打分,推测得到用户没有看过影片的评分。

5.匹配商品。影评人可以和影片对换,为影片推荐人。

我们能做什么

为用户推荐商品

准备数据集,用户在一个月之内购买各种商品的数量

问题1:是否基于用户推荐,如果客户对象是运营商,基于用户推荐没有必要。

问题2:能否基于售货机推荐,为售货机推荐商品,同一个运营商区域内售货机相似度会很高,具体看结果。

目标改为:基于商品销售情况为售货机推荐商品。重点关注问题,同一运营商售货机可能会有很高相似度,是否对结果准确性造成影响。

准备数据集:售货机一个月内,售出各种商品数量。

开始进行推荐算法建模

1.准备数据

数据来源于开发数据库data_platform.svm_goods_stats_all

数据库配置

import pymysql as MySQLdb
import pandas as pd
host=""
user=""
passwd=""
port=
db=""

打开数据库连接,关闭数据库链接函数,读取数据库函数

def connect_sql():conn = MySQLdb.connect(host=host,port=port,user=user,passwd=passwd,db=db, charset='utf8')cur = conn.cursor()return conn,curdef close_connect(conn,cur):conn.commit()cur.close()conn.close()def select_sql(cur,sql):try:cur.execute(sql)alldata = cur.fetchall()frame = pd.DataFrame(list(alldata))except:frame = pd.DataFrame()return frame

读取数据,统计出2019年6月份,各个售货机每种商品的销量。

conn,cur = connect_sql()
sql = "SELECT svm_id,svm_name,goods_gid,goods_name,SUM(sale_amount) as sale_amount FROM `svm_goods_stats_all` where count_month=201804 GROUP BY svm_id,svm_name,goods_gid,goods_name;"
result = select_sql(cur,sql)
print(result[0:10])
       0                1                                 2                3  \
0  23561  微软大厦RE&F部门T1-8F  05CDE74A42B811E8B6E80017FA00B1BA     回头客枣泥蛋糕(两只装)
1  23561  微软大厦RE&F部门T1-8F  066D2F8EAF2411E798CE0017FA00E5A4              便利贴
2  23561  微软大厦RE&F部门T1-8F  070CF3DAC8E011E784ED0017FA00E5A4    统一果汁(250ML/盒)
3  23561  微软大厦RE&F部门T1-8F  10F6D1C0AF2411E798CE0017FA00E5A4              报事贴
4  23561  微软大厦RE&F部门T1-8F  1C5DB73FAF2111E798CE0017FA00E5A4            统一冰红茶
5  23561  微软大厦RE&F部门T1-8F  24146008AD8B11E79F3C0017FA00E9CA      零度可乐330ml/罐
6  23561  微软大厦RE&F部门T1-8F  27360F02AE4411E79F3C0017FA00E9CA        统一鲜橙多(盒装)
7  23561  微软大厦RE&F部门T1-8F  28DA970CAF2411E798CE0017FA00E5A4            彩色工字钉
8  23561  微软大厦RE&F部门T1-8F  35B52D06AE4311E79F3C0017FA00E9CA  三元纯牛奶(百利包)200ml
9  23561  微软大厦RE&F部门T1-8F  3A36BCD8AF2411E798CE0017FA00E5A4            套塑回形针   4
0  27
1   1
2  11
3   5
4  11
5  65
6  23
7   1
8  91
9  12

添加列名

result.columns = ["svm_id","svm_name","goods_gid","goods_name","sale_amount"]
print(result[0:10])
   svm_id         svm_name                         goods_gid       goods_name  \
0   23561  微软大厦RE&F部门T1-8F  05CDE74A42B811E8B6E80017FA00B1BA     回头客枣泥蛋糕(两只装)
1   23561  微软大厦RE&F部门T1-8F  066D2F8EAF2411E798CE0017FA00E5A4              便利贴
2   23561  微软大厦RE&F部门T1-8F  070CF3DAC8E011E784ED0017FA00E5A4    统一果汁(250ML/盒)
3   23561  微软大厦RE&F部门T1-8F  10F6D1C0AF2411E798CE0017FA00E5A4              报事贴
4   23561  微软大厦RE&F部门T1-8F  1C5DB73FAF2111E798CE0017FA00E5A4            统一冰红茶
5   23561  微软大厦RE&F部门T1-8F  24146008AD8B11E79F3C0017FA00E9CA      零度可乐330ml/罐
6   23561  微软大厦RE&F部门T1-8F  27360F02AE4411E79F3C0017FA00E9CA        统一鲜橙多(盒装)
7   23561  微软大厦RE&F部门T1-8F  28DA970CAF2411E798CE0017FA00E5A4            彩色工字钉
8   23561  微软大厦RE&F部门T1-8F  35B52D06AE4311E79F3C0017FA00E9CA  三元纯牛奶(百利包)200ml
9   23561  微软大厦RE&F部门T1-8F  3A36BCD8AF2411E798CE0017FA00E5A4            套塑回形针   sale_amount
0          27
1           1
2          11
3           5
4          11
5          65
6          23
7           1
8          91
9          12

转换成字典,格式为:{svm_id:{goods_name:sale_amount}}

dict={}
for i in range(len(result)):dict_row={}row=result.loc[i]svm_id=row["svm_id"]goods_name=row["goods_name"]sale_amount=row["sale_amount"]dict2=dict.setdefault(svm_id,{})dict2.setdefault(goods_name,sale_amount)
#print(dict)

计算两个售货机皮尔逊相关系数

from math import sqrt
import decimal
def sim_svm(dict,svm1,svm2):#得到两个售货机都售卖过商品列表si={}for item in dict[svm1]:if item in dict[svm2]:si[item]=1#获得列表元素的个数n=len(si)#如果两者共同之处<5,返回0if n<5 or n>20:return 0#对所有偏好求和sum1=sum([dict[svm1][it] for it in si])sum2=sum([dict[svm2][it] for it in si])#求平方和sum1Sq=sum([pow(dict[svm1][it],2) for it in si])sum2Sq=sum([pow(dict[svm2][it],2) for it in si])#求乘积之和pSum=sum([dict[svm1][it]*dict[svm2][it] for it in si])#计算皮尔逊评价值num=pSum-(sum1*sum2/n)den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))if den==0:return 0num=decimal.Decimal(num)den=decimal.Decimal(den)r=num/denreturn r

例如,计算北京腾讯众创空间4层G3-2:23804 和 北京腾讯众创空间B座3层G3-2:23805 皮尔逊相关系数,结果为0.6747359218147152627033075838

sim_svm(dict,23804,23807)
0

接下来计算一台售货机,与他最接近的匹配结果

#返回结果个数为参数
def topMathes(dict,svm,n=5,similarity=sim_svm):scores=[(similarity(dict,svm,other),other) for other in dict if other!=svm]#对列表进行排序,相似度最高的排在最前面scores.sort()scores.reverse()return scores[0:n]

以23804 北京腾讯众创空间4层G3-2 为例,相似度前10名为:
24006 深圳宝安百旺创意工厂7栋G5-2
24052 东莞理工学院行政楼G6-1
24100 深圳南山区科兴科学园C1栋14楼腾讯茶水间G3-1
24483 广州中大南方学院西学楼2号G5-1(男)
24495 广州中大南方学院西学楼11号G6-1(女)
24508 广州中大南方学院东学楼33号G6-1(女)
24513 广州中大南方学院东学楼23栋G6-1(女)
24601 广州TIT健身房门口G2
24603 广州TIT B4栋拐角G2
25655 北京创客广场A座3层P5
可以发现,受同一经营商影响不大,具备参考价值。

topMathes(dict,24147,n=10)
[(Decimal('0.9823212393018347222349147787'), 24136),(Decimal('0.9719508383747784295317217650'), 24638),(Decimal('0.9656766675443123709255253711'), 24557),(Decimal('0.9618078821558180077873342986'), 24137),(Decimal('0.9521073218544146589857017012'), 24097),(Decimal('0.9294906056457545187788558502'), 24060),(Decimal('0.9255077576001855257316520260'), 24514),(Decimal('0.8984729592094900609570536544'), 24194),(Decimal('0.8924104525393517299226061508'), 25304),(Decimal('0.8839387698964820572321233092'), 24200)]

推荐商品

方法:得到售货机的相似度后,乘以商品的销量,相似度高的售货机将对整体推荐提供更大的影响。求和后除以全部相似度之和,减少因为商品在很多售货机售卖造成的影响。

def getRecommendations(dict,svm,n=5,similarity=sim_svm):totals={}simSums={}for other in dict:#不要和本机作比较if other==svm:continuesim=similarity(dict,svm,other)#忽略相似度为0或者小于0的情况if sim<=0:continuefor item in dict[other]:#只对没有出售的商品统计if item not in dict[svm]:#相似度*销量totals.setdefault(item,0)totals[item]+=dict[other][item]*sim#相似度之和simSums.setdefault(item,0)simSums[item]+=sim#建立一个归一化的列表rankings=[(total/simSums[item],item) for item,total in totals.items()]#返回经过排序的列表rankings.sort()rankings.reverse()return rankings[0:n]

以23804 北京腾讯众创空间4层G3-2 为例,推荐商品如下:

getRecommendations(dict,24147,n=10)
[(Decimal('265.0525274870319393328064328'), '达利园青梅绿茶'),(Decimal('157.5100028338143193087411658'), '农夫山泉(550ml瓶)'),(Decimal('107.8895927165601255672163058'), '味全乳酸菌饮品 草莓味 (450ml瓶)'),(Decimal('107.1198200283158929032631089'), '百事可乐(600ml/瓶)'),(Decimal('106.0000000000000000000000000'), '康师傅香辣牛肉面 (108g杯)'),(Decimal('92.83801177224463229020539481'), '冰露纯净水(550ml瓶)'),(Decimal('90.69816481581427204727284670'), '盼盼肉松饼(30g/袋)'),(Decimal('80.59939128255216851631953250'), '景田纯净水(560ml/罐)'),(Decimal('80.28597990368058623276120420'), '麒麟午后奶茶原味(500ml/瓶)'),(Decimal('75.99999999999999999999999999'), '黄鹤楼(软蓝)')]

调参过程

调参对象:计算售货机皮尔逊相关系数,售货机拥有共同商品数量n值,大于n值才计算相关系数。由于每月每台售货机商品种类较多,有几十种:

当n过小时,如n=0,只要有一种商品共同售卖,则计算两台售货机相关系数过大,由于共同商品数量占比较小,不能反映两台售货机正常的相关系数。

当n过大时,如n>10,数据显示相关度高的大部分为同一运营商下的售货机,售货机由同一家运营商运营,商品种类是很接近的,造成相关度高,不具有推荐价值。

以下取n=5,10,8 svm_id为23804的售货机展示

2018.04 n>5
(Decimal(‘0.9786200730071457015837720227’), 24077),
(Decimal(‘0.9785952494059722601910034694’), 24251),
(Decimal(‘0.9718629832926680068337899408’), 24241),
(Decimal(‘0.9690117014397064027364879548’), 24528),
(Decimal(‘0.9100647553336100121272323189’), 24253),
(Decimal(‘0.9038551160925817906111451915’), 24016),
(Decimal(‘0.9015406198643173343230210883’), 24053),
(Decimal(‘0.8988979765004685420165975777’), 24070),
(Decimal(‘0.8940838255256492836261510545’), 24041),
(Decimal(‘0.8840579125201337339223390679’), 25279)

24016 深圳龙岗坪山主力宿舍B栋G5-1
24041 深圳南方科技大学教师公寓6栋G3-1
24053 东莞理工学院综合馆G6-1
24070 深圳罗湖区深圳体育中心攀岩馆G3-1
24077 深圳硅谷动力智能终端园区A4-B座G3-1
24241 深圳市南山区西丽阳光工业园燕麦科技一楼G3-1
24251 深圳顺荣公司19楼G3-1
24253 深圳南山区百旺创意工厂7栋热饭区G3-1
24528 深圳南山区卓越·后海中心13楼G5-1
25279 广州海珠区逸景路海珠法院G/FG2

2018.04 n>10
(Decimal(‘0.8613278321515042256076360978’), 24107),
(Decimal(‘0.8047128623318818263408620095’), 23833),
(Decimal(‘0.7993363061220379677912798578’), 24611),
(Decimal(‘0.7853217985017786274568049621’), 23804),
(Decimal(‘0.7716792351064601225337047706’), 24566),
(Decimal(‘0.6408978040555316821860744214’), 23807),
(Decimal(‘0.5719628185572587922591246519’), 25298),
(Decimal(‘0.5669038392651221983059927370’), 24609),
(Decimal(‘0.4178989436433680834095254679’), 24582),
(Decimal(‘0.4132137518364929407830469620’), 24587)

23804 北京腾讯众创空间4层G3-2
23807 北京腾讯众创空间A座5层G3-1
23807 北京腾讯众创空间A座5层G3-2
23833 北京腾讯众创空间A座2层G5-2
24107 北京腾讯众创空间A座1层G5-1
24566 广州肿瘤医院2号楼1楼G6-1
24582 广州岭南电商产业园3楼G5-1
24587 广州白云机场P2停车场三号G5-1
24609 广州白云机场奥斯特酒店G6-1
24611 广州白云机场P3停车场一楼G5-1
25298 北京创客广场A座3层G5

2018.04 n>8

(Decimal(‘0.8613278321515042256076360978’), 24107),
(Decimal(‘0.8547413911344391514801827327’), 24714),
(Decimal(‘0.8047128623318818263408620095’), 23833),
(Decimal(‘0.7993363061220379677912798578’), 24611),
(Decimal(‘0.7853217985017786274568049621’), 23804),
(Decimal(‘0.7806301788636706538993692880’), 24102),
(Decimal(‘0.7716792351064601225337047706’), 24566),
(Decimal(‘0.7664002999952736182570821024’), 24606),
(Decimal(‘0.7571419380607181772692088246’), 24078),
(Decimal(‘0.6732402070760885938576218374’), 24090)

23804 北京腾讯众创空间4层G3-2
23833 北京腾讯众创空间A座2层G5-2
24078 深圳南方科技大学学生宿舍4栋G5-1
24090 深圳南方科技大学教学楼28栋G3-1
24102 深圳南山区科兴科学园C2栋12楼腾讯茶水间G3-1
24107 北京腾讯众创空间A座1层G5-1
24566 广州肿瘤医院2号楼1楼G6-1
24606 广州蓝谷创意园g6-1
24611 广州白云机场P3停车场一楼G5-1
24714 广州全民时尚天河G6-1


基于无人售货机商品售卖情况推荐商品相关推荐

  1. 一个11层的CNN(基于无人售货机的货物识别

    Github 源代码与数据文件均在github上,对识别感兴趣的小伙伴点个star啦,共同学习共同进步,谢谢!!! 只需要把文件完整下载,改变文件的目录,然后把数据改为你想要识别的物品,修改全连接层( ...

  2. 几乎等于一个小超市的新型无人售货机

    随着科技的发展,自助购物,移动支付,都是大家现在非常喜欢做的事情-无人零售时代已经来临,它是人们展望未来社会所衍生的产物,自发明至今已经得到全面发展.而随着科技的进步,无人售货机的售卖也更加丰富多彩. ...

  3. 基于JAVA无人售货机管理系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA无人售货机管理系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA无人售货机管理系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  4. 基于SSM的智能无人售货机系统的设计与实现

    开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 基于SSM的智能无人售货机系统的设计与实现 ...

  5. 第八章(无人售货机零售项目实战)

    分组聚合客户订单 无人售货机客户订单信息表记录着有关客户的订单信息. 从客户的角度出发,分析客户订单信息表中的数据,了解客户订单状况,按照客户订单数据进行聚合计算,对客户订单消费金额从高到低进行排序, ...

  6. java/php/net/python无人售货机管理系统设计

    本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给您发 1.关于无人售货机管理系统的基本要求 ( ...

  7. 无人便利店和无人售货机的区别在哪

    在很多业界观点看来,无人便利店和无人售货机的主要特质就在于"无人",也就是通过无人零售的方式从而降低人力成本,同时仍能够实现24小时开店的需求.下面37号仓小编给大家讲解下无人便利 ...

  8. java毕业设计无人售货机管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计无人售货机管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计无人售货机管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技 ...

  9. 计算机毕业设计Java无人售货机管理系统(源码+系统+mysql数据库+Lw文档)

    计算机毕业设计Java无人售货机管理系统(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java无人售货机管理系统(源码+系统+mysql数据库+Lw文档) 本源码技术栈: 项目架构:B/S ...

  10. 常见的各种无人售货机多少钱一台

    上个世纪末,无人售货机来到了中国,虽然之后经过了十多年的发展可一直不温不火,直到近几年随着电子商务的发展手机支付得到了很好的普及之后,无人售货机才开始爆发式增长,可以说手机移动支付给无人售货机的普及提 ...

最新文章

  1. D3-栈[Java数据结构和算法]
  2. GNS3路由器直连端口Ping不通
  3. 《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1.2 架构师的职责
  4. 【Java】Springboot项目中jar包加密
  5. java服务器必读_Java服务器端编程安全必读
  6. Qt中connect的几种写法与遍历ComBox的值
  7. Oracle 数据库插入时间字段
  8. QGC调试px4固件飞控
  9. 用python画猫咪怎么画-python画猫
  10. 解决RabbitMQ 集群搭建显示cookie
  11. windows server 2008 R2 怎么集成USB3.0驱动
  12. oracle log network server,记录一次ARC1: Destination LOG_ARCHIVE_DEST_2 network reconnect abandoned解决...
  13. Win10 AMD显卡不兼容造成的开机黑屏问题解决
  14. VM虚拟机安装CentOS7系统后连接不上网络的问题(service netword restart)重启网卡和重置网络编译器
  15. citrix vdi 服务器性能要求,Citrix测试VDI的最佳hypervisor
  16. 2021年中国游戏行业发展现状及行业发展趋势分析[图]
  17. EMD经验模态分解实例(转C代码)
  18. 如何连接cent os系统服务器,配置cent os服务器
  19. “信任机制”才是数字化时代发展中的精髓所在
  20. Python识别验证码----数美图标点选

热门文章

  1. spring框架对jdk版本要求
  2. Java中Object转化为int类型
  3. Matlab 曲线拟合之 polyfit 、polyval、poly2str 函数
  4. python提取url的顶级域名及域名后缀
  5. 【动态规划】 EditDistance
  6. Qt网络编程(1):QTcpSocket和QTcpServer的基本使用
  7. QTcpServer和QTcpSocket使用详解
  8. python 力扣(LeetCode) 1818.绝对差值和
  9. 串口、Modbus通信协议
  10. 佳能微单R6断电DAT文件MP4视频完美修复不卡顿