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

2023-09-19 19:19:01

基于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)

更多推荐

【从0学习Solidity】17. 库合约 站在巨人的肩膀上

【从0学习Solidity】17.库合约站在巨人的肩膀上博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没饭吃的学习汇报系

RHCE---时间服务器

文章目录目录文章目录前言一.安装时间服务器软件初始化系统二.配置时间服务器的服务端三.配置时间服务器的客户端四.远程连接服务器前言Linux中的时间服务器是指NTP服务器,NTP是NetworkTimeProtocol的缩写,即网络时间协议。NTP服务器可以提供精确的时间信息,从而使得网络上的所有设备都能够同步时间,确

表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇

悟纤:师傅,脑瓜疼~师傅:徒儿这是怎么了?​悟纤:师傅,你了解冷暴力吗?师傅:略懂略懂。悟纤:那冷暴力是怎么定义的?师傅:冷暴力是暴力的一种,其表现形式多为通过冷淡、轻视、放任、疏远和漠不关心,致使他人精神上和心理上受到侵犯和伤害。冷暴力是目前为社会公认的会对行为相对人造成心理、精神伤害的行为。悟纤:有点抽象呢。师傅:

爬虫代理在数据采集中的应用详解

随着互联网技术的不断发展,数据采集已经成为了各个行业中必不可少的一项工作。在数据采集的过程中,爬虫代理的应用越来越受到了重视。本文将详细介绍爬虫代理在数据采集中的应用。什么是爬虫代理?爬虫代理是指利用代理服务器来隐藏真实的IP地址,从而保护数据采集者的隐私和安全。在数据采集中,使用爬虫代理可以带来以下几个好处:防止被封

QT之QListWidget的介绍

QListWidget常用成员函数1、成员函数介绍2、例子显示图片和按钮的例子1、成员函数介绍1)QListWidget(QWidget*parent=nullptr)构造函数,创建一个新的QListWidget对象。2)voidaddItem(constQString&label)在列表末尾添加一个项目,项目标签为l

【python百炼成魔】Python循环语句:嵌套循环

前言文章目录前言嵌套循环嵌套的用途嵌套循环案例1.输出一个三行四列的矩形2.打印直角三角形3.写一个九九乘法表总结嵌套循环Python中的嵌套循环是指在一个循环体内部包含另一个循环。通过嵌套循环,我们可以在外部循环的每次迭代中,执行内部循环的所有迭代。嵌套循环可以帮助我们处理一些复杂的问题。嵌套循环的逻辑:forxin

算法leetcode|76. 最小覆盖子串(rust重拳出击)

文章目录76.最小覆盖子串:样例1:样例2:样例3:提示:进阶:分析:在这里插入图片描述题解:rust:go:c++:python:java:76.最小覆盖子串:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。注意:对于t中重复字符,我们寻找的子

外包干了2个月,技术退步明显...

先说一下自己的情况,大专生,19年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年8月份,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试,已经让我变得不思进取,谈了2年的女朋友也因为我的心态和工资和我分手了。于是,我决定要改变现状,冲击下大厂。刚开始准备

[C/C++]天天酷跑超详细教程-中篇

个人主页:北·海🎐CSDN新晋作者🎉欢迎👍点赞✍评论⭐收藏✨收录专栏:C/C++🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗天天酷跑,一款童年游戏,主要是进行跳跃操作,和躲避障碍物,中篇主要实现人物的下蹲,随机障碍物的生成以及优化main函数里面的sleep(30)一.

Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,

「作者主页」:士别三日wyx「作者简介」:CSDNtop100、阿里云博客专家、华为云享专家、网络安全领域优质创作者「推荐专栏」:小白零基础《Python入门到精通》xlwings模块详解1、快速入门1、打开Excel2、创建工作簿2.1、使用工作簿2.2、操作工作簿3、创建工作表3.1、使用工作表3.2、操作工作表3

C语言练习题解析:挑战与突破,开启编程新篇章!(3)

💓博客主页:江池俊的博客⏩收录专栏:C语言刷题专栏👉专栏推荐:✅C语言初阶之路✅C语言进阶之路💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论📝收藏⭐文章目录🌴选择题🌴编程题📌记负均正📌旋转数组的最小数字🎈前言:本专栏每篇练习将包括5个选择题+2个编程题,将涵盖C语言的不同方面,包括基础语法、数据

热文推荐