基于movie lens-100k数据集的协同过滤算法实现

news2025/1/11 1:33:13

基于movie lens-100k数据集的协同过滤算法实现

数据集处理
基于用户的协同过滤算法的实现
基于物品的协同过滤算法的实现

数据集处理

import pandas as pd

u_data = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.data')
u_genre = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.genre')
u_info = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.info')
# u_item = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.item')
u_occupation = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.occupation')
# u_user = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.user')
u_user = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.user', encoding='GBK', sep='|', names=['user_id', 'age', 'gender', 'occupation', 'zip_code'])

# 加载评分数据集
u_ratings = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u.data', sep='\t', names=['user_id', 'item_id', 'rating', 'timestamp'])

# 合并用户信息(u_user)和评分信息(u_ratings)
u_result = pd.merge(u_user, u_ratings, on='user_id')

# 保存结果到u_result.csv文件
u_result.to_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u_result_text1.csv', index=False)

u_result_sorted = u_result.sort_values(by='user_id')

# 保存结果到 u_result_sorted.csv 文件
u_result_sorted.to_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u_result_sorted.csv', index=False)

文件结构
在这里插入图片描述

基于用户的协同过滤算法的实现

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# 加载处理好的文件
u_result = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u_result_text1.csv')

# 构件用户-物品评分矩阵
ratings_matrix = u_result.pivot_table(index='user_id', columns='item_id', values='rating').fillna(0)
print("评分矩阵:", ratings_matrix)

# 计算用户之间的相似度
user_similarity = cosine_similarity(ratings_matrix)
print("用户之间的相似度矩阵:", user_similarity)
rows = user_similarity.shape[0]
columns = user_similarity.shape[1]
print("矩阵的行数为:", rows)
print("矩阵的列数为:", columns)
def generate_recommendations(ratings_matrix, user_similarity, user_id, k, min_rating_threshold):
    # 找到目标用户已经评分的物品
    rated_items = ratings_matrix.loc[user_id]

    # 找到与目标用户相似度最高的k个邻居用户
    similarities = list(enumerate(user_similarity[user_id]))
    similarities.sort(key=lambda x: x[1], reverse=True)
    neighbors = [x[0] for x in similarities[1:k + 1]]
    print("邻居用户:", neighbors)

    # 汇总邻居用户的评分记录
    neighbor_ratings = ratings_matrix.loc[neighbors]

    # 根据邻居用户的评分记录和预测评分公式生成推荐列表
    recommendations = []
    for item_id, rating in neighbor_ratings.items():
        if rated_items[item_id] == 0:  # 只考虑目标用户未评分过的物品
            prediction = predict_rating(neighbor_ratings, user_similarity, user_id, item_id, k)
            if prediction > min_rating_threshold:  # 添加阈值条件
                recommendations.append((item_id, prediction))
    # print("第一次打印:", recommendations)
    recommendations.sort(key=lambda x: x[1], reverse=True)  # 按照预测评分降序排序
    return recommendations
    # 预测评分公式
def predict_rating(ratings_matrix, user_similarity, user_id, item_id, k):
    numerator = 0  # 分子
    denominator = 0  # 分母

    # 找到与目标用户相似度最高的k个邻居用户
    similarities = list(enumerate(user_similarity[user_id]))
    similarities.sort(key=lambda x: x[1], reverse=True)
    neighbors = [x[0] for x in similarities[1:k + 1]]

    for neighbor in neighbors:
        similarity = user_similarity[user_id][neighbor]
        rating = ratings_matrix.loc[neighbor, item_id]
        numerator += similarity * rating
        denominator += similarity
    if denominator != 0:
        prediction = numerator / denominator
    else:
        prediction = 0
    return prediction

user_id = 98  # 目标用户ID
k = 3  # 邻居数量
min_rating_threshold = 4.0  # 最小预测评分阈值

recommendations = generate_recommendations(ratings_matrix, user_similarity, user_id, k, min_rating_threshold)
# print("预测物品列表:")
print(recommendations)

基于物品的协同过滤算法的实现

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# 加载处理好的文件
u_result = pd.read_csv('D:/PyCharmWorkSpace/ml-100k/ml-100k/u_result_text1.csv')
# 构件物品-用户评分矩阵
ratings_matrix = u_result.pivot_table(index='item_id', columns='user_id', values='rating').fillna(0)
print("评分矩阵:", ratings_matrix)
# 计算物品之间的相似度
item_similarity = cosine_similarity(ratings_matrix)
print("物品之间的相似度矩阵:", item_similarity)

def generate_recommendations(ratings_matrix, item_similarity, user_id, k, min_rating_threshold):
    # 找到目标用户已经评分的物品
    rated_items = ratings_matrix.transpose().loc[user_id]

    # 找到与目标物品相似度最高的k个邻居物品
    similarities = list(enumerate(item_similarity[user_id]))
    similarities.sort(key=lambda x: x[1], reverse=True)
    neighbors = [x[0] for x in similarities[1:k + 1]]
    print("邻居物品:", neighbors)
    # 根据邻居物品的评分记录和预测评分公式生成推荐列表
    recommendations = []
    for neighbor in neighbors:
        neighbor_ratings = ratings_matrix[neighbor]
        for user, rating in neighbor_ratings.items():
            if rated_items[user] == 0:  # 只考虑目标用户未评分过的物品
                prediction = predict_rating(ratings_matrix, item_similarity, user, neighbor, k)
                if prediction > min_rating_threshold:  # 添加阈值条件
                    recommendations.append((user, prediction))

    recommendations.sort(key=lambda x: x[1], reverse=True)  # 按照预测评分降序排序
    return recommendations

# 预测评分公式
def predict_rating(ratings_matrix, item_similarity, user_id, item_id, k):
    numerator = 0  # 分子
    denominator = 0  # 分母
    # 找到与目标物品相似度最高的k个邻居物品
    similarities = list(enumerate(item_similarity[item_id]))
    similarities.sort(key=lambda x: x[1], reverse=True)
    neighbors = [x[0] for x in similarities[1:k + 1]]
    for neighbor in neighbors:
        similarity = item_similarity[item_id][neighbor]
        rating = ratings_matrix[neighbor][user_id]
        numerator += similarity * rating
        denominator += similarity
    if denominator != 0:
        prediction = numerator / denominator
    else:
        prediction = 0
    return prediction
user_id = 98  # 目标用户ID
k = 3  # 邻居数量
min_rating_threshold = 3.3  # 最小预测评分阈值
recommendations = generate_recommendations(ratings_matrix, item_similarity, user_id, k, min_rating_threshold)
print(recommendations)

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

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

相关文章

c: Sorting Algorithms

SortAlgorithm.h /*****************************************************************//*** \file SortAlgorithm.h* \brief 业务操作方法* VSCODE c11 https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/2.selectionSort.md* https://www.programiz.com/d…

vscode软件安装包下载安装教程

目录 一、软件简介 二、软件下载 三、安装步骤 一、软件简介 VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构、查…

BD就业复习第三天

1.连续活跃区间表的实现思路 实现连续活跃区间表是数据仓库中常见的需求,通常用于分析用户或实体在一段时间内的活跃情况。以下是一种可能的实现思路: 1. 数据模型设计: 首先,您需要设计一个数据模型来存储连续活跃区间。通常&a…

9.21算法(栈)

栈 用两个栈实现队列 栈:只允许在一头进行入队和出队,先进后出 队列:只允许一头入队,另一头出队,先进先出 如果先都放入一个栈中,就是倒序的,然后再把第一个栈中的元素依次移动到另一个栈中…

eSIM简介

翻译自eSIM eSIM eSIM被称为许多不同的名字。 有人说嵌入式SIM,有人说电子SIM和其他的说eSIM。 在行业标准最终确定并在该地区广泛采用之前,还会有其他名称出现。 无论我们称之为什么,此SIM的基本思想是将SIM(UICC)作为…

成绩查询解决方案

老师如果想要使用PHP代码创建一个查询系统,可以按照以下步骤进行操作: 建立数据库连接:首先,你需要使用PHP的数据库扩展(如MySQLi或PDO)来建立与数据库的连接。提供数据库的主机名、用户名、密码和数据库名…

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是,过去以为AI智能化、大模型技术是很高深的事情。但现在,我们通过RPA等数字化工具,自主根据自己的工作岗位,完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…

[答疑]角色和状态的区别

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 jeri 2023-9-10 13:09 设备关联角色,设备也有子类(车辆/设备),按书中的解释,设备是一个抽象类,角色类名像是带了状态…

第三天:实现网络编程基于tcp/udp协议在Ubuntu与gec6818开发板之间双向通信

互联网地址 每一台设备接入互联网后,都会举报一个唯一的地址编号 IP地址 INTERNET地址 internet地址 :它是协议上的一个逻辑地址 目前来说,我们主要的IP地址有两类 IPV4 IPV6 IPV4 其实就是使用一个32bit整数作为IP IPV6 其实就是使用一…

#循循渐进学51单片机#实例练习与经验累积#not.9

1、掌握不同类型变量转换的规则与字节操作进行位修改的技巧。 unsigned char a;unsigned int b;unsigned int c; 1)自动类型转换 2)强制类型转换C (unsigned long)a*bl; C (unsigned long)(a*b); 3)不同类型变量的赋值b a …

BabelEdit 5.0.1 Crack

BabelEdit加强软件本地化。BabelEdit 是处理 json、yaml、php、arb、vue、properties、resx 或 xliff 翻译文件的可靠解决方案。 旨在使开发过程更加简化和高效。 下载BabelEdit 5.0.0 对于Windows 也适用于macOS 和 Linux BabelEdit - 适用于 Web 和应用程序的翻译编辑器 (…

ps智能填充功能平替:alpaca的安装和使用

为了解决ps beta 智能填充无法使用的问题,需要用alpaca来平替,下面是安装教程: 安装方法: 1、下载插件。 alpaca插件汉化-夸克网盘https://pan.quark.cn/s/1168b447a44e#/list/share 2、 根据使用的PS版本,选择对应文件…

如何从外网远程控制企业内网电脑?

在企业中,保护公司机密和数据安全是至关重要的。为了确保员工在使用公司电脑时遵守相关规定,许多公司会采取外网监控员工电脑的方法。本文将介绍一些真实有效的方法和具体的操作步骤,以帮助您更好地监控员工电脑。 一、什么是外网监控&#x…

【Redis】Redis 的学习教程(十一)之使用 Redis 实现分布式锁

1. 分布式锁概念 在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统我们可以使用 synchronized 锁、Lock 锁保证线程安全。 synchronized 锁是 Java 提供的一种内置锁,在单个 …

北工大汇编——综合题(1)

题目要求 统计字符数。从键盘输入一行字符,统计字母、空格、数字、其他宇符的个数,并显示。要求:提示输入一行宇符串;键盘输入宇符串,Enter 键结束输入,并换行显示结果。 题目代码 DATAS SEGMENT;此处输…

Node.js 调用 fluent-ffmpeg

最近开发H5资源在线裁剪,最终在资源合成的步骤,选择 ffmpeg 作为合成的插件,记录下使用方式。 一、介绍 ffmpeg 一款跨平台多媒体处理工具,可以进行视频转码、裁剪、合成、音视频提取、推流等操作。 二、安装 Node js 可以利用…

qt+ffmpeg视频播放器实现音视频倍速功能

目录 一、前言 二、开发环境参考源码 开发环境: 参考源码: 三、添加倍速控件 四、倍速调节代码 五、视频倍速调节 六、音频倍速方案一 七、音频倍速方案二 八、最终效果 九、参考文献 十、结语 一、前言 参考了云天之巅的FFMPEG Qt视频播放器…

Tomcat常见报错以及手动实现Tomcat

一.Tomcat的简单启动 1.安装Tomcat 2.Tomcat启动 1. 双击 bin 目录下的 startup.bat 文件 2. 输入 http://localhost:8080/,显示如下界面代表安装成功, 默认在 8080 端口 3. 注意,不要关闭黑窗口,关闭了,tomcat 服务就停止了…

LabVIEW开发基于物联网的多功能功率分析仪

LabVIEW开发基于物联网的多功能功率分析仪 根据技术规则,电气元件网络中的单个被创建为在标称正弦波振动制造频率下运行。失真顺序的电流和电压波与正弦波不同,它们或多或少地扭曲成形状。它是由交流网络中非线性组件的存在引起的,例如静态转…

R语言进行孟德尔随机化+meta分析(1)---meta分析基础

目前不少文章用到了孟德尔随机化meta分析,今天咱们也来介绍一下,孟德尔随机化meta其实主要就是meta分析的过程,提取了孟德尔随机化文章的结果,实质上就是个meta分析,不过多个孟德尔随机化随机化的结果合并更加加强了结…