在某些领域,数据流量巨大且动态,导致大数据的产生和构建推荐系统的需求日益增强。为了应对大数据学术数据,构建了一个推荐系统,以加快各种与研究相关的活动。YouTube、亚马逊、Netflix等大型巨头向用户提供推荐,帮助他们找到感兴趣的产品/项目。
不同的算法正在被研究以构建一个高效的推荐系统。协同过滤(CF)推荐系统就是这样一个系统,它作为领域无关的系统,性能优于基于内容的推荐系统。在CF中,基于项目的协同过滤(IBCF)是一个知名的技术,它提供准确的推荐,并已被亚马逊使用。
在这篇博客中,将介绍IBCF的基础知识,如何向用户推荐项目,并使用Python实现相同的技术。由亚马逊在1998年开发的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)