繁体   English   中英

带张量流的雅卡德距离矩阵

[英]Jaccard's distance matrix with tensorflow

我想使用Jaccard距离计算距离矩阵。 并尽快这样做。 我曾经使用scikit-learn的pairwise_distances函数。 但是scikit-learn并不打算支持GPU,甚至存在一个已知的错误 ,该错误会在并行运行时使功能变慢。

我唯一的限制是,可以将所得的距离矩阵输入到scikit-learn的DBSCAN聚类算法中。 我当时正在考虑使用张量流实现计算,但是找不到一种简单的好方法。


PS:我有理由预先计算距离矩阵,而不是让DBSCAN根据需要进行计算。

嘿,我面临着同样的问题。

考虑到jaccard相似度是真实阳性(tp)与真实阳性,假阴性(fn)和假阳性(fp)之和的比率,我提出了以下解决方案:

    def jaccard_distance(self):
        tp = tf.reduce_sum(tf.mul(self.target, self.prediction), 1)
        fn = tf.reduce_sum(tf.mul(self.target, 1-self.prediction), 1)
        fp = tf.reduce_sum(tf.mul(1-self.target, self.prediction), 1)
        return 1 - (tp / (tp + fn + fp))

希望这可以帮助!

我不是tensorflow专家,但这是我得到的解决方案。 据我所知,在张量流中对列表的所有对进行计算的唯一方法是进行矩阵乘法或使用广播规则,该解决方案在某些时候会同时使用。

因此,假设我们有一个输入布尔n_samples ,其中n_samples行,每个集合一个, n_features列,每个可能的元素一个。 i行第j列中的值为True表示第i个集合包含元素j 就像scikit-learn的pairwise_distances期望的一样。 然后,我们可以进行如下操作。

  1. 将矩阵转换为数字,对于True为1,对于False为0。
  2. 将矩阵乘以自己的转置。 这产生矩阵,其中每个元素M[i][j]包含第i和第j组之间的交点的大小。
  3. 通过按行对输入矩阵求和,计算出包含所有集合基数的cardv向量。
  4. cardv制作行向量和列向量。
  5. 计算1 - M / (cardvrow + cardvcol - M) 当添加行和列向量时,广播规则将完成所有工作。

总体上看,该算法有点hacking,但它的工作原理和产生的结果在scikit-learn的pairwise_distances函数所计算的结果的合理范围内。 更好的算法应该在每对输入向量上进行一次遍历,并且仅计算对称矩阵的一半。 欢迎任何改进。

setsin = tf.placeholder(tf.bool, shape=(N, M))
sets = tf.cast(setsin, tf.float16)
mat = tf.matmul(sets, sets, transpose_b=True, name="Main_matmul")
#mat = tf.cast(mat, tf.float32, name="Upgrade_mat")
#sets = tf.cast(sets, tf.float32, name="Upgrade_sets")
cardinal = tf.reduce_sum(sets, 1, name="Richelieu")
cardinalrow = tf.expand_dims(cardinal, 0)
cardinalcol = tf.expand_dims(cardinal, 1)

mat = 1 - mat / (cardinalrow + cardinalcol - mat)

我使用float16类型,因为它似乎比float32快得多。 仅当基数足够大以使它们不准确,或者执行除法时需要更高的精度时,才将其转换为float32才有用。 但是即使需要强制转换,将矩阵乘法作为float16似乎仍然float16

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM