基于协同过滤算法的电影推荐
基于协同过滤算法的电影推荐
电影推荐系统使用了基于**协同过滤(Collaborative Filtering)的算法来生成推荐。具体来说,使用了基于用户的协同过滤(User-Based Collaborative Filtering)**算法,步骤如下:
- 数据预处理:将用户对电影的评分数据读入内存,形成一个用户-电影评分矩阵。
- 相似度计算:使用余弦相似度计算目标用户与其他用户之间的相似度。
- 评分预测:根据相似度和其他用户的评分,对目标用户未评分的电影进行评分预测。
- 生成推荐:选取评分预测值最高的前N部电影作为推荐结果。
以下是详细的代码及其解释:
package com.sf;import java.util.*;public class MovieRecommendation {// 示例评分矩阵// 行表示用户,列表示电影// 元素值表示用户对电影的评分,0表示未评分static double[][] ratings = {{4, 0, 0, 5, 1, 0, 0},{5, 5, 4, 0, 0, 0, 0},{0, 0, 0, 2, 4, 5, 0},{0, 3, 0, 0, 0, 0, 3}};// 计算两个用户之间的余弦相似度public static double cosineSimilarity(double[] user1, double[] user2) {double dotProduct = 0.0;double normUser1 = 0.0;double normUser2 = 0.0;for (int i = 0; i < user1.length; i++) {dotProduct += user1[i] * user2[i]; // 计算点积normUser1 += Math.pow(user1[i], 2); // 计算用户1的向量模normUser2 += Math.pow(user2[i], 2); // 计算用户2的向量模}return dotProduct / (Math.sqrt(normUser1) * Math.sqrt(normUser2)); // 返回余弦相似度}// 为特定用户生成电影推荐public static List<Integer> recommendMovies(int userId, int topN) {double[] userRatings = ratings[userId]; // 获取目标用户的评分数据double[] similarityScores = new double[ratings.length]; // 用于存储相似度得分// 计算目标用户与其他所有用户的相似度得分for (int i = 0; i < ratings.length; i++) {if (i != userId) {similarityScores[i] = cosineSimilarity(userRatings, ratings[i]);}}// 计算每部电影的加权得分double[] weightedScores = new double[ratings[0].length];for (int i = 0; i < ratings.length; i++) {if (i != userId) {for (int j = 0; j < ratings[i].length; j++) {weightedScores[j] += similarityScores[i] * ratings[i][j]; // 累加加权得分}}}// 创建一个优先队列,用于存储按得分排序的电影PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> Double.compare(weightedScores[b], weightedScores[a]));// 将未评分的电影加入优先队列for (int i = 0; i < userRatings.length; i++) {if (userRatings[i] == 0) {pq.offer(i);}}// 获取前N部推荐电影List<Integer> recommendedMovies = new ArrayList<>();for (int i = 0; i < topN && !pq.isEmpty(); i++) {recommendedMovies.add(pq.poll());}return recommendedMovies;}public static void main(String[] args) {int userId = 0; // 假设我们为用户ID 0 生成推荐int topN = 3; // 推荐前3部电影List<Integer> recommendations = recommendMovies(userId, topN);// 输出推荐结果System.out.println("推荐给用户 " + userId + " 的电影ID是:" + recommendations);}
}
详细解释
-
数据预处理:代码中的
ratings
矩阵是用户对电影的评分数据。行表示不同的用户,列表示不同的电影,元素值表示评分,0表示该用户未对该电影评分。 -
余弦相似度计算:
cosineSimilarity
方法用于计算两个用户之间的相似度。公式如下:其中,A 和 B 是两个用户的评分向量。
-
评分预测和加权得分:
- 对于目标用户,计算其与其他所有用户的相似度得分。
- 使用这些相似度得分和其他用户的评分,计算每部电影的加权得分。加权得分越高,表明该电影越可能受到目标用户的喜爱。
-
生成推荐:
- 将目标用户未评分的电影按加权得分排序,选取得分最高的前N部电影作为推荐结果。
- 使用优先队列来存储和排序未评分的电影,确保获取得分最高的电影。
通过以上步骤,推荐系统可以为目标用户生成个性化的电影推荐列表。
相关文章:

基于协同过滤算法的电影推荐
基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤(Collaborative Filtering)的算法来生成推荐。具体来说,使用了基于用户的协同过滤(User-Based Collaborative Filtering)**算法,步骤如下&am…...

IEEE754、linear11、linear16浮点数应用原理
IEEE754、linear11、linear16浮点数应用原理 1 浮点数应用1.1 IEEE754 浮点数标准1.2 PMBUS浮点数格式 2 浮点数原理2.1 IEEE754 浮点数解析2.2 PMBUS浮点数解析 3 浮点数代码应用3.1 IEEE754 浮点数应用3.1.1 将浮点变量赋值,直接打印整型(32位…...

6、 垃圾回收 浏览器事件循环
垃圾回收 & 浏览器事件循环 垃圾回收引用计数算法标记清除(mark-sweep)算法标记整理(Mark-Compact)算法 内存管理浏览器事件循环宏任务微任务整体流程 垃圾回收 垃圾回收,又称为:GC(garbag…...

Java多线程面试重点-2
16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法,是对类进行加锁(Class对象),如果该类中有methodA和methodB都是被Synch修饰的静态方法,此时有两个线程T1、T2分别调用methodA()和methodB()&#x…...

LLaMA Factory多卡微调的实战教程(持续更新)
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
IOUtils的妙用
查看IOUtils的api文档,它的方法大部分都是重载的,方法的用法总结如下: 方法名使用说明buffer将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小closeQueitly关闭流contentEquals比较两个流中的内容的是否一致copy将输入…...

目标检测——室内服务机器人LifelongSLAM数据集
引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …...

Mysql学习笔记-进阶篇
一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是库的,所以存储引擎也可被称为表类型。 1)在创…...

AI写真:ControlNet 之 InstantID
但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好,SDXL 模型上的表现较差,不能用于实际生产。可是很多同学已经在使用SDXL了,而且SDXL确实整体上出图效果更好,怎么办? 这篇文章就来给大家介绍一个在SDXL中创作A…...

单元测试的思考与实践
1. 什么是单元测试 通常来说单元测试,是一种自动化测试,同时包含一下特性: 验证很小的一段代码(业务意义 或者 代码逻辑 上不可再分割的单元),能够更准确的定位到问题代码的位置 能够快速运行(…...
C# Socket通讯简单Demo
C# Socket通讯简单Demo Client端Listener端 Client端 static void Main(string[] args) {XSocketService XSocketService new XSocketService();XSocketService.Init();while (true){Console.Write("请输入消息:");var msg Console.ReadLine();XSocket…...

视频融合共享平台LntonCVS视频监控管理平台技术方案详细介绍
LntonCVS国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲…...

C#ListView的单元格支持添加基本及自定义任意控件
功能说明 使用ListView时,希望可以在单元格显示图片或其他控件,发现原生的ListView不支持,于是通过拓展,实现ListView可以显示任意控件的功能,效果如下: 实现方法 本来想着在单元格里面实现控件的自绘的…...

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践
随着企业业务的不断发展,数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长,普遍选择采用分库分表技术作为应对方案。然而,这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1:难以保证数据一致性。由于分库分…...

3个火火火的AI项目,开源了!
友友们,今天我要给你们安利三个超酷的开源项目,它们都和AI有关,而且每一个都能让你的日常生活变得更加有趣和便捷!(最近AI绘图又又超神了,分享以下美图养眼) 01 字节出品,文字转语音Seed-TTS 字节推出了一…...
算法 | 子集数排列树满m叉树二分搜索归并排序快速排序
子集树:O(2^n) 一个序列的所有子集为2^n,即可看成具有2^n个叶节点的满二叉树 int backtrack(int k) //k表示扩展结点在解空间树中所处的层次 {if(k>n) //n标识问题的规模output(x); //x是存放当前解的一维数组if(constraint(k)…...

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库,支持多种缓存方案和缓存策略,主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性,可以根据需求选择合适的缓存方案。 JetCache 的主…...

游戏开发丨基于PyGame的消消乐小游戏
文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容:基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…...

软件项目管理概述
1.什么是项目? 2.项目管理的定义 3.项目管理的本质 4.项目成功的标志 5.项目管理的基本方法 6.项目的生命周期(启动 计划 执行 控制 结束) 7.结合生活中的某件事,谈谈项目管理的作用 项目管理在日常生活中扮演着重要的角色&…...

FastAdmin后台开发框架 lang 任意文件读取漏洞复现
0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架,专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建,拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率,降低开发成本,…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...