5

我在以下形式的文件中有数据:

user_id, item_id, rating
1, abc,5
1, abcd,3
2, abc, 3
2, fgh, 5

因此,我想为上述数据形成的矩阵如下:

#   itemd_ids
# abc  abcd  fgh
[[5,    3,    0]  # user_id 1
 [3,    0,    5]] # user_id 2

其中缺失的数据被 0 替换。

但是从这个我想创建用户到用户的相似度矩阵和项目到项目的相似度矩阵?

我怎么做?

4

2 回答 2

5

从技术上讲,这不是编程问题,而是数学问题。但我认为你最好使用方差 - 协方差矩阵。或相关矩阵,如果值的比例非常不同,例如,而不是:

>>> x
array([[5, 3, 0],
       [3, 0, 5],
       [5, 5, 0],
       [1, 1, 7]])

你有:

>>> x
array([[5, 300, 0],
       [3, 0, 5],
       [5, 500, 0],
       [1, 100, 7]])

要获得方差-cov 矩阵:

>>> np.cov(x)
array([[  6.33333333,  -3.16666667,   6.66666667,  -8.        ],
       [ -3.16666667,   6.33333333,  -5.83333333,   7.        ],
       [  6.66666667,  -5.83333333,   8.33333333, -10.        ],
       [ -8.        ,   7.        , -10.        ,  12.        ]])

或相关矩阵:

>>> np.corrcoef(x)
array([[ 1.        , -0.5       ,  0.91766294, -0.91766294],
       [-0.5       ,  1.        , -0.80295507,  0.80295507],
       [ 0.91766294, -0.80295507,  1.        , -1.        ],
       [-0.91766294,  0.80295507, -1.        ,  1.        ]])

这是看待它的方式,对角线单元格,即(0,0)单元格,是您在 X 中的第一个向量与其自身的相关性,所以它是 1。其他单元格,即(0,1)单元格,是第一个和X 中的第二个向量。它们是负相关的。或者类似地,第 1 和第 3 个细胞是正相关的。

协方差矩阵或相关矩阵避免了@Akavall 指出的零问题。

于 2013-08-25T21:54:48.227 回答
3

看到这个问题:在给定稀疏矩阵数据的情况下,Python 中计算余弦相似度的最快方法是什么?

有:

A = np.array(
[[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[1, 1, 0, 1, 0]])

dist_out = 1-pairwise_distances(A, metric="cosine")
dist_out

导致:

array([[ 1.        ,  0.40824829,  0.40824829],
       [ 0.40824829,  1.        ,  0.33333333],
       [ 0.40824829,  0.33333333,  1.        ]])

但这适用于密集矩阵。对于稀疏,您必须开发您的解决方案。

于 2013-10-12T15:50:56.400 回答