代码之家  ›  专栏  ›  技术社区  ›  bluesummers

Scipy中的自动广播

  •  0
  • bluesummers  · 技术社区  · 7 年前

    我有两个 np.ndarray s data (8000, 500) sample 带形状 (1, 500) .

    我试图实现的是测量中每一行之间的各种类型的指标 数据 样品

    使用时 from sklearn.metrics.pairwise.cosine_distances 我能够利用 numpy

    x = cosine_distances(data, sample)
    

    但是当我试着用同样的程序 scipy.spatial.distance.cosine 我发现了错误

    ValueError:输入向量应为1-D。

    我的最终目标是迭代中所有可用的距离 scipy.spatial.distance

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   hpaulj    7 年前

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

    具有(800500)和(1500)输入( (samples, features) ),您应该返回(800,1)结果( (samples1, samples2) ).

    dot 执行某种排序计算的乘积( norm np.dot(data, sample.T) 在处理尺寸时。

    https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html Computes 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)
    

    就像我前面提到的行为,但添加了规范化。