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

问题描述:

我有两个M X N矩阵,我从图像中提取数据后构建。这两个矢量都有很长的第一行,在第三行之后它们都只成为第一列。 例如原矢量看起来像这样Python:余弦相似度m * 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究竟是如何做这种类型的填充和执行余弦相似性的。任何指导将不胜感激。

如果两个数组具有相同的维度,我会使用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()函数)。

为什么不能在两个交错列表上运行嵌套循环(大概),使用欧几里得/向量点积计算每行,并将结果用作相似性度量。这假定锯齿尺寸是相同的。

虽然我不太清楚你是如何从位图图像中得到一个锯齿状的数组(我会假定它是一个适当的MxN形式的密集矩阵)或上面的锯齿状数组是如何表示的一个MxN矩阵/图像数据,因此,如何用零填充数据会有意义?如果这是一个稀疏矩阵表示,则可以期望用这些值注释的行/列信息。

我会让它们变成一个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

这是怎么得到票。这是scipy提供的错误:'TypeError:scipy distance metrics不支持稀疏矩阵。'我错过了什么吗? – zbinsd 2013-10-11 04:08:34

+0

不适用于稀疏矩阵 – Medeiros 2013-10-12 15:54:18

+0

它对于稀疏矩阵也不适用。我得到了同样的错误。你能解决这个问题吗? – 2015-10-16 10:49:33