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

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

电影推荐系统使用了基于**协同过滤(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部电影作为推荐结果。
    • 使用优先队列来存储和排序未评分的电影,确保获取得分最高的电影。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全:什么是SQL注入

文章目录 网络安全&#xff1a;什么是SQL注入引言SQL注入简介工作原理示例代码 攻击类型为什么SQL注入危险结语 网络安全&#xff1a;什么是SQL注入 引言 在数字化时代&#xff0c;数据安全成为了企业和个人最关心的问题之一。SQL注入&#xff08;SQL Injection&#xff09;是…

vue大作业-实现学校官网

vue大作业-实现学校官网 基于vue2实现的学校官网 项目展示 学校官网介绍 欢迎访问我们学校的官方网站&#xff0c;这里为您提供了全面的信息和资源&#xff0c;帮助您更好地了解我们的教育理念、教学资源和学术活动。 首页 首页是您了解我们学校的起点。这里展示了学校的最…

0基础也能轻松玩转首尔哦,柯桥零基础韩语培训

不会韩语的姐妹们千万不要担心来韩国语言不通很麻烦&#xff01;&#x1f609; 教你们5招&#xff0c;0基础也能轻松玩转首尔哦&#xff01;&#x1f1f0;&#x1f1f7;&#x1f495; . &#x1f4cd;Tip 1&#xff1a;使用翻译App&#xff0c;说好不说坏&#xff01; 本人亲测…

windows下 nodejs升级版本

使用n升级node,需要安装git或安装linux支撑组件&#xff0c;后来在网上找资料 直接下载node.exe覆盖原文件即可。 升级步骤如下&#xff1a; 1.查看当前node版本 node -v 2.下载相应版本的nodejs,网址是nodejs下载&#xff0c;找个你想要的版本下载node.exe 3.找到你node的安装…

linux——ansible实验

要求 0.进入servera进行准备工作&#xff0c;做一些清理 1&#xff09;停止httpd服务&#xff0c;清除httpd软件包、配置文件、主页文件 2&#xff09;清理/etc/hosts文件中的内容&#xff0c;只保留最上面默认的两行 &#xff08;127.0.0.1和::1这两行&#xff09; 1.根据之前…

HarmonyOS【ArkUI组件--TextInput】

1.文本输入框基本用法 2. 使用文本输入框组件&#xff08;如何实现输入数字改变图片大小&#xff09; 在此博客的基础上继续编写&#xff1a;HarmonyOS【ArkUI组件--Text】-CSDN博客 ①代码如下&#xff1a; import font from ohos.font Entry Component struct Index {State …

4、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来&#xff0c;从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数&#xff08;如焦距、主点、畸变等&#xff09;和外部参数&#xff08;如相机位置、朝向等&#xff09…

⌈ 传知代码 ⌋ LLaMA 开放高效基础语言模型

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

利用DeepFlow解决APISIX故障诊断中的方向偏差问题

概要&#xff1a;随着APISIX作为IT应用系统入口的普及&#xff0c;其故障定位能力的不足导致了在业务故障诊断中&#xff0c;APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入&#xff0c;还可能使诊断方向“背道而驰”&#xff0c;从而导致业务故障“…

mellanox HCA IB网卡固件更新

注意事项&#xff1a; 1.如果PSID以SGN开头&#xff0c;说明该产品是曙光的OEM产品&#xff0c;可以向HPC高速网络部获取固件。如果PSID以MT开头&#xff0c;说明该产品是Mellanox或nvidia的标准产品&#xff0c;可以通过官网下载固件。 2.通过官网获取固件&#xff0c;一定要…

Qt项目学习-20240617

Qt项目学习 1.0 文件构建 1.1 预处理命令 C预处理命令是编译过程中的第一步&#xff0c;发生在编译器进行实际编译之前。预处理器&#xff08;preprocessor&#xff09;执行这些命令&#xff0c;它们不是C语言的一部分&#xff0c;但对源代码的编译过程至关重要。以下是一些常…

强大的视角:介绍 MinIO 企业对象存储可观察性

可观测性革命推动了计算、安全、基础设施和可审计性方面的巨大进步。企业可观测性提供对云原生系统的全面和精细的可见性&#xff0c;以更快地识别和解决问题。遥测数据&#xff08;指标、日志、跟踪、运行状况检查&#xff09;可以实时显示和关联&#xff0c;从而提供从最高管…

一季度直播6000场,同比增长60%,遥望科技透露重要信息

6月17日&#xff0c;经由深圳证券交易所许可&#xff0c;遥望科技&#xff08;股票代码&#xff1a;002291&#xff09;正式对《年报问询函》进行公开回复&#xff0c;就经营的多个维度做出解释和回应。 在回复中&#xff0c;遥望科技预测2024年毛利率为14.4%&#xff0c;相比…

web系统数据库敏感数据处理

一、前言 web系统数据库中保存的公民信息不允许明文存储&#xff0c;比如手机号&#xff0c;身份证号&#xff0c;收货地址等。 二、处理方式 数据库中密文存储&#xff0c;web通过注解的方式对数据加解密处理&#xff0c;下面是处理方法 1、编写接口 public interface E…

高考志愿填报,是选好专业,还是选好学校?过来人给你说说

分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 到底是先选专业还是先选学校&#xff0c;是让考生及家长一直拿不准、辨不清的问题&#xff0c;是优先考虑学校还是专业&#xff0c;上了好学校&#xff0c;专业不喜欢就业前景不理想&#xff0c;怎么办&#xff1f;为…

【二】【QT开发应用】QMake和CMake介绍,GN,QT三个窗口类的区别,QMainWindow, QWidget,QDialog

QMake和CMake介绍 qmake&#xff1a;qt独有的代码构建工具, 是一种简洁的构建工具&#xff0c;主要用于生成 Qt 项目的跨平台编译配置文件&#xff0c;语法简单&#xff0c;适合小型和中型项目。 cmake&#xff1a;C通用的代码构建工具&#xff0c;绝大部分C开源项目都使用cm…

【Ubuntu服务器】Ubuntu服务器用户添加及samba用户配置

前言 本文章描述ubuutu服务器上用户添加方式、sudo权限配置及samba用户配置 用户添加 用户添加 该操作是需要 root账户 或者 有sudo权限的普通账户 操作。 例如&#xff0c;添加名为test的用户。 rootanon:~# adduser test Adding user test ... Adding new group test (1…

文心一言 VS 讯飞星火 VS chatgpt (284)-- 算法导论21.2 2题

二、对定理 21.1 的整体证明进行改造&#xff0c;得到使用链表表示和加权合并启发式策略下的 MAKE-SET 和 FIND-SET 的摊还时间上界为 O(1)&#xff0c;以及 UNION 的摊还时间上界为 O(lgn)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在Go语言中实现使用链…

二进制数转字符串

题目链接 二进制数转字符串 题目描述 注意点 32位包括输出中的 “0.” 这两位题目保证输入用例的小数位数最多只有 6 位 解答思路 将小数转为二进制的思路是将小数乘2&#xff0c;如果整数部分为1&#xff0c;则说明第i位是1&#xff08;第i位则乘了2的几次方&#xff09;…

Linux UFW防火墙设置、案例教程及注意事项

背景 远程连接服务器时&#xff0c;发现SSH远程登录服务器失败&#xff0c;但是又可以Ping通&#xff0c;故服务器的是开启的。 sudo systemctl status sshd查看sshd的状态发现其是active&#xff0c;所以为什么一直SSH失败呢&#xff1f; 最后知道是有人启动了防火墙&#x…