基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐

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

  1. 数据预处理:将用户对电影的评分数据读入内存,形成一个用户-电影评分矩阵。
  2. 相似度计算:使用余弦相似度计算目标用户与其他用户之间的相似度。
  3. 评分预测:根据相似度和其他用户的评分,对目标用户未评分的电影进行评分预测。
  4. 生成推荐:选取评分预测值最高的前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);}
}

详细解释

  1. 数据预处理:代码中的 ratings 矩阵是用户对电影的评分数据。行表示不同的用户,列表示不同的电影,元素值表示评分,0表示该用户未对该电影评分。

  2. 余弦相似度计算cosineSimilarity 方法用于计算两个用户之间的相似度。公式如下:

    在这里插入图片描述

    其中,A 和 B 是两个用户的评分向量。

  3. 评分预测和加权得分

    • 对于目标用户,计算其与其他所有用户的相似度得分。
    • 使用这些相似度得分和其他用户的评分,计算每部电影的加权得分。加权得分越高,表明该电影越可能受到目标用户的喜爱。
  4. 生成推荐

    • 将目标用户未评分的电影按加权得分排序,选取得分最高的前N部电影作为推荐结果。
    • 使用优先队列来存储和排序未评分的电影,确保获取得分最高的电影。

通过以上步骤,推荐系统可以为目标用户生成个性化的电影推荐列表。

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

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

相关文章

【html】如何利用id选择器实现主题切换

今天给大家介绍一种方法来实现主题切换的效果 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

MacOS - 3 招快速去除桌面上的图标文件

在平时用 Mac 电脑的时候&#xff0c;会产生许多我们不用的或废弃的图标、文件&#xff0c;在 Mac 桌面上显得很乱&#xff0c;不仅影响美观也直接影响了我们工作的心情。下面我们分享 3 招快速去除桌面上的图标或文件的方法&#xff0c;有需要的朋友可以试一试。 1. 右键删除&…

移动硬盘分区误删?专业恢复策略与预防措施

一、认识移动硬盘分区误删 在使用移动硬盘时&#xff0c;有时我们可能会遇到分区误删的情况。这通常指的是由于某种原因&#xff0c;用户错误地删除了移动硬盘上的某个分区&#xff0c;导致该分区内的所有数据丢失。分区误删是一种常见的数据丢失问题&#xff0c;对于用户来说…

【深度学习】Loss为Nan的可能原因

文章目录 1. 问题情境2. 原因分析3. 导致Loss为Nan的其他可能原因 1. 问题情境 在某个网络架构下&#xff0c;我为某个数据项引入了一个损失函数。 这个数据项是nn.Embedding类型的&#xff0c;我加入的损失函数是对nn.Embedding空间做约束。 因为我在没加入优化loss前&#x…

nodejs爬虫小红书评论区

发现好像还是爬虫的知识热度比较高&#xff0c;最近一直在加强JS这块。这两天脚本模拟爬BOSS的时候也想着怎么用nodejs&#xff0c;昨天都没更新文章&#xff0c;Q-Q&#xff0c;因为一直failed没啥成果。 使用模块 这边可以看到使用的模块其实也挺多&#xff0c;但主要还是ht…

邮件钓鱼--平台框架-优化内容效率-Gophish项目

免责声明:本文仅做技术交流与学习... 目录 邮箱伪造发信人与转发邮箱-不同就会报错 Gophish项目: 1-配置发件接口&#xff08;自定义&#xff09; 2-配置发信模版&#xff08;更逼真&#xff09;? 3-配置触发页面&#xff08;钓鱼用&#xff09; 4-配置用户和组(可单可批…

go context 源码刨析(一)

Context 上下文context.Context 是用来设置截止时间、同步信号&#xff0c;传递请求相关值的结构体。 context.Context 定义了四个需要实现的方法&#xff1a; Deadline: 返回 context.Context 被取消的时间。Done: 返回一个 Channel&#xff0c;这个 Channel 会在当前工作完…

密码学及其应用 —— 密码学概述

1 安全属性和机制 1.1 基本概念 1.1.1 三个核心概念 在讨论信息安全时&#xff0c;我们通常会谈到三个核心概念&#xff1a;保密性、完整性和可用性。这三个概念共同构成了信息安全的基础。 保密性&#xff1a;指的是确保信息只能被授权的人员访问。这就意味着信息在存储、传…

【scrapy】爬虫,从429状态码说起

许久未爬&#xff0c;发现爬不动了&#xff0c;哈哈哈&#xff0c;记录下这次失败的爬取经历 问题描述 针对这样的一个网站&#xff1a; https://www.farfetch.cn/cn/shopping/women/dresses-1/items.aspx?page1&view96&sort3 需求&#xff1a; 1.需要爬取列表页…

任务3.8.3 利用RDD统计每日新增用户

任务目标 统计给定用户访问历史数据中&#xff0c;每日的新增用户数量。 数据准备 原始数据格式&#xff1a;每行包含两个字段&#xff0c;日期和用户名&#xff0c;以逗号分隔。示例数据&#xff1a;2024-05-01,mike 2024-05-01,alice 2024-05-01,brown ...解决方案 使用倒…

解读自然语言处理:技术、应用与未来展望

引言 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是计算机科学、人工智能和语言学的一个跨学科领域&#xff0c;致力于实现人与计算机之间通过自然语言进行有效沟通的能力。NLP 的核心任务是理解、解释和生成人类语言&#xff0c;使计…

C的I/O操作

目录 引言 一、文件与目录操作 1. 打开与关闭文件 2. 文件读写操作 3. 文件定位与错误处理 二、字符流与字节流 1. 字符流处理 2. 字节流处理 三、序列化与反序列化 1. 序列化 2. 反序列化 四、新的I/O&#xff08;NIO&#xff09; 表格总结 文件与目录操作 字符…

postman教程-19-mock测试

上一小节我们学习了Postman接口参数化方法&#xff0c;本小节我们讲解一下Postman mock测试的方法。 一、什么叫mock测试 mock测试就是在测试过程中&#xff0c;对某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便于测试的一种测试方法&#xff0c…

unity38——MemoryProfiler性能分析器,截帧分析当前性能占用率的具体文件

定义&#xff1a;性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备&#xff0c;从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器&#xff0c;从而在开…

【elementui源码解析】如何实现自动渲染md文档-第二篇

目录 1.概要 2.引用文件 1&#xff09;components.json 2&#xff09;json-template/string 3&#xff09;os.EOL 3.变量定义 4.模版填充 5.MAIN_TEMPLATE填充 6.src下的index.js文件 1&#xff09;install 2&#xff09;export 7.总结 所有章节&#xff1a; 【el…

【MongoDB 新搭档 Kafka】

对于做过数据处理&#xff0c;使用过消息队列的小伙伴 &#xff0c;Kafka可以算是老朋友了&#xff0c;但是最近一个场景下&#xff0c;新的用法&#xff0c;让其变为了MongoDB的新搭档。 开始 从一个问题开始&#xff0c;熟悉MongoDB的小伙伴&#xff0c;可能使用过changeSt…

React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装

文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装&#xff0c;将用到上篇封装的模态框Modal组件。有时在前台项目中&#xff0c;偶尔要用到一两个常用的组件&#xff0c;如 弹窗&#x…

safari浏览器无法连接到服务器

问题&#xff1a;MacBook pro&#xff0c;网络连接正常&#xff0c;可以使用各种软件上网&#xff0c;唯独safari浏览器打不开网页&#xff0c;报错说Safari无法连接到服务器&#xff1b; 原因&#xff1a;使用了VPN&#xff0c;VPN自动更改了网络设置&#xff0c;导致Safari浏…

Java的三个接口Comparable,Comparator,Cloneable(浅拷贝与深拷贝)

Comparable 当我们要进行对象的比较的时候&#xff0c;我们是不能直接用>、< 这些符号直接进行比较的。 由于这是引用类型变量也是自定义类型变量&#xff0c;直接进行比较的时候&#xff0c;我们是通过对象的地址进行比较的&#xff0c;我们可以使用、! 进行两个对象的…

高考分数限制下,选好专业还是选好学校?

高考分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 高考作为每年一度的盛大考试&#xff0c;不仅关乎学生们的未来&#xff0c;更承载了家庭的期望。2004年高考刚刚结束&#xff0c;许多考生和家长已经开始为填报志愿而焦虑。选好学校和专业&#xff0c;直接关系到…