使用 svd 求解欠定 scipy.sparse 矩阵

2023-12-09

Problem

我有一组方程,其中变量用小写变量表示,常量用大写变量表示

A = a + b  
B = c + d  
C = a + b + c + d + e  

我在具有两列的 pandas DataFrame 中提供了有关这些方程结构的信息:常数 and 变量

E.g.

df = pd.DataFrame([['A','a'],['A','b'],['B','c'],['B','d'],['C','a'],['C','b'], 
['C','c'],['C','d'],['C','e']],columns=['Constants','Variables'])

然后我使用 NetworkX 将其转换为稀疏 CSC 矩阵

table = nx.bipartite.biadjacency_matrix(nx.from_pandas_dataframe(df,'Constants','Variables')  
,df.Constants.unique(),df.Variables.unique(),format='csc')

当转换为稠密矩阵时,table看起来像下面这样

矩阵([[1, 1, 0, 0, 0],[0, 0, 1, 1, 0],[1, 1, 1, 1, 1]], dtype=int64)

我在这里想要的是找到哪些变量是可解的(在这个例子中,只有e是可解的)并且对于每个可解变量,其值取决于什么常量(在这种情况下,因为e = C-B-A,它取决于A, B, and C)

尝试解决方案

我首先尝试使用 rref 来求解可解变量。我使用了符号库 sympy 和函数 sympy.Matrix.rref,这正是我想要的,因为任何可解变量都会有自己的行,其中几乎全是零和 1 个一,我可以逐行检查。

然而,这个解决方案并不稳定。首先,它非常慢,并且没有利用我的数据集可能非常稀疏的事实。此外, rref 对于浮点的处理不太好。所以我决定转向另一种方法,动机是从欠定系统中删除不可解的方程,建议使用 svd

方便的是,scipy.sparse库中有一个svd函数,即scipy.sparse.linalg.svds。然而,由于我缺乏线性代数背景,我不明白在我的桌子上运行这个函数所输出的结果,或者如何使用这些结果来获得我想要的结果。

问题中的更多细节

  1. 我的问题中每个变量的系数都是 1。这就是如何在前面显示的两列 pandas DataFrame 中表达数据
  2. 我的实际例子中的绝大多数变量都是不可解的。目标是找到少数可解决的问题
  3. 如果替代方法符合这个问题的限制,我非常愿意尝试它。

这是我第一次发布问题,所以如果这不完全遵循准则,我深表歉意。请留下建设性的批评,但要温和!


您正在解决的系统具有以下形式

[ 1 1 0 0 0 ] [a]   [A]
[ 0 0 1 1 0 ] [b] = [B]
[ 1 1 1 1 1 ] [c]   [C]
              [d]
              [e]

即五个变量的三个方程a, b, c, d, e。正如您的问题中提到的答案所提到的,人们可以通过以下方法解决这种不确定的系统伪逆,Numpy 直接提供了pinv功能。

Since M具有线性独立的行,在这种情况下,伪逆具有以下属性:M.pinv(M) = I, where I表示单位矩阵(在本例中为 3x3)。因此,正式地,我们可以将解决方案写为:

v = pinv(M) . b

where v是 5 分量解向量,并且b表示右侧 3 分量向量[A, B, C]。然而,这个解决方案并不是唯一的,因为我们可以添加来自所谓的内核或零空间矩阵的M(即向量w为此M.w=0)这仍然是一个解决方案:

M.(v + w) = M.v + M.w = b + 0 = b

因此,唯一有唯一解的变量是那些来自零空间的所有可能向量的相应分量的变量M为零。换句话说,如果将零空间的基组装成一个矩阵(每列一个基向量),那么“可解变量”将对应于该矩阵的零行(列的任何线性组合的相应分量将那么也为零)。

让我们将其应用到您的特定示例中:

import numpy as np
from numpy.linalg import pinv

M = [
    [1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0],
    [1, 1, 1, 1, 1]
]

print(pinv(M))

[[ 5.00000000e-01 -2.01966890e-16  1.54302378e-16]
 [ 5.00000000e-01  1.48779676e-16 -2.10806254e-16]
 [-8.76351626e-17  5.00000000e-01  8.66819360e-17]
 [-2.60659800e-17  5.00000000e-01  3.43000417e-17]
 [-1.00000000e+00 -1.00000000e+00  1.00000000e+00]]

从这个伪逆,我们看到变量e(最后一行)确实可以表达为- A - B + C。然而,它也“预测”a=A/2 and b=A/2。为了消除这些非唯一的解决方案(同样有效也a=A and b=0例如),让我们借用 SciPy 的函数来计算零空间Cookbook:

print(nullspace(M))

[[ 5.00000000e-01 -5.00000000e-01]
 [-5.00000000e-01  5.00000000e-01]
 [-5.00000000e-01 -5.00000000e-01]
 [ 5.00000000e-01  5.00000000e-01]
 [-1.77302319e-16  2.22044605e-16]]

该函数已经返回组装成矩阵的零空间的基础(每列一个向量),我们看到,在合理的精度内,唯一的零行确实只是与变量对应的最后一行e.

EDIT:

对于方程组

A = a + b, B = b + c, C = a + c

对应的矩阵M is

[ 1 1 0 ]
[ 0 1 1 ]
[ 1 0 1 ]

在这里我们看到矩阵实际上是方阵,并且是可逆的(行列式是2)。因此,伪逆与“正常”逆一致:

[[ 0.5 -0.5  0.5]
 [ 0.5  0.5 -0.5]
 [-0.5  0.5  0.5]]

对应于解决方案a = (A - B + C)/2, .... Since M是可逆的,它的内核/零空间是空的,这就是cookbook函数只返回的原因[]。为了了解这一点,让我们使用内核的定义 - 它由所有非零向量组成x这样M.x = 0。然而,自从M^{-1}存在,x给出为x = M^{-1} . 0 = 0这是一个矛盾。从形式上来说,这意味着找到的解决方案是唯一的(或者所有变量都是“可解的”)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 svd 求解欠定 scipy.sparse 矩阵 的相关文章

随机推荐

  • 用于文件关联的 dde ​​的最佳 .net 替代方案是什么?

    我有一个 MDI Windows 窗体应用程序 net 2008 它允许用户将各种文件类型与该应用程序关联 我目前使用类似这样的注册表项来执行此操作 这会导致应用程序通过命令行加载和访问文件名 Registry SetValue appKe
  • 如何在 Android Studio 中打开现有的 Eclipse 项目?

    切换到 Android Studio 并在 Eclipse 中处理我现有的所有项目 那么这样做的程序是什么 从 Eclipse 导出 1 更新您的 Eclipse ADT 插件 您必须拥有 22 0 或更高版本 2 在 Eclipse 中
  • 是否应该弃用 Task.Wait?

    我经历了惨痛的教训 从池线程调用 Task Wait 可能会导致线程饥饿死锁 根据这篇 MSDN 文章 在 死锁 一章中 我们应该遵守这两个规则 不要创建其同步方法等待异步函数的任何类 因为可以从池上的线程调用此类 如果类阻塞等待异步函数
  • Python 中 int 实例的 int 值存储在哪里?

    The intpython 中的 type 提供了两个名为numerator and real具有相同的内容 int 由于所有这 3 个值都返回相同的内部属性 我猜real是这样的属性 property def real self retu
  • 无法链接 CSS 和图像

    我正在开发 Spring Hibernate JSP 应用程序 我正在尝试显示 JSP 页面中的图像 图像未显示在浏览器上 我也无法将我的 CSS 链接到 JSP 页面 我的JSP页面是
  • 单独托管 API 和 IdentityServer4 主机(C#、.NET CORE)有哪些优势? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 也许我要问的问题非常明显和简单 但作为 IdentityServer4 的初学者以及或多或少的 oAuth2 OpenID 和 API 的初学者 我发现它很难理解 我们公司的目标是使用身份
  • 如何跳过ActiveRecord回调? [复制]

    这个问题在这里已经有答案了 可能的重复 如何避免运行 ActiveRecord 回调 我有这样的模型 class Vote lt ActiveRecord Base after save add points to user end 是否有
  • 为什么'LDR'不能用'B'代替?

    我有一个程序 arm 和一些指令 IDA 的 disas plt 000083F0 ADRL R12 0x83F8 plt 000083F8 LDR PC R12 off 90D8 0x83F8 sub 83D0 地址0x90D8存储0x8
  • 尝试通过 AWS SNS 向印度移动发送短信

    我的用例是通过 AWS SNS 向印度移动发送短信 我创建了订阅者并选择了短信协议 对于端点 我提供了我的手机号码 它接受并创建了订阅 我创建了订阅主题以将短信发送到我的手机号码 它显示已发送消息 但我没有收到来自该主题的任何消息 如何在A
  • WordPress:上传时发生错误

    更新到 WordPress 3 5 后 当我以非管理员用户身份使用 添加媒体 按钮上传文件时 开始出现以下错误 错误 上传时发生错误 请稍后再试 图片似乎已完成上传 但最后出现此错误消息 这种情况不会发生在管理员身上 只会发生在其他角色身上
  • 正则表达式来匹配单词

    我正在寻找一个正则表达式 使用 NET 来匹配单词ass 正则表达式不应匹配诸如赋值之类的单词 我怎样才能做到这一点 您正在寻找单词边界 b bass b 这将匹配ass但不是bass or assignment
  • 使用 NSDistributedNotificationCenter for iTunes 获取有关歌曲信息更改的通知

    我知道你可以使用 iTunesDNC addObserver self selector selector updateInfo name com apple iTunes playerInfo object nil 每次播放器更改歌曲 停
  • 运行在 Visual Studio 中添加为资源的 exe 文件

    简单地说 我已将 exe 文件作为资源添加到 Visual Studio 项目中 我如何运行这个文件 我正在用 c 编码 您可以将 Resource 作为 byte byte myResBytes Assembly asm Assembly
  • Flask 在 GAE 上重定向

    您好 我正在 Google 应用引擎上使用 Flask http flask pocoo org 我有以下代码 app route edit html methods GET POST def create if request metho
  • 在 Swift 中处理 XML 元素的属性

    我想阅读url使用 NSXMLParser 来自此元素的属性
  • 如何从 Android 应用程序读取内存数据

    我想从应用程序中获取一些数字数据 但它们不会存储为像 db 这样的文件 我知道有一些内存黑客应用程序可以改变游戏值 尽管我不知道它们是如何工作的 我正在寻找类似的功能 但不需要更改任何内容 我试图编写的应用程序只是从特定应用程序读取一些数据
  • 在 PHP 中使用 array_chunk 移动元素

    我有一个基本数组 其中使用 array chunk 将其分为 3 个元素 array array a b c d e f g h chunk array chunk array 3 结果如下 a b c d e f g h Las chun
  • 如果未实例化成员模板,是否要评估 static_asserts?

    我想我明白了static assert工作了 但是当我在 g 编译器上尝试这个时 我开始想知道 include
  • 错误:关系不存在

    所以问题就在这里 我正在用 java 抓取一些数据 最终我将 java 放入 postgres 数据库中 当我运行 Java 程序时 我收到错误 ERROR 关系 表名 不存在 但是当我亲自在 PGAdmin III 中编写相同的查询时 它
  • 使用 svd 求解欠定 scipy.sparse 矩阵

    Problem 我有一组方程 其中变量用小写变量表示 常量用大写变量表示 A a b B c d C a b c d e 我在具有两列的 pandas DataFrame 中提供了有关这些方程结构的信息 常数 and 变量 E g df p