用python计算矩阵中的评级

用python计算矩阵中的评级,python,numpy,Python,Numpy,我一直在努力解决这个问题。但是我想不出一个干净的数据结构来完成以下工作 我有一个csv文件,如下所示: user_id ---> item_id ratings | | | V 例如: 1,2,3,4,.. a,4, ,2, ,... b, ,2,3, ,.. c, ,1,2,3, d 等等。。。 空白值意味着用户没有对给定的项目进行评级。 现在,对于给定的用户(比如1),我有一本字典: weight_vector = {2:0.3422,3:0

我一直在努力解决这个问题。但是我想不出一个干净的数据结构来完成以下工作

我有一个csv文件,如下所示:

           user_id --->
item_id     ratings
|
|
|
V
例如:

  1,2,3,4,..
a,4, ,2, ,...   
b, ,2,3, ,..
c, ,1,2,3,
d
等等。。。 空白值意味着用户没有对给定的项目进行评级。 现在,对于给定的用户(比如1),我有一本字典:

weight_vector = {2:0.3422,3:0.222}
我想做的计算如下:

 rating_for_item_for_user_1 = [rating_given_by_user_2* weight_2] + [rating_given_by_user_3*weight_3]/[weight2 + weight3]
对于用户1:缺少的值(项目b和c),我想给它分配一个评级 详情如下:

 rating_for_item_for_user_1 = [rating_given_by_user_2* weight_2] + [rating_given_by_user_3*weight_3]/[weight2 + weight3]
如果用户2或3未对给定项目进行评级,则权重=0


我有一种感觉,对于numpy,这应该是相当简单的。但是我们不能直接思考。

让我们假设你有一个
评级矩阵和一个权重向量“权重”列表,然后你可以简单地做(假设这些“空”字段是零-这是你必须考虑的一些边界情况,因为当所有用户“邻居”时,你可能会遇到被0除的情况也未对某些项目给予任何评级):

为了防止被零除错误,您可以在赋值之前检查它

empty=np.where(ratings==0)
for (x,y) in zip(empty[0],empty[1]):
    normalizer = sum( weights[x][w] for w in weights[x] if ratings[w,x] != 0 )
    if normalizer > 0:
        ratings[x,y] = sum( ratings[n,y] * weights[x][y] for n in weights[x] if ratings[n][y] != 0) / normalizer

另一种可能是使用集合中的defaultdict。


若您希望它作为矩阵,以便可以按列和按行访问,那个么您可能希望将id加载到两个不同的数据结构中,或者将其加载到一个数据结构中,计算并转置它

前几天我看了一下,它是建立在numpy之上的-它看起来很有用,可能有一些东西可以让任务更容易。它如何解决计算加权平均数的OP问题?
from collections import defaultdict
dict = defaultdict(float) 
dict[x]=0