当你有未知数据时,计算质心的标准方法是什么?

2024-09-30 00:36:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须计算用户评分的质心。我的数据存储在这样一个矩阵中(假设我们有4个用户和12个评级):

[[0,1,0,-1,0,2,3,4,1,0,0,0],
[0,1,1,-1,0,2,3,4,1,0,2,0],
[0,1,0,0,-1,2,3,4,1,0,0,0],
[0,1,-1,2,0,2,3,4,1,4,-1,-1]]

我的问题是,我不确定如何处理未知数据,也就是说,当用户没有对所有内容进行评分时(在我的示例中,值初始化为-1)。现在,0表示用户根本不喜欢这个对象,4表示他们喜欢它。计算质心时,值等于-1时应该怎么做?现在,我在python中的代码如下所示:

def calc_centroid(ratMatrix):
  centroid = [0 for x in range(len(ratMatrix[0]))] 
  for i in range(len(ratMatrix)): 
    for j in range(len(ratMatrix[i])):
      centroid[j] = centroid[j] + ratMatrix[i][j]
  count = len(ratMatrix[0])
  for i in range(len(centroid)):
    centroid[i] = centroid[i]*1.0/count;
  return centroid

然而,我并没有考虑到“质心”也是用-1值计算的,我想这是不完全正确的。做这件事的标准方法是什么?你知道吗


Tags: 数据对象用户in示例内容forlen
1条回答
网友
1楼 · 发布于 2024-09-30 00:36:33

我假设质心是平均值。当4个等级为1时,代码返回0.33。我想应该是1。你知道吗

numpy可以做一些事情,使这个更整洁。你知道吗

import numpy as np

def calc_centroid(ratMatrix):
  centroid = [0 for x in range(len(ratMatrix[0]))]
  for i in range(len(ratMatrix)):
    for j in range(len(ratMatrix[i])):
      centroid[j] = centroid[j] + ratMatrix[i][j]
  count = len(ratMatrix[0])
  for i in range(len(centroid)):
    centroid[i] = centroid[i]*1.0/count;
  return centroid

def calc_centroid2(ratMatrix):
    mean_ratings = []
    for i in range(ratMatrix.shape[1]): # iterate columns
        col = ratMatrix[:,i]
        col = col[col != -1] #exclude unrated
        mean_ratings.append(np.mean(col))
    return mean_ratings

# 4 users, 12 objects to rate: want the mean rating for each object.
ratMatrix = np.array([[0,1,0 ,-1,0 ,2,3,4,1,0 ,0, 0],
                      [0,1,1 ,-1,0 ,2,3,4,1,0 ,2, 0],
                      [0,1,0 ,0 ,-1,2,3,4,1,0 ,0, 0],
                      [0,1,-1,2 ,0 ,2,3,4,1,4,-1,-1]])

print(ratMatrix)

centroids = calc_centroid(ratMatrix)
print(['{:.2f} '.format(i) for i in centroids])

centroids = calc_centroid2(ratMatrix)
print(['{:.2f} '.format(i) for i in centroids])

这就产生了

[[ 0  1  0 -1  0  2  3  4  1  0  0  0]
 [ 0  1  1 -1  0  2  3  4  1  0  2  0]
 [ 0  1  0  0 -1  2  3  4  1  0  0  0]
 [ 0  1 -1  2  0  2  3  4  1  4 -1 -1]]
['0.00 ', '0.33 ', '0.00 ', '0.00 ', '-0.08 ', '0.67 ', '1.00 ', '1.33 ', '0.33 ', '0.33 ', '0.08 ', '-0.08 ']
['0.00 ', '1.00 ', '0.33 ', '1.00 ', '0.00 ', '2.00 ', '3.00 ', '4.00 ', '1.00 ', '1.00 ', '0.67 ', '0.00 ']

相关问题 更多 >

    热门问题