使用 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 矩阵 的相关文章

  • 在 pandas 中获取组名称的有效方法

    我有一个包含大约 300 000 行的 csv 文件 我将其设置为按特定列分组 每个组大约有 140 名成员 总共 2138 个组 我正在尝试生成组名称的 numpy 数组 到目前为止 我已经使用 for 循环来生成名称 但处理所有内容都需
  • 在 Python 中绘制 Excel 中的数据

    我必须从 Excel 文件中读取和绘制数据的代码是这样的 import pandas as pd import matplotlib pyplot as plt excel file file1 xlsx file1 pd read exc
  • Pandas - 创建一个新列

    我总是使用以下内容在 pandas 中创建新列 df new column value 我正在使用这种方法 但是收到了设置副本的警告 在不创建副本的情况下创建新列的方法是什么 尝试使用 df loc new column value 正如
  • 将 2D Panda 的 DataFrame 列表转换为 3D DataFrame

    我正在尝试创建一个将标签值保存到 2D DataFrame 的 Pandas DataFrame 这是我到目前为止所做的 我正在使用读取 csv 文件pd read csv并将它们附加到列表中 出于这个问题的目的 让我们考虑以下代码 imp
  • 在 Python 中伪造一个对象是否是类的实例

    假设我有一堂课FakePerson它模仿基类的所有属性和功能RealPerson 不扩展它 在Python 3中 是否可以伪造isinstance 为了认识到FakePerson as a RealPerson只通过修改对象FakePers
  • Python Pandas:向类 pandas.core.series.Series 添加方法

    我想在 Python 中处理时间序列 因此 Pandas 的 Series 类非常完美 并且有很多有用的方法 现在我想添加一些我需要但未实现的方法 例如 假设我有兴趣添加一个方法 该方法将两次一值附加到时间序列中 让我们调用该方法appen
  • 为什么 pandas.series.map 如此慢?

    有时我只是讨厌使用中间件 以此为例 我想要一个查找表 将一组输入 域 值映射到输出 范围 值 映射是唯一的 Python 地图可以做到这一点 但由于地图相当大 我想为什么不使用 ps Series 及其索引 这给我带来了额外的好处 传入要映
  • 根据 pandas 中的 groupby 或循环条件划分列

    我有一个数据框 如下所示 B ID No Show Session slot num Patient count 1 0 2 S1 1 1 2 0 3 S1 2 1 3 0 8 S1 3 1 4 0 3 S1 3 2 5 0 6 S1 4
  • 在 Dask 中过滤分组 df

    与熊猫的类似问题相关 在 pandas 中过滤分组 df https stackoverflow com questions 13167391 filtering grouped df in pandas Action根据应用于与 grou
  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • 如何更改条形图上的 y 轴限制?

    我有一个df 我从中索引了europe n我绘制了一个条形图 europe n r 5 c 45 looks like this df Country string df Population numeric 变量 plt bar df C
  • 如何最好地将包含列表或元组的 Pandas 列提取到多个列中[重复]

    这个问题在这里已经有答案了 我不小心用错误重复的链接关闭了这个问题 这是正确的 Pandas 将列表的列拆分为多列 https stackoverflow com questions 35491274 pandas split column
  • 使用子图绘制 pandas 数据框 (subplots=True):放置图例并使用紧凑的布局

    我真的很喜欢 pandas 来处理和分析大数据集 到目前为止 我主要使用 matplotlib 进行绘图 但现在想使用 pandas 自己的绘图功能 基于 matplotlib 因为它需要更少的代码 并且在大多数情况下对我来说似乎足够了 尤
  • 将 csv 文件按多列拆分为 panda 数据框

    我有一个包含多列的 tsv 文件 有 10 多列 但对我来说重要的列是名称为 user name shift id url id 的列 我想创建一个数据框 首先根据用户名分隔整个 csv 文件 即只有具有相同用户名的行才会分组在一起 从该块
  • 仅对某些行的不同大小的两个 pandas 数据帧的列进行求和

    我有两个 pandas 数据框 如下所示 df1 n column1 0 5 0 0 0 1 6 0 0 0 2 7 0 0 0 3 8 0 0 0 4 9 0 0 0 5 10 0 0 0 df2 n column2 0 6 0 1 0
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • 良好的线性代数包[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为一个项目实现一些谱图算法 其中很大一部分是查找大型稀疏矩阵以及乘法矩阵的特征值和特征向量 我的问

随机推荐

  • 用于文件关联的 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