我有一个大小为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的解决方案,这将非常有帮助。