Springboot 实现基于用户和物品的协同过滤算法

 

目录

 

简介

协同过滤算法(简称CF)

算法详解

算法使用

基于用户

基于物品

总结


前言-与正文无关

生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣赏生活中的每一道风景,享受与家人朋友的温馨时光,发现那些平凡日子里隐藏的幸福时刻。因为,这些点点滴滴汇聚起来的,才是构成我们丰富多彩生活的本质。希望每个人都能在繁忙的生活中找到自己的快乐之源,不仅仅为了生存而工作,更为了更好的生活而生活。

送你张美图!希望你开心!

简介

协同过滤算法(简称CF)


在早期,协同过滤几乎等同于推荐系统。主要的功能是预测和推荐。协同过滤推荐算法分为两类,分别是:

(英文userCF)

基于用户的协同过滤算法(相似的用户可能喜欢相同物品);这个一般适合推荐新闻和皮皮虾之类的,数据跟人有很大关系,而且信息是每日都是更新的。如果你推荐购物这种,因为一个新建的用户可能购买的商品不足全量商品万分之1,商品数据量大,人对商品购买少,很难找到相似的人;随着用户和物品数量的增加,计算复杂度增加,所以需要这种更适合第二种算法。
(英文itemCF)

基于物品的协同过滤算法(这种方法通过分析物品之间的相似性,根据用户喜欢的物品,,推荐最大相似度其他物品。比如用户喜欢物品A,然后通过算法的出物品C和A的相似度极高,那么用户有可能喜欢物品C)。当然也有缺点:需要足够的用户-物品交互数据来找出物品之间的相似性。

算法详解

如果想知道算法细节可以看我的皮尔森相关系数介绍,这边只是代码级别

推荐系统算法 协同过滤算法详解(二)皮尔森相关系数-CSDN博客

算法使用

下面例子都是基于电影推荐系统做的,向用户推荐喜欢的电影。核心有几个字段,1用户id,2电影id,3是评分。如果你不是电影推荐而是其他,其实代码都一样,逻辑也都大差不差。

核心协同过滤算法类,不管你是基于用户,还是基于商品电影都需要,使用的是皮尔森相关系数

package com.tarzan.recommend.core;import com.tarzan.recommend.dto.RelateDTO;
import org.assertj.core.util.Lists;import java.util.*;
import java.util.stream.IntStream;/*** 核心算法**/
public class CoreMath {/*** 计算相关系数并排序* @param key* @param map* @return Map<Integer,Double>*/public static Map<Integer,Double> computeNeighbor(Integer key, Map<Integer,List<RelateDTO>>  map,int type) {Map<Integer,Double> distMap = new TreeMap<>();List<RelateDTO> userItems=map.get(key);map.forEach((k,v)->{//排除此用户if(!k.equals(key)){//关系系数double coefficient = relateDist(v,userItems,type);//关系距离//   double distance=Math.abs(coefficient);distMap.put(k,coefficient);}});return distMap;}/*** 计算两个序列间的相关系数** @param xList* @param yList* @param type 类型0基于用户推荐 1基于物品推荐* @return double*/private static double relateDist(List<RelateDTO> xList, List<RelateDTO> yList,int type) {List<Double> xs= Lists.newArrayList();List<Double> ys= Lists.newArrayList();xList.forEach(x->{yList.forEach(y->{if(type==0){if(x.getItemId().equals(y.getItemId())){xs.add(x.getIndex());ys.add(y.getIndex());}}else{if(x.getUseId().equals(y.getUseId())){xs.add(x.getIndex());ys.add(y.getIndex());}}});});return getRelate(xs,ys);}/*** 方法描述: 皮尔森(pearson)相关系数计算** @param xs x集合* @param ys y集合*/public static double getRelate(List<Double> xs, List<Double> ys){int n=xs.size();//至少有两个元素if (n<2) {return 0D;}double Ex= xs.stream().mapToDouble(x->x).sum();double Ey=ys.stream().mapToDouble(y->y).sum();double Ex2=xs.stream().mapToDouble(x->Math.pow(x,2)).sum();double Ey2=ys.stream().mapToDouble(y->Math.pow(y,2)).sum();double Exy= IntStream.range(0,n).mapToDouble(i->xs.get(i)*ys.get(i)).sum();double numerator=Exy-Ex*Ey/n;double denominator=Math.sqrt((Ex2-Math.pow(Ex,2)/n)*(Ey2-Math.pow(Ey,2)/n));if (denominator==0) {return 0D;}return numerator/denominator;}}

实体类

package com.tarzan.recommend.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 关系数据**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RelateDTO {/** 用户id */private Integer useId;/** 电影id */private Integer itemId;/** 评分 */private Double index;}

基于用户

入参是你要给推荐具体电影的当前用户id,

package com.tarzan.recommend.service;import com.tarzan.recommend.core.ItemCF;
import com.tarzan.recommend.core.UserCF;
import com.tarzan.recommend.dto.ItemDTO;
import com.tarzan.recommend.dto.RelateDTO;import java.util.List;
import java.util.stream.Collectors;/*** 推荐服务**/
public class Recommend{/*** 方法描述: 猜你喜欢** @param userId 用户id*/public static List<Integer>  userCfRecommend(int userId){List<RelateDTO> data= Sql获取不同用户对不同电影评分关系;// 获取到推荐的电影idList<Integer> recommendations = UserCF.recommend(userId, data);return recommendations ;}}
package com.tarzan.recommend.core;import com.tarzan.recommend.dto.RelateDTO;import java.util.*;
import java.util.stream.Collectors;/*** 核心算法** @since JDK1.8*/
public class ItemCF {/*** 方法描述: 推荐电影id列表** @param itemId 当前电影id* @param list 用户电影评分数据* @return {@link List<Integer>}*/public static List<Integer> recommend(Integer itemId, List<RelateDTO> list) {//按物品分组Map<Integer, List<RelateDTO>>  itemMap=list.stream().collect(Collectors.groupingBy(RelateDTO::getItemId));//获取其他物品与当前物品的关系值Map<Integer,Double>  itemDisMap = CoreMath.computeNeighbor(itemId, itemMap,1);//获取关系最近物品double maxValue=Collections.max(itemDisMap.values());return itemDisMap.entrySet().stream().filter(e->e.getValue()==maxValue).map(Map.Entry::getKey).collect(Collectors.toList());}}

 

基于物品

入参是当前用户曾经评过高分的电影id,以此通过算法推荐和此电影相似度高的电影

package com.tarzan.recommend.service;import com.tarzan.recommend.core.ItemCF;
import com.tarzan.recommend.core.UserCF;
import com.tarzan.recommend.dto.ItemDTO;
import com.tarzan.recommend.dto.RelateDTO;import java.util.List;
import java.util.stream.Collectors;/*** 推荐服务**/
public class Recommend{/*** 方法描述: 猜你喜欢** @param itemId 电影id*/public static List<Integer>  userCfRecommend(int userId){List<RelateDTO> data= Sql获取不同用户对不同电影评分关系;// 获取到推荐的电影idList<Integer> recommendations = ItemCF.recommend(itemId, data);return recommendations ;}}

总结

建议使用基于物品的协同过滤算法,基于物品协同过滤可以预先计算好物品间的相似度,在线查询要比基于用户快的多,且基于物品实际效果质量一般比基于用户高,但这个也不是绝对的,像是抖音这中视频都是最新更新的还是基于用户靠谱。

系数计算要保证,分数值至少每行两个首要条件,其次对比值要多,少的话就没有那么理想结果

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。

A乐神-CSDN博客

关注在文章左上角,作者信息处。

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

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

相关文章

对作用域链的理解(详细解析)

文章目录 一、作用域全局作用域函数作用域块级作用域 二、词法作用域三、作用域链 一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变…

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

腾讯云0基础10秒搭建幻兽帕鲁游戏联机服务器

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;需要搭建一个稳定、高效的游戏联机服务器。腾讯云提供了一种简单、快速的方法&#xff0c;让新手小白也能0基础10秒搭建幻兽帕鲁游戏联机服务器&#xff01; 本文将…

计算机网络_1.2因特网概述

1.2因特网概述 一、网络、互联网与因特网的区别与联系1、网络2、互联网3、因特网4、 互联网与因特网辨析 二、因特网介绍1、因特网发展的三个阶段2、因特网简介&#xff08;1&#xff09;因特网服务提供者&#xff08;ISP&#xff09;&#xff08;2&#xff09;因特网已经发展成…

基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的视频网站系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

ESP8266 传感器搭配 Node-RED实时显示数据,邮件告警 实验

前言 esp8266 12f,wif模块,接倾斜传感器,火焰传感器,烟雾传感器,水浸传感器,蜂鸣器。通过mqtt发布数据,并使用node-red实时获取数据,显示到页面上。并且通过邮件和页面两种方式报警。 需求如下: ①倾斜传感器:监测是否保持平衡。UI界面显示平衡度。如果不平衡,UI界…

Observability:在 Elastic Stack 8.12 中使用 Elastic Agent 性能预设

作者&#xff1a;来自 Elastic Nima Rezainia, Bill Easton 8.12 中 Elastic Agent 性能有了重大改进 最新版本 8.12 标志着 Elastic Agent 和 Beats 调整方面的重大转变。 在此更新中&#xff0c;Elastic 引入了 Performance Presets&#xff0c;旨在简化用户的调整过程并增强…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

如何从视频中提取高清图片?可以这样截取

如何从视频中提取高清图片&#xff1f;从视频中提取高清图片可以方便我们制作各种用途所需的素材&#xff0c;如海报、社交媒体配图等。此外&#xff0c;高清图片的细节和色彩也更丰富&#xff0c;可以更好地满足我们的视觉需求。从视频中提取高清图片是一项需要技巧的任务&…

Gateway API 实践之(六)FSM Gateway 的健康检查功能

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 网关的健康检查功能是一种自动化监控机制&#xff0c;用于定期检查和验证后端服务的健康状况&#xff0c;确保流量只被转发到那些健康且能正常处理请…

Java流程控制for 标签的使用

目录 for语法结构举例breakcontinuereturn 标签 for for循环语句是支持迭代的一种通用结构&#xff0c;是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化&#xff0c;即执行初始表达式&#xff1b;随后&#xff0c;对布尔表达式进行判定&#xff0c;若判定结果…

学习鸿蒙基础(2)

arkts是声名式UI DevEcoStudio的右侧预览器可以预览。有个TT的图标可以看布局的大小。和html的布局浏览很像。 上图布局对应的代码&#xff1a; Entry //入口 Component struct Index {State message: string Hello Harmonyos //State 数据改变了也刷新的标签build() {Row()…

C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S 。 现在有两位玩家轮流操作&#xff0c;每次操作可以从任意一堆石子中拿取石子&#xff0c;每次拿取的石子数量必须包含于集合 S &#xff0c;最后无法进行操作的人视为失败。 问如果两人都采用最优策略&#xff0c;…

PEI是聚醚酰亚胺(Polyetherimide)主要应用于哪些行业领域?

聚醚酰亚胺&#xff08;Polyetherimide&#xff0c;PEI&#xff09;由于其优异的性能&#xff0c;被广泛应用于多个工业领域。以下是PEI主要应用的一些行业领域&#xff1a; 1.航空航天工业&#xff1a; PEI的高温稳定性和机械性能使其在航空航天领域中成为一种理想的材料。它用…

系统架构设计师-21年-下午题目

系统架构设计师-21年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某公司拟开发一套机器学习应用开发平台&#xff0c;支持用户使用浏览器在线进行基于机器学习的智能应用开发…

抵御.360勒索病毒威胁:解密文件的有效方法与预防措施

导言&#xff1a; 近来&#xff0c;网络犯罪的一种新型形式——.360勒索病毒&#xff0c;备受关注。这种病毒通过加密用户文件&#xff0c;要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.360勒索病毒的特点&#xff0c;同时提供一些有效的恢复方法&#xff0c;并分享…

OpenAI最近推出了ChatGPT的一个新功能,@GPT

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

人工视觉仍然需要图像采集卡

最初&#xff0c;图像采集卡被用作模拟视频数字转换器和图像缓冲器&#xff0c;但如今它们能够执行复杂的任务&#xff0c;例如图像处理。图像采集卡的设计不断发展&#xff0c;旨在提高系统性能并减少计算机处理需求。 除了图像采集之外&#xff0c;图像采集卡还执行机器视觉…

酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 &#xff08;1&#xff09;系统首页 &#xff0…

kettle通过severice_name连接oracle数据源踩坑

最近在研究kettle做数据抽取核对&#xff0c;按照官网安装kettle后无法连接oracle 坑1&#xff1a;kettle 连接oracle的数据库名指的是sidname 而非severicename&#xff0c;前期一直使用severicename 如下始终报错 注意区分下&#xff1a; SID:一个数据库可以有多个实例&…