协同过滤推荐算法-Java电商商品推荐案例

news/2024/5/17 16:57:39

协同过滤推荐算法-Java电商商品推荐案例

import java.util.*;// 商品类
class Item {int id;String name;public Item(int id, String name) {this.id = id;this.name = name;}
}// 用户类
class User {int id;String name;Map<Item, Integer> ratings; // 用户对商品的评分public User(int id, String name) {this.id = id;this.name = name;this.ratings = new HashMap<>();}// 为商品添加评分public void addRating(Item item, int rating) {ratings.put(item, rating);}// 获取用户对商品的评分public Integer getRating(Item item) {return ratings.get(item);}
}// 商品推荐器类
class ItemRecommender {List<User> users;public ItemRecommender(List<User> users) {this.users = users;}// 基于用户的协同过滤推荐算法public List<Item> recommendItems(User user) {Map<Item, Double> scores = new HashMap<>();Map<Item, Integer> frequency = new HashMap<>();// 计算用户之间的相似度for (User otherUser : users) {if (otherUser != user) {for (Item item : otherUser.ratings.keySet()) {if (!user.ratings.containsKey(item)) {int rating = otherUser.getRating(item);scores.put(item, scores.getOrDefault(item, 0.0) + rating);frequency.put(item, frequency.getOrDefault(item, 0) + 1);}}}}// 计算推荐得分Map<Item, Double> recommendations = new HashMap<>();for (Item item : scores.keySet()) {double score = scores.get(item);int freq = frequency.get(item);recommendations.put(item, score / freq);}// 排序推荐结果List<Map.Entry<Item, Double>> sortedRecommendations = new ArrayList<>(recommendations.entrySet());sortedRecommendations.sort((a, b) -> Double.compare(b.getValue(), a.getValue()));// 返回推荐商品List<Item> recommendedItems = new ArrayList<>();for (Map.Entry<Item, Double> entry : sortedRecommendations) {recommendedItems.add(entry.getKey());}return recommendedItems;}
}public class CollaborativeFiltering {public static void main(String[] args) {// 创建用户和商品User user1 = new User(1, "Alice");User user2 = new User(2, "Bob");Item item1 = new Item(1, "手机");Item item2 = new Item(2, "平板电脑");Item item3 = new Item(3, "耳机");// 用户对商品的评分user1.addRating(item1, 5);user1.addRating(item2, 4);user2.addRating(item1, 4);user2.addRating(item3, 5);// 构建用户列表List<User> users = new ArrayList<>();users.add(user1);users.add(user2);// 创建商品推荐器ItemRecommender recommender = new ItemRecommender(users);// 对用户进行商品推荐List<Item> recommendedItems = recommender.recommendItems(user1);// 输出推荐结果System.out.println("为用户 " + user1.name + " 推荐的商品是:");for (Item item : recommendedItems) {System.out.println(item.name);}}
}

http://www.mrgr.cn/p/42118865

相关文章

随机森林特征重要性评估与Python实现(三)

特征重要性评估(Variable importance measure, or Feature importance evaluation,VIM)用来计算样本特征的重要性,定量地描述特征对分类或者回归的贡献程度。随机森林(Random Forest)作为一种强大的机器学习算法,在特征重要性评估方面具有显著优势。特征重要新评估是随机森…

全志ARM-修改开发板内核启动日志

修改开发板内核日志输出级别&#xff1a; 默认输出级别为1&#xff0c;需要用超级用户权限修改 sudo vi /boot/orangepiEvn.txt 把第一行内核启动输出权限改为7&#xff0c;第二行把输出方式该为“serial”串口输出

解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件&#xff0c;其中一个功能是base64和图片的转换。因为分成四个小功能&#xff0c;所以使用的iview的tabs来展示不同功能&#xff0c…

区块链 | IPFS 工作原理入门

&#x1f98a;原文&#xff1a;What is the InterPlanetary File System (IPFS), and how does it work? &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 去中心化互联网 尽管万维网是一个全球性的网络&#xff0c;但在数据存储方面&#…

opencv中自定义的双线性二次插值的图像旋转及缩放

自定义的二次插值的图像旋转与缩放#include <iostream> #include<opencv2/opencv.hpp> using namespace cv; using namespace std;void coordinateTransform(Point2d*p4Corner,Point2d*np4Corner,double rotAngle,double gamma,Point2d center) {double cx=center.…

从0到10Wqps,大厂的智能客服平台,如何实现架构演进?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

公共交通无障碍设施:科技翅膀助力盲人出行新飞跃

在城市的脉络中&#xff0c;公共交通扮演着连接每一个角落的重要角色。然而&#xff0c;对于视力受限的盲人朋友而言&#xff0c;这幅繁忙而复杂的交通网络往往隐藏着诸多不易察觉的障碍。值得庆幸的是&#xff0c;随着公共交通无障碍设施的不断完善&#xff0c;以及高科技辅助…

蚂蚁面试:Springcloud核心组件的底层原理,你知道多少?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2&#xff1a;异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得&#xff0c;该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…

x32dbg 手动脱NsPack 壳

记一下步骤 文件名字(太长遂改):1111.exe 文件来源:攻防世界Reverse三星题,crackme 工具选择:下载的文件出现病毒报错,一开始是用OD脱壳,但是修复表的时候,无法运行程序,所以改用x64 脱壳方法:ESP在PE中 在die中发现存在NsPack壳 丢到x32dbg中 找到程序代码入口 F8…

初中中考英语词汇大全003掌握常用词汇,轻松应对考试

PDF格式公众号回复关键字:ZKCH0031 ancient 古代的;古老的 modern 现代的;时髦的 official 官方的;正式的;公务员 foreign 外国的;外来的 2 sooner or later 迟早;早晚有一天 all the time 一直;始终 over and over 一遍又一遍;反复地 in a hurry 匆忙地;立即;很快…

Springboot+Vue+小程序+基于微信小程序护农远程看护系统

开发平台为idea&#xff0c;maven管理工具&#xff0c;Mybatis操作数据库&#xff0c;根据市场数字化需要为农户打造小程序可远程查看农场的种植情况。项目是调试&#xff0c;讲解服务均可有偿获取&#xff0c;需要可在最下方QQ二维码处联系我。 SpringbootVue小程序&#xff…

Java零基础入门到精通_Day 11

1.继承 定义&#xff1a; 继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法 格式&#xff1a; public class 子类 extends 父类{} 子类&#xff1a;也叫派生类 父类&#xff1a;基类/超类 继…

mit6.828 - lab1笔记

安装环境编译qemu1. PC启动 打开两个窗口,在第一个窗口中 make qemu-gdb,会启动内核,但在执行第一个指令之前停下; 在第二个窗口中make gdb,实时观察第一个窗口中的执行过程。从这里可以观察到:IBM PC 在物理地址 0x000ffff0 开始执行, 位于为 ROM BIOS 保留的 64KB 区域…

一加Ace3/12/Ace2pro手机ColorOS14刷KernelSU内核ROOT-解决无限重启变砖

一加Ace3/一加12/一加11等手机升级了安卓14底层&#xff0c;并且ColorOS版本也更新到了14版本界面和功能都比之前的系统表现更加优秀&#xff0c;但刷机方面&#xff0c;相对之前存在一些差异&#xff0c;特别是KernelSU内核级别root权限&#xff0c;不再支持一键刷入KernelSU通…

混入、插件、插槽、vuex、本地存储

【混入】# mixin(混入)功能:可以把多个组件共用的配置提取成一个混入对象,不需要在每个组件中都写了 使用步骤 。 。 。 【插件】1 # 1 写plugins/index.js2 import Vue from "vue";3 import axios from "axios";4 import hunru from "@/mixin&quo…

Python 语音识别系列-实战学习-语音识别特征提取

Python 语音识别系列-实战学习-语音识别特征提取 前言1.预加重、分帧和加窗2.提取特征3.可视化特征4.总结 前言 语音识别特征提取是语音处理中的一个重要环节&#xff0c;其主要任务是将连续的时域语音信号转换为连续的特征向量&#xff0c;以便于后续的语音识别和语音处理任务…

[PS小技能学习]抠图和切图

详情见视频教程&#xff1a;PS小技巧--抠图与切图 今天我们来学习如何使用PS对表情包合辑进行抠图和裁剪保存 1、首先&#xff0c;将图片导入&#xff0c;双击图层新建一个图层 2、然后点击工具栏的魔棒工具&#xff0c;再点击顶部菜单栏的添加到选区 3、点击图片的空白区域即…

Linux进程

程序与进程 程序:是可执行文件,其本质是是一个文件,程序是静态的,同一个程序可以运行多次,产生多个进程 进程:它是程序的一次运行过程,当应用程序被加载到内存中运行之后它就称为了一个进程,进程是动态的,进程的生命周期是从程序运行到程序退出 父子进程:当一个进程A…