推荐算法学习记录2.2——kaggle数据集的动漫电影数据集推荐算法实践——基于内容的推荐算法、协同过滤推荐

news2025/1/18 18:49:44

1、基于内容的推荐

        这种方法根据项的相关信息(如描述信息、标签等)和用户对项的操作行为(如评论、收藏、点赞等)来构建推荐算法模型。它可以直接利用物品的内容特征进行推荐,适用于内容较为丰富的场景。‌

#1. 基于内容的推荐算法

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
import pandas as pd


anime = pd.read_csv('./data/archive_2/anime.csv')

# 使用TF-IDF向量化
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(anime['Genres'].fillna(''))

# 计算每个动漫之间的余弦相似度
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

# 创建一个动漫名字到索引的映射
indices = pd.Series(anime.index, index=anime['Name']).drop_duplicates()

# 推荐函数
def content_based_recommendations(title, cosine_sim=cosine_sim):
    idx = indices[title]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:11]
    anime_indices = [i[0] for i in sim_scores]
    return anime['Name'].iloc[anime_indices]

# 示例:推荐与"Cowboy Bebop"相似的动漫
print(content_based_recommendations('Cowboy Bebop'))

 结果如下:

2、协同过滤推荐

这种方法通过分析用户的历史行为和偏好,找出具有相似兴趣的用户群体,然后推荐他们喜欢的物品或内容。协同过滤是一种常见的推荐系统技术,它基于用户的历史行为(例如评分、点击、购买等)来预测用户可能感兴趣的物品。协同过滤主要有两种类型:基于用户的协同过滤和基于物品的协同过滤。

基于用户的协同过滤推荐通过寻找具有相似兴趣的用户来推荐,

基于物品的协同过滤推荐通过寻找具有相似特征的物品来推荐。‌

基于用户的协同过滤
  1. 计算用户相似度

    • 找出与目标用户相似的用户。
    • 常用的相似度度量方法包括余弦相似度、皮尔逊相关系数等。
    • 余弦相似度公式:
    • 其中 u 和 v 是两个用户的评分向量。
  2. 推荐物品:
    • 找出相似用户喜欢但目标用户未评分的物品。
    • 根据相似用户的评分来预测目标用户对这些物品的评分。
    • 推荐评分最高的物品给目标用户.
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from scipy.sparse import csr_matrix
import numpy as np


batch_size = 10000  # 由于内存不够,一次处理10000条信息
num_recommendations = 10  # 推荐10个电影


def process_batch(batch_df, user_item_matrix):
    # 将当前批的数据合并到全局用户-项目矩阵
    batch_pivot = batch_df.pivot(index='user_id', columns='anime_id', values='rating').fillna(0)
    # 合并到全局矩阵
    user_item_matrix = user_item_matrix.add(batch_pivot, fill_value=0)
    return user_item_matrix

# 计算用户之间的相似度
def calculate_similarity(user_item_matrix):
    # 转换为稀疏矩阵
    sparse_user_item_matrix = csr_matrix(user_item_matrix)
    # 计算相似度
    user_similarity = cosine_similarity(sparse_user_item_matrix)
    user_similarity_df = pd.DataFrame(user_similarity, index=user_item_matrix.index, columns=user_item_matrix.index)
    return user_similarity_df

# 生成推荐
def user_based_recommendations(user_id, user_item_matrix, user_similarity_df, anime_df, num_recommendations=10):
    if user_id not in user_item_matrix.index:
        raise ValueError(f"用户ID {user_id} 不在数据中")
    
    # 获取相似用户
    similar_users = user_similarity_df[user_id].sort_values(ascending=False).index[1:]
 
    if len(similar_users) == 0:
        return []

    # 获取相似用户的评分数据
    similar_users_ratings = user_item_matrix.loc[similar_users]

    # 计算推荐得分
    scores = similar_users_ratings.mean(axis=0).sort_values(ascending=False)

    # 获取当前用户已经评分的动漫
    user_watched_animes = user_item_matrix.loc[user_id]
    user_watched_animes = user_watched_animes[user_watched_animes > 0].index

    # 排除当前用户已经看过的动漫
    recommendations = scores.drop(user_watched_animes, errors='ignore')
    
    # 获取前num_recommendations个推荐
    top_recommendations = recommendations.head(num_recommendations).index

    # 确保推荐的动漫在anime数据集中
    top_recommendations = top_recommendations[top_recommendations.isin(anime_df['MAL_ID'])]

    # 获取推荐的动漫名称
    recommended_animes = anime_df[anime_df['MAL_ID'].isin(top_recommendations)]['Name'].values

    return recommended_animes


def main():
    
    anime_df = pd.read_csv('./data/archive_2/anime.csv')
    user_item_matrix = pd.DataFrame()
    for chunk in pd.read_csv('./data/archive_2/rating_complete.csv', chunksize=batch_size):
        user_item_matrix = process_batch(chunk, user_item_matrix)
    
    # 计算用户之间的相似度
    user_similarity_df = calculate_similarity(user_item_matrix)

    # 为用户0推荐动漫
    recommended_animes = user_based_recommendations(0, user_item_matrix, user_similarity_df, anime_df, num_recommendations)
    print("推荐动漫:", recommended_animes)

if __name__ == "__main__":
    main()
基于物品的协同过滤
  1. 计算物品相似度

    • 找出与目标物品相似的物品。
    • 常用的相似度度量方法同样包括余弦相似度、皮尔逊相关系数等。
    • 余弦相似度公式:
    • 其中 i 和 j 是两个物品的评分向量。
  2. 推荐物品
    • 根据用户对相似物品的评分来预测用户对目标物品的评分。
    • 推荐评分最高的物品给用户。

        协同过滤算法的优缺点
优点
  1. 无需领域知识:协同过滤仅依赖于用户的历史行为数据,不需要对物品本身有深入的了解。
  2. 个性化推荐:能够根据用户的兴趣和行为进行个性化推荐,效果较好。
  3. 简单直观:算法相对简单,易于实现和解释。
缺点
  1. 数据稀疏性:在实际应用中,用户对大多数物品没有评分,这会导致评分矩阵非常稀疏,影响推荐效果。
  2. 冷启动问题:对于新用户或新物品,由于缺乏历史数据,协同过滤很难做出准确的推荐。
  3. 扩展性差:当用户和物品数量增加时,计算相似度的开销会显著增加,影响系统性能。

冷启动问题

冷启动问题是指在推荐系统中,无法为新用户或新物品提供高质量的推荐。这是协同过滤算法面临的主要挑战之一。解决冷启动问题的方法包括:

  1. 新用户冷启动

    • 问卷调查:在用户注册时,通过问卷调查获取用户的兴趣偏好。
    • 使用社交网络数据:利用用户的社交网络数据,推测用户的兴趣。
    • 混合推荐:结合内容过滤或基于知识的推荐方法,使用用户的属性和特征进行推荐。
  2. 新物品冷启动

    • 内容过滤:利用物品的内容信息(如标签、描述等)进行推荐。
    • 使用上下文数据:利用物品的上下文数据,如发布日期、类型等,进行推荐。
    • 混合推荐:结合协同过滤与内容过滤,通过物品的内容特征和已有的少量用户反馈进行推荐。

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

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

相关文章

VBA学习(22):动态显示日历

这是在ozgrid.com论坛上看到的一个贴子,很有意思,本来使用公式是可以很方便在工作表中实现日历显示的,但提问者因其需要,想使用VBA实现动态显示日历,即根据输入的年份和月份在工作表中显示日历。 下面是实现该效果的VB…

web、nginx

一、web基本概念和常识 ■ Web:为用户提供的一种在互联网上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。 ■ Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。 ■ Web 应用开发也经过了几…

C#中计算矩阵(数学库下载和安装)

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先…

如何解决C#字典的线程安全问题

前言 我们在上位机软件开发过程中经常需要使用字典这个数据结构,并且经常会在多线程环境中使用字典,如果使用常规的Dictionary就会出现各种异常,本文就是详细介绍如何在多线程环境中使用字典来解决线程安全问题。 1、非线程安全举例 Dictio…

文件搜索 36

删除文件 文件搜索 package File;import java.io.File;public class file3 {public static void main(String[] args) {search(new File("D :/"), "qq");}/*** 去目录搜索文件* param dir 目录* param filename 要搜索的文件名称*/public static void sear…

探索Prefect:Python自动化的终极武器

文章目录 探索Prefect:Python自动化的终极武器背景:自动化的呼唤Prefect:自动化的瑞士军刀安装Prefect:一键启动基础用法:Prefect的五招场景应用:Prefect的实战演练常见问题:Prefect的故障排除总…

字节一面面经

1.redis了解吗,是解决什么问题的,redis的应用? Redis 是一种基于内存的数据库,常用的数据结构有string、hash、list、set、zset这五种,对数据的读写操作都是在内存中完成。因此读写速度非常快,常用于缓存&…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录:如:Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包,…

MyBatis 框架的两大缺点及解决方案

MyBatis 框架的两大缺点及解决方案 1. SQL 编写负担重1.1 缺点概述1.2 解决方案 2. 数据库移植性差2.1 缺点概述2.2 解决方案 💖The Begin💖点点关注,收藏不迷路💖 MyBatis 作为一款广受欢迎的 Java 持久层框架,尽管其…

ssh 显示图形化界面 Error: Can‘t open display

在客户端(你自己的电脑,不是服务器)安装 VcXsrv 直接从 github 上下载 https://github.com/marchaesen/vcxsrv/releases,或者使用 winget 命令 winget install -i vcxsrv在服务器上 ~/.zshrc 中(或 ~/.bashrc&#xf…

【ubuntu系统】在虚拟机内安装Ubuntu

Ubuntu系统装机 描述新装机后的常规配置, 虚拟机使用vbox terminal 打不开 CTRL ALT F3 进入命令行模式(需要返回桌面时CTRL ALT F1)root用户登入cd /etc/default vi locale LANG“en_US” 改成 LANG“en_US.UTF-8”保存修改后&…

YOLOV8替换Lion优化器

YOLOV8替换Lion优化器 1 优化器介绍博客 参考bilibili讲解视频 论文地址:https://arxiv.org/abs/2302.06675 代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py """PyTorch implementation of the Lion …

linux 上源码编译安装 PolarDB-X

PolarDB-X 简介 PolarDB-X 是一款面向超高并发、海量存储、复杂查询场景设计的云原生分布式数据库系统。其采用 Shared-nothing 与存储计算分离架构,支持水平扩展、分布式事务、混合负载等能力,具备企业级、云原生、高可用、高度兼容 MySQL 系统及生态等…

CTF-web基础 HTTP协议

基础 HTTPHypertext Transfer Protocol 超文本链接协议,他是无状态的(每一次请求都是独立的),发出request发给服务器然后返回responce,现在的版本是1.1版本,默认端口80(https是443)…

ubuntu上安装HBase伪分布式-2024年08月04日

ubuntu上安装HBase伪分布式-2024年08月04日 1.HBase介绍2.HBase与Hadoop的关系3.安装前言4.下载及安装5.单机配置6.伪分布式配置 1.HBase介绍 HBase是一个开源的非关系型数据库,它基于Google的Bigtable设计,用于支持对大型数据集的实时读写访问。HBase有…

rust读取csv文件,匹配搜索字符

1.代码 use std::fs::File; use std::io::{BufRead, BufReader}; use regex::{Regex};fn main() {let f File::open("F:\\0-X-RUST\\1-systematic\\ch2-fileRead\\data\\test.csv").unwrap();let mut reader BufReader::new(f);let re Regex::new("45asd&qu…

Stable Diffusion绘画 | 文生图-采样器使用说明

webui 1.9.3版本中,采样器分为“采样方法”、“调度类型”两个选项。 因为采样器选项多,所以需要做一个筛选,保留图像生成效果好的采样器。 老派采样器 可以选择砍掉的采样器: DDIMPLMS 最为推荐保留的采样器: Eul…

Python 实现股票指标计算——LON

LON - 铁龙长线 1 公式 LC : REF(CLOSE,1); VID : SUM(VOL,2)/(((HHV(HIGH,2)-LLV(LOW,2)))*100); RC : (CLOSE-LC)*VID; LONG : SUM(RC,0); DIFF : SMA(LONG,10,1); DEA : SMA(LONG,20,1); LON : DIFF-DEA; LONMA : MA(LON,10); LONT : LON, COLORSTICK; 2 数据准备…

03 库的操作

目录 创建查看修改删除备份和恢复查看连接情况 1. 创建 语法 CRATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification:  CHARACTER SET charset_name  CPLLATE collation_name 说明: 大写的标识关键…

C语言函数传参

文章目录 🍊自我介绍🍊函数传参之值传递🍊函数传参之地址传递🍊函数传参之数组 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍…