数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐

推荐系统在现代应用中占据了重要地位,尤其在电影、音乐等个性化内容推荐中广泛使用。本文将介绍如何使用数据预处理、特征工程以及多种推荐算法(包括协同过滤、基于内容的推荐、混合推荐等)来实现电影推荐系统。通过Pandas、Scikit-learn、TensorFlow等工具,我们将展示如何从数据清洗开始,逐步实现各类推荐算法。

 完整项目代码:

基于协同过滤的电影推荐系统

一、数据预处理

数据预处理是机器学习中的关键步骤,它决定了模型能否正确理解数据。在本项目中,我们处理的电影数据具有多值类别型特征(如国家、语言、类型)、文本特征(如导演、演员等),以及数值型特征(如评分、票数等)。因此,合理的特征处理能够提升推荐效果。

1. 加载数据与处理缺失值

我们首先加载数据并对缺失值进行填充,确保数据完整性。

df.fillna({'rating': df['rating'].mean(),'vote': df['vote'].median(),'runtime': df['runtime'].median(),'country': "['Unknown']",'language': "['Unknown']",'genre': "['Unknown']",'director': "['Unknown']",'composer': "['Unknown']",'writer': "['Unknown']",'cast': "['Unknown']"
}, inplace=True)
2. 多值类别型特征的处理

对于国家、语言和类型等多值类别型特征,我们使用 MultiLabelBinarizer 进行独热编码,将其转换为模型能够处理的数值型数据。

mlb_country = MultiLabelBinarizer()
country_encoded = mlb_country.fit_transform(df['country'])
mlb_language = MultiLabelBinarizer()
language_encoded = mlb_language.fit_transform(df['language'])
mlb_genre = MultiLabelBinarizer()
genre_encoded = mlb_genre.fit_transform(df['genre'])
3. 文本特征的处理

对于电影的文本特征,如导演、演员等,我们使用 TfidfVectorizer 来生成TF-IDF向量。这种方法可以将文本数据转化为数值特征,以便后续分析和建模。

4. 数值型特征标准化

为了消除数值型特征的量纲差异,我们对评分、票数等特征进行标准化处理。

scaler = StandardScaler()
scaled_numeric_features = scaler.fit_transform(df[['year', 'rating', 'vote', 'runtime']])
5. 合并所有特征

将所有经过处理的特征合并,形成最终的特征矩阵。

processed_features = np.hstack([country_encoded, language_encoded, genre_encoded,cast_tfidf, scaled_numeric_features
])
二、推荐算法实现
1. 协同过滤算法

协同过滤是一种基于用户行为相似性的推荐方法。在此,我们首先创建用户-电影评分矩阵,并基于余弦相似度计算用户之间的相似度。

user_movie_ratings = df.pivot_table(index='user_id', columns='title', values='rating', fill_value=0)
similarity_matrix = cosine_similarity(user_movie_ratings)
similarity_matrix_df = pd.DataFrame(similarity_matrix, index=user_movie_ratings.index, columns=user_movie_ratings.index)

然后,利用相似用户的评分为目标用户推荐电影。

def recommend_movies(user_id, num_recommendations=5):user_ratings = user_movie_ratings.loc[user_id]unseen_movies = user_ratings[user_ratings == 0].index.tolist()weighted_ratings = np.dot(similarity_matrix_df[user_id].values, user_movie_ratings[unseen_movies].values) / similarity_matrix_df[user_id].sum()movie_scores = dict(zip(unseen_movies, weighted_ratings))return sorted(movie_scores.items(), key=lambda x: x[1], reverse=True)[:num_recommendations]
2. 基于内容的推荐

基于内容的推荐算法通过计算电影特征之间的相似性来推荐类似的电影。我们首先合并电影的文本特征(如类型、导演、演员),然后使用TF-IDF来计算相似度。

df['combined_features'] = df['kind'] + " " + df['genre'].apply(lambda x: " ".join(eval(x))) + " " + df['director'].fillna('') + " " + df['cast']
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf_vectorizer.fit_transform(df['combined_features'])
cosine_sim = cosine_similarity(tfidf_matrix)

然后,为特定电影生成基于内容的推荐。

def recommend_based_on_content(movie_title, k=5):similar_scores = cosine_sim_df[movie_title]top_items_indices = similar_scores.argsort()[-k-1:-1][::-1]return df['title'].iloc[top_items_indices]
3. 混合推荐算法

混合推荐算法结合了基于内容和协同过滤的优点。我们通过对内容相似度和协同过滤相似度加权平均来生成推荐列表。

def hybrid_recommendation(movie_title, user_rating, weight_content=0.5, k=5):content_scores = cosine_sim_df[movie_title]collaborative_scores = similarity_matrix_df[movie_title] * (user_rating - 2.5)hybrid_scores = (content_scores * weight_content + collaborative_scores * (1 - weight_content)).dropna()return hybrid_scores.sort_values(ascending=False).head(k)
4. 基于K-means的推荐

我们还可以使用K-means聚类算法对电影进行聚类,然后基于聚类结果推荐相似电影。

kmeans = KMeans(n_clusters=10, random_state=42)
df['cluster'] = kmeans.fit_predict(combined_features)
def recommend_movies_from_cluster(title):cluster_id = df[df['title'] == title]['cluster'].iloc[0]return df[df['cluster'] == cluster_id]['title'].tolist()
5. 基于神经网络的推荐

最后,我们使用神经网络模型来预测用户对电影的评分。我们使用Keras构建了一个简单的神经网络模型,并进行了训练和预测。

model = Sequential([Dense(128, activation='relu', input_dim=processed_features.shape[1]),Dropout(0.3),Dense(64, activation='relu'),Dropout(0.3),Dense(1, activation='linear')
])
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(processed_features, ratings, epochs=10, validation_split=0.2)

本文详细介绍了数据预处理、特征工程以及多种推荐算法的实现。我们展示了如何通过协同过滤、基于内容的推荐、混合推荐、K-means聚类及神经网络来构建个性化的电影推荐系统。通过结合这些方法,可以为用户提供更加精准且多样化的推荐内容。

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

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

相关文章

如何编写Linux PCI设备驱动器 之一

如何编写Linux PCI设备驱动器 之一 PCI寻址PCI驱动器使用的APIpci_register_driver()pci_driver结构pci_device_id结构 如何查找PCI设备存取PCI配置空间读配置空间APIs写配置空间APIswhere的常量值共用部分类型0类型1 PCI总线通过使用比ISA更高的时钟速率来实现更好的性能&…

etcdctl defrag 剔除、添加etcd节点

零、准备工作 find / -name etcdctl cp /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs/usr/local/bin/etcdctl /usr/local/bin/etcdctlalias ec"etcdctl --endpointshttps://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --…

【2024】MySQL库表基本操作

目录 登录数据库创建数据库直接创建数据库使用IF NOT EXISTS方式创建查看数据库信息删除数据库 数据表操作创建数据表增加新字段插入数据删除数据表 登录数据库 首先登录到数据库:输入用户名和密码登录到数据库内部 [rootlocalhost ~]# mysql -uroot -p Enter pas…

Locksupport凭证的底层原理

LockSupport的凭证(通常称为“许可”或“permit”)的底层原理主要涉及到Java的Unsafe类以及系统级的线程同步机制。LockSupport是Java 6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语,其核心功能是通…

如何利用ChatGPT提升学术论文讨论部分的撰写质量和效率

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。经过数月爆肝,终于完成学术AI使用教…

利用正则表达式从字符串中提取浮点数

在 Python 中,使用正则表达式可以非常方便地从字符串中提取浮点数。Python 的 re 模块提供了正则表达式支持。下面是如何使用正则表达式提取浮点数的示例。 1、问题背景 在开发过程中,有时候我们需要从字符串中提取浮点数,例如从 HTML 代码中…

网关功能介绍

在微服务架构中,网关(API Gateway)扮演着至关重要的角色,它作为客户端和微服务之间的中介,负责路由、过滤、认证、限流等职责。以下是一些常见的网关实现: Spring Cloud Gateway: Spring Cloud …

linux系统中,计算两个文件的相对路径

realpath --relative-to/home/itheima/smartnic/smartinc/blocks/ruby/seanet_diamond/tb/parser/test_parser_top /home/itheima/smartnic/smartinc/corundum/fpga/lib/eth/lib/axis/rtl/axis_fifo.v 检验方式就是直接在当前路径下,把输出的路径复制一份&#xff0…

5-2 检测内存容量

1 使用的是bios 中断, 每次进行检测都会返回一块 内容。并且标志上,这块内存是否可用。 接下来是代码: 首先是构建 一个文件夹, 两个文件。 types.h 的内容。 #ifndef TYPES_H #define TYPES_H// 基本整数类型,下面的…

全球圆柱锂电池行业领军者!比克电池亮相2024深圳eVTOL展

2024深圳eVTOL产业发展大会暨低空经济展览会将于9月23-25日在深圳坪山燕子湖国际会展中心举办。展会将通过“两天论坛三天展览”的形式展开,专注未来城市空中交通新形态、民用有人驾驶、无人驾驶航空器、城市低空物流,并讨论eVTOL的整机研发、设计、制造…

拍卖新纪元:Spring Boot赋能在线拍卖解决方案

需求分析 1.1技术可行性:技术背景 在线拍卖系统是在Windows操作系统中进行开发运用的,而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。 系统的开发环境和配置…

Python+selenium web测试入门基础!

自动化测试框架 from selenium import webdriver 获取浏览器对象 我这里是edge浏览器,用的是edge的webdriver # webdriver获取浏览器对象  driver webdriver.Edge() 尝试打开网站并关闭​​​​​​​ # 准备一个网址  url "https://www.baidu.com/"…

Vue2 与 Vue3 的区别有哪些

Vue 2 和 Vue 3 在许多方面都有显著的区别,包括性能、API 设计、功能特性等。以下是它们主要的区别: 1. 响应式系统 Vue 2: 基于 Object.defineProperty: Vue 2 使用 Object.defineProperty 来实现响应式数据。这种方法在处理对象属性时有一定的局限性…

包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

提问:作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制链路如何正确配置表过滤信息? 2、数据库从库的GTID在变化,实际却没有数据写入,究竟是什么原因? 心中有章,遇事不慌 作为DBA的你,…

如何构建短视频矩阵?云微客开启多账号协同作战

你有没有疑惑过,为什么有些账号每一次发布视频,都要艾特一下其他账号呢?那些被艾特的账号,你有点进去关注过吗?其实做过运营的都或多或少的接触过矩阵,短视频矩阵的玩法现在也逐步成为了趋势。企业通过多账…

GitHub Copilot Issue in Visual Studio Code “Status Ready (disabled)“

I’m facing an issue with GitHub Copilot in Visual Studio Code, where it’s not suggesting any code. Even though it says “enabled globally” in the extensions tab settings, the icon in the status bar has a diagonal line through it. When I click on the ico…

pyautogui进行点击失效,pyautogui.click()失效

背景:在Pycharm里,使用pythonpyautogui调用 .exe程序文件时候,当程序界面出来之后,鼠标失去反应,用pyautogui进行点击。后面尝试使用图片相似也无法实行点击。 解决方法:运行Pycharm或者其他ide的时候选择…

黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装

文章目录 什么是缓存?添加Redis缓存店铺类型查询业务添加缓存练习题 缓存更新策略给查询商铺的缓存添加超时剔除和主动更新的策略 缓存穿透缓存空对象布隆过滤 缓存雪崩解决方案 缓存击穿解决方案基于互斥锁方式解决缓存击穿问题基于逻辑过期的方式解决缓存击穿问题…

极市开发平台yolov8训练无人机数据集样例数据流程

先进入vscode,进入src_repo文件夹。 第一步,克隆一个比较好的博主的库: GitHub - Incalos/YOLO-Datasets-And-Training-Methods: This project involves making custom datasets for the YOLO series and model training methods for YOLO.…

【openwrt-21.02】T750 openwrt-21.02 pptp拨号失败问题分析及解决方案

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …