我有一个数据框,其中包含针对100种产品(data_neighbours)的每100种产品的相似性得分100x100。我有另一个数据框,其中包含用户和产品级别的数据(1000x100)。我想为每个用户浏览每个产品,并从data_neighbours获得前10个类似的产品及其相应的相似性得分,并计算函数getScore如下:
def getScore(history, similarities):
return sum(history*similarities)/sum(similarities)
for i in range(0,len(data_sims.index)):
for j in range(1,len(data_sims.columns)):
user = data_sims.index[i]
product = data_sims.columns[j]
if data.ix[i][j] == 1:
data_sims.ix[i][j] = 0
else:
product_top_names = data_neighbours.ix[product][1:10]
product_top_sims = data_ibs.ix[product].order(ascending=False)[1:10]
user_purchases = data_germany.ix[user,product_top_names]
data_sims.ix[i][j] = getScore(user_purchases,product_top_sims)
如何优化此循环以加快处理速度。这里引用了这个例子:http://www.salemmarafi.com/code/collaborative-filtering-with-python/
示例数据: 数据:(1000x101)用户是第101列:
Index user song1 song2.....
0 1 0 0
1 33 0 1
2 42 1 0
3 51 0 0
data_ibs(相似性得分) - (100x100):
song1 song2 song3 song4
song1 1.00 0.00 0.02 0.05
song2 0.00 1.00 0.05 0.03
song3 0.02 0.05 1.00 0.11
song4 0.05 0.03 0.11 1.00
data_neighbours(根据data_ibs的排序得分为每首歌曲排名前10首类似的歌曲) - (100x10):
1 2 3......... 10
song1 song5 song10 song4
song2 song8 song11 song5
song3 song9 song12 song10
德国数据(每首歌曲的用户级别数据为列,用户除外) - (1000x100):
index song1 song2 song3
1 0 0 0
2 1 0 0
3 0 0 1
预期数据集(data_sims) - 1000x101:
user song1 song2 song3
1 0.00 0.00 0.22
33 0.09 0.00 0.11
42 0.00 0.10 0.00
51 0.09 0.09 0.00
如果任何歌曲的数据值为1,基本上其分数设置为0,其他情况下,前10首歌曲从data_neighbours获取,相应的分数来自data_ibs。现在检查这些歌曲是否已经存在于用户或者不存在(1,0)在user_purchases数据集中。最后,使用user_purchses(每个前10首歌曲的1/0值)计算ixj位置的相似性得分,乘以来自data_ibs的相似性得分,并除以总前10个相似度得分的总和。对所有用户x歌曲组合重复相同的操作。