Scipy 自动广播

Auto broadcasting in Scipy

我有两个 np.ndarraydata 的形状为 (8000, 500)sample 的形状为 (1, 500)

我想要实现的是测量 datasample 中每一行之间的各种指标。

当使用 from sklearn.metrics.pairwise.cosine_distances 时,我能够利用 numpy 的广播执行以下行

x = cosine_distances(data, sample)

但是当我尝试对 scipy.spatial.distance.cosine 使用相同的过程时,我得到了错误

ValueError: Input vector should be 1-D.

我想这是一个广播问题,我正试图找到解决它的方法。

我的最终目标是遍历 scipy.spatial.distance 中所有可用的距离,这些距离可以接受两个向量并将它们应用于数据和样本。

如何在我的 scipy 版本的代码中复制 sklearn 中自动发生的广播?

好的,查看文档,http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_distances.html

使用 (800,500) 和 (1,500) 个输入 ((samples, features)),您应该得到 (800,1) 个结果 ((samples1, samples2))。

我不会将其描述为广播。它更像是 dot 产品,对特征(500 形状)执行某种排序计算 (norm),将其减少到一个值。它更像是 np.dot(data, sample.T) 在处理尺寸方面。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.htmlComputes the Cosine distance between 1-D arrays,更像是

for row in data:
   for s in sample:
      d = cosine(row, s)

或者因为 sample 只有一行

distances = np.array([cosine(row, sample[0]) for row in data])

换句话说,sklearn 版本执行成对迭代(可能在编译代码中),而 spartial 仅评估一对的距离。

pairwise.cosine_similarity 确实

 # K(X, Y) = <X, Y> / (||X||*||Y||)
 K = safe_sparse_dot(X_normalized, Y_normalized.T, dense_output=dense_output)

这就是我之前提到的类似 dot 的行为,但添加了规范化。