为了推荐系统课程中的项目,我正在尝试为一个包含大约7000个用户(行)和4000部电影(列)数据集构建和存储基于物品的相似度矩阵。我拥有一个透视表,其中UserID为索引,MovieID为列,评分为值。正如您所想象的那样,存在很多0评分。
目前,我正在使用scipy软件包中的pearsonr函数。我发现为了存储所有距离,我必须计算所有列之间的皮尔逊系数,并将它们存储在对称的电影-电影矩阵中。截至目前我的代码(如您所见,我是Python / 编码新手):
目前,我正在使用scipy软件包中的pearsonr函数。我发现为了存储所有距离,我必须计算所有列之间的皮尔逊系数,并将它们存储在对称的电影-电影矩阵中。截至目前我的代码(如您所见,我是Python / 编码新手):
import pandas as pd
import numpy as np
from scipy.stats import pearsonr
pd.read_csv('data.csv')
data = data.pivot(index = 'UserID', columns = 'MovieID', values = "Rating")
similarity_data = pd.DataFrame(index=data.columns, columns=data.columns)
for i in range(0,len(data.columns)):
for j in range(0,len(data.columns)):
similarity_data.iloc[i,j] = pearsonr(data.iloc[:,i],data.iloc[:,j])[0]
嗯,正如你所想象的那样,这需要很长时间,而我渴望找到更高效的方法。我的第一个想法是利用矩阵对称性。但我无法弄清楚如何做到。
我的想法大致如下:
for i in range(0,len(data.columns)):
for j in range(0,len(data.columns)):
similarity_data.iloc[i,j] = pearsonr(data.iloc[:,i],data.iloc[:,j+i])[0]
similarity_data[j,i] = similarity_data.iloc[i,j]
然而,即使我能让它正常工作,我担心问题在于这两个for循环。我试图使用map或lambda方法来解决问题,但是没有任何进展。
有什么改进的想法吗(很可能有很多)?