计算Python中矩阵的余弦相似度

时间:2016-06-17 21:00:58

标签: python numpy

我有一个大小为56K X 8.5K的矩阵。它是二元偏好矩阵。

现在我希望获得每列的余弦相似性以及更多操作,如下所示:

1)。在获取余弦相似度之前,将矩阵的行规范化为单位(L2范数)。

2)。取余弦相似性

3)。使余弦相似度矩阵的对角元素为零。不希望相同列的相似性度量与自身相同。

4)。对于每列余弦相似度矩阵,如果该列中的值不在该列的前20个值中,则将该值设为零。基本上只保留每列的前20个值,使其为零。

要做到这一点,矩阵的余弦相似性只是

np.dot(X.T,X)

其中X是行和列的标准化。行因为我们必须按照上面的条件1那样做,如果我们对矩阵的列进行标准化,然后将其与自身的点积相乘,它将给出余弦相似性(也称为相关性)。

为了实现除上一个之外的上述条件,我这样做了:

#Row normalization
for x in range(b.shape[0]):
    b[x]=b[x]/(np.linalg.norm(b[x]).round(decimals=4))

# Column Normalization   
for x in range(b.shape[1]):
    b[:,x]=b[:,x]/(np.linalg.norm(b[:,x]).round(decimals=4))

M=np.dot(b.T,b)

# Fill Diagonal with zero

np.fill_diagonal(M,0)

两个问题:

I)。我确信这会慢,因为我正在迭代两次。任何更快的规范化方法?

II)当我这样做时

for x in range(b.shape[0]):
        b[x]=b[x]/(np.linalg.norm(b[x]).round(decimals=4))

给出一行填充零。我认为这可能是四舍五入的问题,所以即使尝试了圆形功能,但仍然是零填充。如果我只采取一行并做它,它工作正常。在for循环中完成整个矩阵会给出一个零矩阵。那是为什么?

因此,如果有人可以在I和II之上提供帮助,并且在开始时建议4的解决方案,这将非常有帮助。

0 个答案:

没有答案