算法核心的公式如下:

1.余弦相似度(求邻居):

2.预测公式(预测a可能会喜欢哪种物品):

这里是参考帖子的公式,说实话看这个公式看的有点懵

另外一个比较好解释的帖子请看这里的公式和分析过程:https://www.cnblogs.com/dsgcBlogs/p/8619566.html

看完以上内容开始进入正题【基于用户相似协同过滤推荐】

  • 获取所有用户对物品的关注数矩阵

我们的项目设置多个地方比如:获取物品详情、关注物品等接口调用时进行记录行为,以单位1为一次,可以设置每个行为不同的权重,例如:关注+5、收藏+3等等。hobby_num代表喜爱度

从数据库查询出构成二维数组并循环生成以下数组(为方便展示,已经转为json格式,php程序内无须转为json,1级键为用户id索引

{"1": [{"user_id": "1","second_id": "1","ranking_name": "2018年最受欢迎涂抹式面膜","hobby_num": "0"},{"user_id": "1","second_id": "2","ranking_name": "2018年最热销猫粮","hobby_num": "0"},{"user_id": "1","second_id": "3","ranking_name": "2018年最热销的天然猫粮","hobby_num": "0"},{"user_id": "1","second_id": "4","ranking_name": "2018年性价比高又耐养的宠物","hobby_num": "0"},{"user_id": "1","second_id": "5","ranking_name": "2018年最长寿的宠物","hobby_num": "0"},{"user_id": "1","second_id": "6","ranking_name": "2018年最火爆的理科专业","hobby_num": "0"},{"user_id": "1","second_id": "7","ranking_name": "2018年美国医科学校","hobby_num": "0"},{"user_id": "1","second_id": "8","ranking_name": "2018年最受女生喜欢的热门专业","hobby_num": "0"},{"user_id": "1","second_id": "9","ranking_name": "2018年最热门的小语种","hobby_num": "0"},{"user_id": "1","second_id": "10","ranking_name": "2018年最高人气的英语教育机构","hobby_num": "0"}]}
  • 计算余弦相似度cos并从大到小排序【不计算为0的值,0代表没有关注度,$not_hobby代表被推荐用户未观看过的内容列表,也就是hobby_num=0的内容】
        //计算分母$fm = 0;foreach ($data[$user_id] as $item) {if ($item['hobby_num'] != 0) {$fm += $item['hobby_num'] * $item['hobby_num'];}}//根$fm = sqrt($fm);foreach ($data as $key => $item) {if ($key != $user_id) {//计算分子和分母$fz = 0;$fm2 = 0;foreach ($item as $i => $j) {//计算分子if ($data[$user_id][$i]['hobby_num'] != 0 && $j['hobby_num'] != 0) {$fz += $data[$user_id][$i]['hobby_num'] * $j['hobby_num'];}//计算分母2if ($j['hobby_num'] != 0) {$fm2 += $j['hobby_num'] * $j['hobby_num'];}}$fm2 = sqrt($fm2);if ($fz != 0 && $fm != 0 && $fm2 != 0) {//计算用户的cos值$cos[$key] = $fz / $fm / $fm2;}} else {//设置用户未看过的内容数组foreach ($item as $k => $j) {if ($j['hobby_num'] == 0) {$not_hobby[$k] = $j;}}}}//从大到小排序cos值arsort($cos);//设置好用户对应的cos值foreach ($cos as $key => $item) {$lingju[] = ['user_id' => $key, 'cos' => $item];}//取前面3个邻居$lingju = array_slice($lingju, 0, 3);//设置好对预测推荐的数组foreach ($lingju as &$i) {foreach ($not_hobby as $k => $j) {$i['hobby'][] = $data[$i['user_id']][$k];}}//计算predict值foreach ($not_hobby as $k => &$j) {$predict_fz = 0;$predict_fm = 0;foreach ($lingju as $item) {if ($item['hobby'][$k]['hobby_num'] != 0) {$predict_fz += $item['cos'] * $item['hobby'][$k]['hobby_num'];}$predict_fm += $item['cos'];}$j['predict'] = $predict_fz / sqrt($predict_fm);}//设置排序的第二数组foreach ($not_hobby as $key => $row) {$volume[$key] = $row['predict'];}//根据predict值排序二维数组array_multisort($volume, SORT_DESC, $not_hobby);

键为用户id【理论上越接近1则两个用户越相似,此处看你们的机制,因为我们项目的有分领域,并设置测试每个领域有系统设定好的机器人,比如以下1为关注游戏领域的机器人,测试时点击游戏内容则与用户id=1的用户较为相似,cos值为0.42007393952061,可作为邻居】

[{"user_id": 1,"cos": 0.42007393952061},{"user_id": 12,"cos": 0.22096682734453},{"user_id": 5,"cos": 0.099333258551861},{"user_id": 8,"cos": 0.050731001802594},{"user_id": 17,"cos": 0.022953657440244}
]
[{"user_id": "389","second_id": "226","ranking_name": "100元以内最具性价比的出租屋神器","hobby_num": "0","predict": 9.2758507820205},{"user_id": "389","second_id": "46","ranking_name": "创造101最高人气的成员","hobby_num": "0","predict": 6.3466347455929},{"user_id": "389","second_id": "135","ranking_name": "曾经红极一时的最经典耽美影视作品","hobby_num": "0","predict": 2.8248421075833},{"user_id": "389","second_id": "71","ranking_name": "不论何时回顾,都会感动落泪的动漫情节","hobby_num": "0","predict": 2.3112344516591},{"user_id": "389","second_id": "18","ranking_name": "2018年最让人心动的动漫女主","hobby_num": "0","predict": 2.054430623697},{"user_id": "389","second_id": "20","ranking_name": "日本恐怖漫画","hobby_num": "0","predict": 1.7976267957348},{"user_id": "389","second_id": "27","ranking_name": "亚洲最火爆的动漫","hobby_num": "0","predict": 1.7976267957348},{"user_id": "389","second_id": "73","ranking_name": "国产动画片排行榜","hobby_num": "0","predict": 1.7976267957348},{"user_id": "389","second_id": "50","ranking_name": "2018最佳BL漫画","hobby_num": "0","predict": 1.5408229677727},{"user_id": "389","second_id": "19","ranking_name": "2018年日本耽美漫画","hobby_num": "0","predict": 0.77041148388636},{"user_id": "389","second_id": "33","ranking_name": "80后最爱看的动漫","hobby_num": "0","predict": 0.77041148388636},{"user_id": "389","second_id": "74","ranking_name": "日本最催泪虐心动漫","hobby_num": "0","predict": 0.77041148388636},{"user_id": "389","second_id": "221","ranking_name": "深圳福田区公寓-梅林&景田&车公庙&新洲","hobby_num": "0","predict": 0.57721698199284},{"user_id": "389","second_id": "153","ranking_name": "饭可以不吃但不能不玩的最经典单机游戏","hobby_num": "0","predict": 0.46177358559427},{"user_id": "389","second_id": "44","ranking_name": "中国区-2018年绝地求生最受欢迎的职业战队","hobby_num": "0","predict": 0.3463301891957}
]

此处做法是按照从大到小的预测值排列并推荐。当然了predict值比较小的内容是否推荐,看项目而定,一般predict值小代表和用户不是非常的贴合,也可能不一定是用户喜欢的内容,但一般项目内可能感兴趣的榜单,就推荐几个,一般来说就够了

当然我们目前项目算法还在优化,存在以下问题

  • 用户冷启动问题,无从推荐【解决办法:热度排名(如果是新闻系统还要+时间衰减+人工干预等)、比如阿里的推荐系统就从各种平台(淘宝、饿了么、支付宝)记录内容,可以解决冷启动】

参考:https://blog.csdn.net/dingsongtao/article/details/72160096

php协同过滤推荐算法【附部分源码】相关推荐

  1. (附源码)ssm+mysql+基于ssm协同过滤推荐算法的电影院购票系统 毕业设计131124

    基于ssm协同过滤推荐算法的电影院购票系统 摘 要 随着信息技术的飞速发展以及Internet的迅速普及,以Web2.0为代表的互联网技术使得网络数据呈爆炸式增长,越来越多的信息和服务充斥着网络.人们 ...

  2. 基于云模型的协同过滤推荐算法代码实现(附源代码)

    基于云模型的协同过滤推荐算法代码实现(附源代码) 一.云模型介绍 针对传统推荐系统数据稀疏.相似性计算方法导致共同评分用户少的问题,提出利用云模型概念与定量数值转换的优势,研究云模型(百度百科查看概念 ...

  3. python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  4. java毕业设计成品基于SpringBoot体育用品购物商城-协同过滤推荐算法[包运行成功]

    一.项目介绍 java毕业设计计算机毕设项目之SpringBoot体育用品商城-协同过滤推荐算法,下订单模块用的是百度地图api_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之Spring ...

  5. 从原理到实现,详解基于朴素ML思想的协同过滤推荐算法

    作者丨gongyouliu 编辑丨Zandy 来源 | 大数据与人工智能(ID: ai-big-data) 作者在<协同过滤推荐算法>.<矩阵分解推荐算法>这两篇文章中介绍了几 ...

  6. 从原理到落地,七大维度读懂协同过滤推荐算法

    作者丨gongyouliu 来源 | 大数据与人工智能 导语:本文会从协同过滤思想简介.协同过滤算法原理介绍.离线协同过滤算法的工程实现.近实时协同过滤算法的工程实现.协同过滤算法应用场景.协同过滤算 ...

  7. 【知识发现】基于用户的协同过滤推荐算法python实现

    1.协同过滤推荐算法分为两类,分别是基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborat ...

  8. 基于Hbase的用户评分协同过滤推荐算法

    基于Hbase的用户评分协同过滤推荐算法 作者: 张保维 2012-1-3 一. 概述 本文为推荐引擎设计的基础篇,介绍基于hbase 存储方式用户评分的方式进行推荐的主体算法及在分布式平台环境下的实 ...

  9. 协同过滤算法_基于用户的协同过滤推荐算法原理和实现

    (给算法爱好者加星标,修炼编程内功) 来源:Create Chen's Blog https://www.cnblogs.com/technology/p/4467895.html 在推荐系统众多方法 ...

  10. 推荐算法工程师必备!!!协同过滤推荐算法总结

    推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究.推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型 ...

最新文章

  1. “阿一web标准学堂”选修课:EditPlus高级使用技巧(附视频、课件、代码下载)...
  2. postgresql存储过程输出参数
  3. c4android 免root,C4Android中4.1.0版本不支持new命令,哪个版本支
  4. 【视频课】模型剪枝+模型量化+知识蒸馏典型实践!
  5. 上传图片被防火墙拦截_Murus Pro Suite——防火墙软件
  6. 关于使用JQ scrollTop方法进行滚动定位
  7. win8.1 计算机 桌面快捷方式,win8.1操作系统中我的电脑在哪里?win8.1我的电脑快捷键添加方法介绍...
  8. Hadoop_10_HDFS 的 DataNode工作机制
  9. Hadoop实战之一~Hadoop概述
  10. 算法导论 25.3 Johnson算法
  11. 笔记本W10找不到端口(com口)及单片机串口连接的问题(附51开发板的CH340串口芯片的驱动程序安装包)
  12. 二进制转化成ascll_怎样将二进制转ascii码
  13. Halcon算子学习:distance_object_model_3d
  14. PHP excel 直接输出导出
  15. linux lzma 函数 调用,Lzma(7-zip)和zlib
  16. 460. LFU缓存
  17. LoRa的码片速率chip rate
  18. javascript的基础-1
  19. 转载: HDMI 基础知识
  20. HeadFir st 设计模式学习笔记21-- 解释者(Inter pr eter)模式拾零

热门文章

  1. Excel制作一个家庭收支明细表
  2. 查看电脑内存可支持的最大容量
  3. Halcon一维测量中边缘提取相关算子(Measure_pos和Measure_pairs)
  4. 艾伦图灵——人类亲手毁灭的第n个科学家
  5. 《电脑爱好者》技术启示1
  6. MapINFO栅格图像载入方法
  7. HTML和JavaScript单双引号转义
  8. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(四)安装Delivery Controller和许可证服务器
  9. cdoj 1342 郭大侠与甲铁城 树状数组+离线
  10. 前端 table 导出excel表格方法