实时环境中的推荐系统实现

在某些领域,数据流量巨大且动态,导致大数据的产生和构建推荐系统的需求日益增强。为了应对大数据学术数据,构建了一个推荐系统,以加快各种与研究相关的活动。YouTube、亚马逊、Netflix等大型巨头向用户提供推荐,帮助他们找到感兴趣的产品/项目。

推荐系统的构建

不同的算法正在被研究以构建一个高效的推荐系统。协同过滤(CF)推荐系统就是这样一个系统,它作为领域无关的系统,性能优于基于内容的推荐系统。在CF中,基于项目的协同过滤(IBCF)是一个知名的技术,它提供准确的推荐,并已被亚马逊使用。

IBCF的基础知识

在这篇博客中,将介绍IBCF的基础知识,如何向用户推荐项目,并使用Python实现相同的技术。由亚马逊在1998年开发的IBCF在其成功中扮演了重要角色。这项技术的基本思想是寻找基于用户已经评分/消费的项目相似的项目。

IBCF的工作原理

首先,计算项目之间的相似性。其次,根据计算出的相似性,查看与已经消费/评分相似的项目,并相应地推荐。

使用了MovieLens数据集,该数据集包含941名用户提供的100K评分,涵盖1682个项目,用于实现IBCF。

为了易于理解,将一次性导入所有库。

import pandas as pd import numpy as np from scipy.sparse import csr_matrix from sklearn.neighbors import NearestNeighbors import matplotlib.pyplot as plt import seaborn as sns

在Google Colab中进行编码,首先需要上传从下载的zip文件夹中提取的u.data文件。

from google.colab import files uploaded = files.upload()

一旦u.data文件上传,下一步是使用Pandas库读取数据集,如下所示:

import pandas as pd header = ['user_id','item_id','rating','timestamp'] dataset = pd.read_csv('u.data',sep = 't',names = header) print(dataset.head())

接下来,将数据集转换为矩阵,其中每一行代表一个用户,每一列代表一个项目。

n_users = dataset.user_id.unique().shape[0] n_items = dataset.item_id.unique().shape[0] n_items = dataset['item_id'].max() A = np.zeros((n_users,n_items)) for line in dataset.itertuples(): A[line[1]-1,line[2]-1] = line[3] print("Original rating matrix : ",A)

为了节省内存,将密集的评分矩阵转换为稀疏矩阵,使用csr_matrix()函数。

csr_sample = csr_matrix(A) print(csr_sample)

使用余弦相似度计算csr_sample中项目之间的相似性。

knn = NearestNeighbors(metric='cosine', algorithm='brute', n_neighbors=3, n_jobs=-1) knn.fit(csr_sample) dataset_sort_des = dataset.sort_values(['user_id', 'timestamp'], ascending=[True, False]) filter1 = dataset_sort_des[dataset_sort_des['user_id'] == 1].item_id filter1 = filter1.tolist() filter1 = filter1[:20] print("Items liked by user: ",filter1) distances1=[] indices1=[] for i in filter1: distances , indices = knn.kneighbors(csr_sample[i],n_neighbors=3) indices = indices.flatten() indices= indices[1:] indices1.extend(indices) print("Items to be recommended: ",indices1)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485