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")
这是怎么得到票。这是scipy提供的错误:'TypeError:scipy distance metrics不支持稀疏矩阵。'我错过了什么吗? – zbinsd 2013-10-11 04:08:34
不适用于稀疏矩阵 – Medeiros 2013-10-12 15:54:18
它对于稀疏矩阵也不适用。我得到了同样的错误。你能解决这个问题吗? – 2015-10-16 10:49:33