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

时间:2013-08-25 19:27:01

标签: python numpy matrix machine-learning

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

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 个答案:

答案 0 :(得分:4)

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

>>> 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.其他单元格,即{ {1}}单元格,是X中第1和第2个向量之间的相关性。它们是负相关的。或者类似地,第一和第三细胞正相关。

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

答案 1 :(得分:3)

请参阅此问题: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.        ]])

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