对于类中的推荐系统项目,我目前正在尝试构建和存储具有大约7000个用户(行)和4000个电影(列)的数据集的基于项目的相似度矩阵。所以我有一个数据透视表,其中UserIDs作为索引,MovieIDs作为列和评级作为值。你可以想象有很多0分的评分。高效地计算和存储相似度矩阵
目前我正在使用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循环。我试图以某种方式使用地图或lambda方法,但无法获取任何地方。
任何想法如何改善(可能很多)?
你说得对,我现在觉得很愚蠢。这花了大约5秒钟,从我能看到的结果几乎相同。感谢您的帮助! – kbk