Scipy.spatial.distance.pdist出现RuntimeWarning:双精度标量遇到无效值

0 投票
1 回答
2515 浏览
提问于 2025-04-18 12:15

我有一个16000行600列的布尔矩阵。我想用Jaccard距离来创建一个距离矩阵,最终的矩阵大小会是16000行16000列。为此,我使用了scipy.spatial.distance.pdist这个工具。

当我运行程序时,过了一段时间,程序会出现一个警告,但并不会停止运行。

/usr/lib/python2.7/dist-packages/scipy/spatial/distance.py:386: RuntimeWarning: invalid value encountered in double_scalars
return (np.double(np.bitwise_and((u != v), np.bitwise_or(u != 0, v != 0)).sum()) / np.double(np.bitwise_or(u != 0, v != 0).sum()))

而且即使我让程序继续运行,也没有任何进一步的输出。

我该如何解决这个问题呢?

其他细节:

  • 这个矩阵的稀疏性很高,大约有99%。
  • 有115行只包含0。

1 个回答

2

看起来你遇到了两个问题:

  1. 你的矩阵很大,而且里面有很多零,所以可以尝试用稀疏表示法来处理:

    import scipy.sparse
    # assuming your big boolean matrix is called A
    sA = scipy.sparse.csr_matrix(A)
    
  2. 如果有两行都是全零的,那么这两行会产生NaN值。这就是为什么会出现警告的原因。

你的代码一直不结束的原因是矩阵实在太大了。不幸的是,Scipy的距离计算函数不支持稀疏矩阵,所以你需要自己写Jaccard距离的计算方法。(可以参考Scipy的密集实现。)

撰写回答