计算python中矩阵的等级

时间:2013-10-13 06:04:30

标签: 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.222}

我想要做的计算如下:

对于用户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,这应该是相当简单的。但一直无法直接思考。

2 个答案:

答案 0 :(得分:1)

让我们假设你有一个rating矩阵和一个权重列表矢量'权重',那么你可以简单地做(假设这些“空”字段是零 - 这是你有的一些边界情况想到,因为你可以遇到除以0的方式,当所有用户“邻居”也没有给某些项目评分时):

empty=np.where(ratings==0)
for (x,y) in zip(empty[0],empty[1]):
    ratings[x,y] = sum( ratings[n][y] * weights[x][y] for n in weights[x] if ratings[n][y] != 0) / sum( weights[x][w] for w in weights[x] if ratings[w,x] != 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

答案 1 :(得分:1)

另一种可能性是使用集合中的defaultdict。 http://docs.python.org/2/library/collections.html#collections.defaultdict

from collections import defaultdict
dict = defaultdict(float) 
dict[x]=0

如果您希望它作为矩阵,以便您可以按列方式和行方式访问,您可能希望将id加载到两个不同的数据结构或将其加载到一个,计算然后转置它。