我有两个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如何能够完成这种类型的填充并实现余弦相似性。任何指导将不胜感激。
答案 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信息用值注释。