如何在NumPy Python中创建相似性矩阵?

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的情况下,我希望创建用户与用户之间的相似矩阵和物品与物品之间的相似矩阵?

我该如何做到这一点?

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]])

要获取方差-协方差矩阵:
>>> 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中第一个和第二个向量之间的相关性。它们是负相关的。或类似地,第一个和第三个单元格是正相关的。
协方差矩阵或相关矩阵可以避免@Akavall指出的零问题。

1
我认为协方差方法比我的解决方案更好。 - Akavall

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.        ]])

但这只适用于密集矩阵。对于稀疏矩阵,您需要开发自己的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接