【问题标题】:Get indices of results from scipy.pdist(myArray,metric="jaccard") to map back to original array?从 scipy.pdist(myArray,metric="jaccard") 获取结果索引以映射回原始数组?
【发布时间】:2015-04-09 12:02:39
【问题描述】:

我正在尝试计算 Jaccard 相似度

y= 1 - scipy.spatial.distance.pdist(X,metric="jaccard")

X 是一个m x n 矩阵,我得到一个大小为m choose 2 的一维数组作为这个函数的结果。我将如何将相似度值映射回以获得对称数组或(非对称数组任何一种方式都可以)所以我可以分辨出 X 中的哪两个向量(X 中的每一行都是布尔向量)生成了特定的 jaccard 相似度值年?

【问题讨论】:

    标签: python numpy scipy euclidean-distance cosine-similarity


    【解决方案1】:

    您可以使用scipy.spatial.distance.squareform 在完整的m x n 距离矩阵和上三角形之间进行转换:

    import numpy as np
    from scipy.spatial import distance
    
    m = 100
    n = 200
    X = np.random.randn(m, n)
    
    d = distance.pdist(X, metric='jaccard')
    print(d.shape)
    # (4950,)
    
    D = distance.squareform(d)
    print D.shape
    # (100, 100)
    

    【讨论】:

    • 哈哈我没看到这个抱歉。感谢您的帮助,写得很好。
    • 而反其道而行之呢?假设您没有足够的内存,并且您只使用扁平数组 (pdist) 计算距离。有人如何访问两个初始向量之间的 (i, j) 元素(距离),其中 i !=j?
    • 这确实很懒惰且效率低下,但它确实有效: i, j = np.array(np.triu_indices(3, 1)).T[k] 其中 k 是扁平数组中的索引 @ GiorgosPerakis
    【解决方案2】:

    有一个名为scipy.spatial.distance.squareform(y) 的模块,其中它将从scipy.spatial.distance.pdist(X,metric='jaccard') 获得的压缩形式的一维矩阵 转换为对称矩阵,因此从那里获取索引相对简单。

    所以我们可以做以下事情:

    y=1-scipy.spatial.distance.pdist(x,metric='jaccard')
    z=scipy.spatial.distance.squareform(y)
    

    X 是一个m x n 输入矩阵。 这里y 将是一个1 x (m choose 2) 维矩阵(压缩距离矩阵) z 将是一个 m x m 方形对称矩阵

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2017-05-04
      • 2015-09-04
      • 2015-10-14
      • 1970-01-01
      • 2021-03-08
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多