Scipy.spatial.distance.pdist出现RuntimeWarning:双精度标量遇到无效值
我有一个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
看起来你遇到了两个问题:
你的矩阵很大,而且里面有很多零,所以可以尝试用稀疏表示法来处理:
import scipy.sparse # assuming your big boolean matrix is called A sA = scipy.sparse.csr_matrix(A)
如果有两行都是全零的,那么这两行会产生
NaN
值。这就是为什么会出现警告的原因。
你的代码一直不结束的原因是矩阵实在太大了。不幸的是,Scipy的距离计算函数不支持稀疏矩阵,所以你需要自己写Jaccard距离的计算方法。(可以参考Scipy的密集实现。)