【问题标题】:Scipy.spatial.distance.pdist gives RuntimeWarning: invalid value encountered in double_scalarsScipy.spatial.distance.pdist 给出 RuntimeWarning:double_scalars 中遇到的无效值
【发布时间】:2014-07-06 10:11:31
【问题描述】:

我有一个 16000 X 600 的布尔矩阵。我想使用 Jaccard Distance 作为度量来创建一个距离矩阵。最终矩阵的尺寸为 16000 X 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。

【问题讨论】:

    标签: python python-2.7 matrix runtime-error


    【解决方案1】:

    看起来你有两个问题:

    1. 您的矩阵又大又稀疏,因此请尝试使用稀疏表示:

      import scipy.sparse
      # assuming your big boolean matrix is called A
      sA = scipy.sparse.csr_matrix(A)
      
    2. 任何一对全为零的行(在两行中)都将产生NaN 值。这就是触发警告的原因。

    您的代码永远不会退出的原因是矩阵太大了。不幸的是,Scipy 的距离函数不支持稀疏矩阵,因此您必须自己编写 Jaccard 距离。 (见scipy's dense implementation here。)

    【讨论】:

    • 我已经从我的数据中消除了所有零行。我什至应用了企业社会责任代表。我基本上对将其转换为 Compresses Sparse Row 表单还是应该使用 scipy.sparse.csr_matrix(A).todense() 来获得密集表示感到困惑?
    • 您评论中的代码应该只是复制 A,这不是您想要的。既然您已经删除了零行,那么当您运行原始代码(没有稀疏矩阵)时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多