A不可逆,但A * 1.00001是

时间:2018-01-21 18:06:28

标签: python numpy scipy sparse-matrix

我有一个奇怪的问题,我认为它来自数值准确性(但我不确定)。

我有一个稀疏矩阵(最后的数据)

x
Out[25]: 
<11250x11250 sparse matrix of type '<class 'numpy.float64'>'
    with 44547 stored elements in Compressed Sparse Column format>

和矢量

z = np.zeros((x.shape[0]))
z[idx] = 0.1

我正在努力解决

from scipy.sparse.linalg import spsolve
F = spsolve(x, z)

但我得到

scipy.sparse.linalg.dsolve.linsolve.MatrixRankWarning: Matrix is exactly singular

我很确定x 允许反转,之后我会对其进行描述。但是,指示性已经是

spsolve(x* 1.00000001, z)
Out[53]: array([-0., -0., -0., ..., -0., -0., -0.])
spsolve(x/ 1.00000001, z)
Out[54]: array([-0., -0., -0., ..., -0., -0., -0.])

如果x不可逆,则不应该是整个矩阵的线性缩放。

那么这里发生了什么?这些是浮点问题吗?

背景

我有一个矩阵A,它满足与转换矩阵相对应的连续时间生成矩阵的典型属性:

  • 对角线为负
  • 非对角线是非负面的
  • 行加起来一个

然后我想计算静止分布。我通过创建一个零向量z来做到这一点。对于任意索引idx,我设置z[idx] = 0.1。我修正了A[idx] = 0。然后,(未标准化的)静态分布g可以解决为

A.T g = z

在上一个问题中,已调整后的A A[idx] = 0标有x

数据

我不确定如何提供x背后的数据。当矩阵非常大时会出现问题,所以我不能只在这里粘贴内容。数据生成问题漫长而复杂,因此也不适合提供。

我提出的最好的方法是存储和上传(稀疏)npz,可以通过scipy.sparse.load_npz加载。如果有更好的方法,请告诉我。

我还绘制了与A相关联的最大奇异值:

singular values

然而,尚不清楚这些奇异值的单峰值预测数值稳定性有多少。接下来是我确实设法反转的矩阵的最大奇异值,它们看起来同样平坦:

sv, working case

1 个答案:

答案 0 :(得分:2)

您可以尝试的一个完整性检查是计算A矩阵的特征值谱。随机过程的静态分布基本上是具有特征值单位的过渡矩阵的特征向量。然而,为了具有明确定义的平衡分布,必须存在唯一的特征值,并且所有其他特征值必须具有小于1的(实部)。 因此,如果计算A的奇异值分解,您获得的对角矩阵将揭示关于平衡状态的稳定性以及系统上的多个时间尺度衰减到该均衡。 如果您的随机过程表现良好,那么以递减的排序数量级绘制奇异值的图表应该在n = 0时具有孤立的峰值。然而,如果有一个更渐进的衰退,那么这表明系统可能只能非常缓慢地达到平衡,并且随着你增加问题的维数,可能会在数字上受到疾病的影响。

值得检查Ornstein-Uhlenbeck进程的另一件事是,当您增加系统维度时,可能需要缩短转换矩阵的有效时间步长。这让人联想到需要将抛物线微分方程的数值解的时间步长减少到对应于网格的空间长度尺度,其中一个描述扩散过程,如果要避免数值不稳定。