如何在numpython中创建相似度矩阵?

2024-05-12 20:37:32 发布

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

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

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替换。

但从这一点出发,我想创建用户之间的相似度矩阵和项目之间的相似度矩阵?

我该怎么做?


Tags: 文件数据项目用户idids格式矩阵
2条回答

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

>>> 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和第2个向量之间的相关性,它们呈负相关。或者类似地,第1和第3个细胞是正相关的。

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

看这个问题:What's the fastest way in Python to calculate cosine similarity given sparse matrix data?

具有:

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

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

相关问题 更多 >