Python:余弦相似度m * n矩阵

时间:2012-07-10 02:02:43

标签: python vector numpy cosine-similarity

我有两个M X N矩阵,我是在从图像中提取数据后构建的。两个向量都具有冗长的第一行,在第三行之后它们都只是第一列。 例如,原始矢量看起来像这样

1,23,2,5,6,2,2,6,2,
12,4,5,5,
1,2,4,
1,
2,
2
:

两个向量都有一个类似的模式,前三行有很长的行,然后在进展时变薄。做余弦相似性我正在考虑使用填充技术添加零并使这两个向量N X N.我查看了余弦相似性的Python选项,但是一些示例使用了包调用numpy。我无法弄清楚numpy如何能够完成这种类型的填充并实现余弦相似性。任何指导将不胜感激。

3 个答案:

答案 0 :(得分:4)

如果两个数组具有相同的维度,我会使用NumPy将它们展平。 NumPy(和SciPy)是一种功能强大的科学计算工具,可以使矩阵操作更容易。

这是一个如何用NumPy和SciPy做的例子:

import numpy as np
from scipy.spatial import distance

A = np.array([[1,23,2,5,6,2,2,6,2],[12,4,5,5],[1,2,4],[1],[2],[2]], dtype=object )
B = np.array([[1,23,2,5,6,2,2,6,2],[12,4,5,5],[1,2,4],[1],[2],[2]], dtype=object )

Aflat = np.hstack(A)
Bflat = np.hstack(B)

dist = distance.cosine(Aflat, Bflat)

此处的结果为dist = 1.10e-16(即0)。

请注意,我在这里使用了dtype=object,因为这是我知道能够在NumPy中将不同形状存储到数组中的唯一方法。这就是为什么后来我使用hstack()来展平数组(而不是使用更常见的flatten()函数)。

答案 1 :(得分:3)

我会将它们变成一个scipy稀疏矩阵(http://docs.scipy.org/doc/scipy/reference/sparse.html),然后从scikit学习模块运行余弦相似性。

from scipy import sparse
sparse_matrix= scipy.sparse.csr_matrix(your_np_array)

from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import cosine

distance_matrix= pairwise_distances(sparse_matrix, metric="cosine")

答案 2 :(得分:0)

为什么你不能在两个锯齿状列表上运行嵌套循环(大概),使用欧几里得/矢量点积来汇总每一行并使用结​​果作为相似性度量。这假设锯齿状尺寸相同。

虽然我不太确定你是如何从位图图像中获取锯齿状数组的(我认为它将是一个适当的MxN形式的密集矩阵),或者上面数组的锯齿状数组是如何表示的MxN矩阵/图像数据,因此,如何用零填充数据是有意义的?如果这是一个稀疏矩阵表示,则可以预期行/ col信息用值注释。