2017-08-31 67 views
0

我有两个np.ndarray S,data与形状(8000, 500)sample与形状(1, 500)自动广播在SciPy的

我试图实现的是在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的自动发生的广播?

+0

尝试'x = cosine_distances(data,sample.reshape((500,)))' –

+0

告诉我们更多关于各个函数接受哪些参数?他们必须解释什么时候他们接受2D数组和1D等。你甚至可以看他们的源代码,看他们如何检查和按摩输入。我也可以查看这些信息,但我太懒惰了。 :) – hpaulj

+0

@PaulH没有工作:/ – bluesummers

回答

2

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

随着(800500)和(1500)输入((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就像我前面提到的行为,但与规范化补充说。

+0

从我的理解(不看代码,但在结果)是(1,500)得到“复制到一个(8000,500),然后该函数成为行明智的。是不是这是怎么回事? – bluesummers

+0

我只是'sample'作为'data'的第一行,并对'数据'由'sklearn.metrics.pairwise.cosine_distance'的结果 - 我得到了第一个结果,同样的'样本' - 这就是为什么我把它看作是一个明智的行动 – bluesummers