【问题标题】:scipy matrix solver error: nzvals is not of a type supported by SuperLUscipy 矩阵求解器错误:nzvals 不是 SuperLU 支持的类型
【发布时间】:2020-09-01 15:27:35
【问题描述】:

我正在尝试使用来自answered question 的脚本,该脚本使用scipy 矩阵求解器通过求解以下类型的矩阵方程来拟合某些光谱数据的基线:Ax=b

这是我输入数组的一部分

    y = numpy.asarray([0.3227648437023163, 0.3186240792274475, 0.31572669744491577,
                       0.3266492336988449, 0.31392455101013184, 0.31541168689727783,
                       0.3163585960865021, 0.3191247135400772, 0.3223631978034973],
                      dtype=float)

和发布的脚本(接受的答案)

    import numpy as np
    from scipy import sparse
    from scipy.sparse.linalg import spsolve

    def baseline_als(y, lam, p, niter=10):
      L = len(y)
      D = sparse.csc_matrix(np.diff(np.eye(L), 2))
      w = np.ones(L)
      for i in xrange(niter):
        W = sparse.spdiags(w, 0, L, L)
        Z = W + lam * D.dot(D.transpose())
        z = spsolve(Z, w*y)
        w = p * (y > z) + (1-p) * (y < z)
      return z

    bl = baseline_als(y, lam=1e05, p=.01, niter=10)

重现以下错误信息:

File "/Users/username/Library/Python/3.7/lib/python/site-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 196, in spsolve
    b, flag, options=options)
TypeError: nzvals is not of a type supported by SuperLU

指向此代码的z = spsolve(Z, w*y) 行。

(作为旁注,我遵循了链接答案中参数值的建议:

我们发现通常0.001 ≤ p ≤ 0.1 是一个不错的选择(对于具有正峰值的信号)和10^2 ≤ λ ≤ 10^9,但可能会出现例外情况。>

具有 p=0.01 和 lambda =1e05 的有意义的中间值。)

但是,当提供随机向量时:

    y = numpy.random.randn(1000)

该函数产生了一些真实的输出,没有任何错误消息。

  1. 我查看了 linsolve.py 的第 196 行,但无法推断出如何进行,因为我的向量 w*y 的形状正确为 ndarray,形状为 (n,)(n,1),如 @987654335 中所述@ 的评论部分(这里称为向量 b)。
  2. 正如建议的herelinsolve.py 的评论部分,将b 更改为b.todense() 没有帮助。此外,我的网络搜索没有返回任何与此错误消息相关的匹配。

由于错误消息是指在我的数据和随机向量上运行type 命令的数据类型,因此产生了预期的结果:

    (9,), <class 'numpy.ndarray'>
    (1000,), <class 'numpy.ndarray'>

我完全不知道如何解决这个错误。任何建议将不胜感激。

系统:OSX 10.15.4、numpy 1.18.3、scipy 1.4.1。

【问题讨论】:

  • 我会在每次迭代中测试Zw*y,直到找到引发错误的组合。尺寸足够小。使用测试用例(猜测函数参数值)它为我运行。
  • 我测试了它并立即得到错误(在第一次迭代时)。
  • 我肯定猜错了 lam 和 p。
  • 我澄清了在函数调用中包含 lam 和 p 的推荐值的问题。
  • dtype 怎么样?

标签: scipy python-3.7


【解决方案1】:

我遇到了同样的问题,我可以通过更改线路来解决它:

z = spsolve(Z, w*y)

与:

z = spsolve(Z, w*y.astype(np.float64))

根据this thread中的“新功能”部分。

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 2013-01-07
    • 2015-06-19
    • 1970-01-01
    • 2021-01-20
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多