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

news2024/11/25 4:30:37

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

电影推荐系统使用了基于**协同过滤(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.coloradmin.cn/o/1827784.html

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

相关文章

国外视频搬运素材去哪里找?可搬运下载国外的素材网站库分享

如果你正在寻找高质量的国外视频素材来提升你的视频制作水平&#xff0c;不用担心&#xff0c;今天我将为大家推荐几个知名的视频素材网站&#xff0c;让你轻松找到理想的素材资源。 蛙学府 首先推荐的是国内非常受欢迎的“蛙学府”。蛙学府是一个综合性网站&#xff0c;专门提…

通过Navicat Premium进行sql文件互转db文件

目录 一、获取原来数据sql文件 二、通过sql文件转换db文件 三、db文件转换成功 一、获取原来数据sql文件 原数据main右键》转储SQL文件》结构和数据》main.sql 二、通过sql文件转换db文件 新建db文件》Navicta》新建SQLite(SQ)》导入db文件》 main右键》运行SQL文件》 mai…

【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】

调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调…

计算机专业:黄金时代是否依旧?

计算机专业&#xff1a;黄金时代是否依旧&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去的几十年里&#xff0c;计算机科…

Adobe设计替代软件精选列表

Adobe软件的替代列表&#xff0c;最初由 XdanielArt 收集&#xff0c;并由社区改进。您可以随意打开问题或拉出请求&#xff0c;或从数据中创建图像(以便于共享)。列表总是按照免费和开源选项的顺序排列&#xff0c;但根据您的用例&#xff0c;它可能不是最佳选择 替代因素 &am…

【Qt】QT textBrowser 设置字体颜色和大小

1. 效果 2. 代码 {ui->methodText->append("<font size9 colorgreen> dddddddddd </font>");ui->methodText->append("<font size9 colorred> vvvvvvvvvv </font>"); }

测试 halcon算子 derivate_gauss 高斯一阶导数卷积

参上了 matlab fileexchange 有人上传了高斯 dx,dy一阶导卷积代码 卷积核的计算我修改成了核元素绝对值求做分母 归一化 和halcon的 derivate_gauss算子的计算结果对别如下 还是不知道怎么做到两者结果一致. 测试图像: 我的: halcon的: 获取两份图像的灰度值到数组并做对应位…

利用机器学习重构视频中的人脸

引言 中国与英国的研究团队携手合作&#xff0c;开创了一种创新的视频面孔重塑技术。这项技术能够以极高的一致性对视频中的面部结构进行逼真的放大和缩小&#xff0c;且避免了常见伪影的产生。 从研究人员选取的YouTube视频样例中可见&#xff0c;经过处理后&#xff0c;女演…

nvm 管理多版本node

因有多个前端项目&#xff0c;不同项目使用的node版本不一样&#xff0c;所以在本地使用nvm管理不同的node版本。 一、安装nvm 1&#xff09;nvm理解 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff…

经销商的生意好坏很大程度上跟这群人有关

可以说经销商企业的营收几乎都是靠业务员跑出来的&#xff0c;无论在什么时期、无论在什么区域、无论什么市场情况、无论销售哪些商品&#xff0c;业务员都是企业销售工作的基础&#xff0c;一方面企业需要通过各种手段去提升业务员工作效率&#xff0c;让他们有能力去获得更多…

《C语言》动态内存管理

文章目录 一、动态内存分配二、关于动态内存开辟的函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误1、对NULL指针的解引用操作2、对动态开辟空间的越界访问3、对非动态开辟内存使用free释放4、释放free释放一块动态开辟的内存的一部分5、对同一块动态内存多…

牛客小白月赛96 解题报告 | 珂学家

前言 题解 A. 最少胜利题数 签到 n1 len(set(input())) n2 len(set(input()))if n1 < n2:n1, n2 n2, n1print (-1 if n1 6 else n1 - n2 1)B. 最少操作次数 思路: 分类讨论 只有-1,0,1,2这四种结果 特判 01, 10 n int(input()) s input()# 枚举 from collectio…

Nginx配置文件详解指令示咧Nginx配置文件深入详解与实战

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

线上教育培训办公系统系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教师管理&#xff0c;学生管理&#xff0c;运营事件管理 教师账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;作业管理&#xff0c;电…

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布&#xff1a; 三、机器学习和数据科学中的均匀分布示例&#xff1a; 3.1 对数正态分布&#xff1a; 3.2 机器学习和数据科学中的对数正态分布示例&#xff1a; 四、 帕累托分布 4.1 什么是幂律&#xff1f; 4.2 机器学习和数据科学中的帕累托分布示例…

atmega8 上传程序

使用icsp 烧写时先关闭串口程序&#xff0c;与串口uart连接相关的电路勿于电脑连接 接触不良 1.使用icsp 上传 1&#xff09;可以直接上传程序 如官方示例blink 或是 serial示例 2&#xff09;可以先烧录bootload 方便下次使用串口上传程序代码 A)使用专门的icsp 上传器上传…

慧天卓特:2024年春夏之季山东旱情干旱监测分析

2024年开春以来&#xff0c;山东省平均降水量较常年同期偏少92.8%&#xff0c;同时受高温天气影响&#xff0c;山东出现了阶段性气象旱情。截至6月10日&#xff0c;山东省农作物受旱面积121.5万亩&#xff0c;农田缺墒面积262.4万亩。为全力抗旱保夏种&#xff0c;山东自5月29日…

datax的安装及使用入门

1 下载解压Datax tar包 下载到自己指定的安装目录 #wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 进行解压 tar -zxvf datax.tar.gz 2 Datax验证 #修改datax/bin目录下datax.py的权限 chmod 777 datax/bin/datax.py 2.1运行官方给定的任务…

代理设计模式,框架AOP思想

文章目录 引言&#x1f92a;代理对象(Proxy)如何开发一个代理对象开发中的业务层代码冗余问题开发静态代理类动态代理 引言&#x1f92a; 代理 (proxy) &#xff0c;举个生活中常见的现象&#xff0c;在之前网路还未走进大众的时代里&#xff0c;如果我们想买一些东西&#xf…

从零开始:打造你的MySQL数据库环境

mysql下载与安装全教程 mysql简介下载安装MSI下载安装ZIP下载解压缩my.ini文件环境变量启动mysql 主页传送门 &#xff1a; &#x1f4c0; 传送 mysql简介 MySQL是一个关系型数据库管理系统&#xff0c;它是最流行的关系型数据库管理系统之一。   MySQL是一种连接型数据库&a…