- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组方程,其中的变量用小写变量表示,常量用大写变量表示
A = a + b
B = c + d
C = a + b + c + d + e
我在 pandas DataFrame 中获得了有关这些方程结构的信息,其中包含两列:常量和变量
例如
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')
转换为稠密矩阵时,表格如下所示
矩阵([[1, 1, 0, 0, 0],[0, 0, 1, 1, 0],[1, 1, 1, 1, 1]], dtype=int64)
我想要的是找到哪些变量是可解的(在这个例子中,只有e是可解的),对于每个可解的变量,它的值取决于什么常量(在这种情况下,由于e = C-B-A,它依赖于A, B 和 C)
我首先尝试使用 rref 来求解可解变量。我使用了符号库 sympy 和函数 sympy.Matrix.rref,这正是我想要的,因为任何可解变量都会有自己的行,其中几乎全是零和 1 个一,我可以逐行检查。
但是,这个解决方案并不稳定。首先,它非常慢,并且没有利用我的数据集可能非常稀疏的事实。此外, rref 对于浮点的处理不太好。因此,我决定转向由 Removing unsolvable equations from an underdetermined system 插入的另一种方法。 ,建议使用 svd
方便的是,scipy.sparse库中有一个svd函数,即scipy.sparse.linalg.svds。然而,由于我缺乏线性代数背景,我不明白在我的 table 上运行这个函数所输出的结果,或者如何使用这些结果来获得我想要的结果。
这是我第一次发布问题,因此,如果这不完全遵循准则,我深表歉意。请留下建设性的批评,但要温和!
最佳答案
您正在求解的系统具有以下形式
[ 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
。正如您的问题中提到的答案所提到的,人们可以使用 pseudoinverse 来解决这种不确定的系统。 ,Numpy 直接根据 pinv 提供功能。
自 M
具有线性独立的行,在这种情况下,伪逆具有 M.pinv(M) = I
的属性,其中I
表示单位矩阵(在本例中为 3x3)。因此,正式地,我们可以将解决方案写为:
v = pinv(M) . b
哪里v
是 5 分量解向量,并且 b
表示右侧 3 分量向量 [A, B, C]
。然而,这个解决方案并不是唯一的,因为可以添加来自所谓的内核或 null space 的向量。矩阵 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
和b=A/2
。为了消除这些非唯一解(例如 a=A
和 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
对应的最后一行。 .
编辑:
对于方程组
A = a + b, B = b + c, C = a + c
对应的矩阵M
是
[ 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, ...
。自 M
是可逆的,它的内核/零空间是空的,这就是 Cookbook 函数仅返回 []
的原因。为了了解这一点,让我们使用内核的定义 - 它由所有非零向量 x
组成。这样M.x = 0
。然而,自从 M^{-1}
存在,x
给出为 x = M^{-1} . 0 = 0
这是一个矛盾。从形式上来说,这意味着找到的解决方案是唯一的(或者所有变量都是“可解的”)。
关于pandas - 使用 svd 求解欠定 scipy.sparse 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50843004/
pandas.crosstab 和 Pandas 数据透视表似乎都提供了完全相同的功能。有什么不同吗? 最佳答案 pivot_table没有 normalize争论,不幸的是。 在 crosstab
我能找到的最接近的答案似乎太复杂:How I can create an interval column in pandas? 如果我有一个如下所示的 pandas 数据框: +-------+ |
这是我用来将某一行的一列值移动到同一行的另一列的当前代码: #Move 2014/15 column ValB to column ValA df.loc[(df.Survey_year == 201
我有一个以下格式的 Pandas 数据框: df = pd.DataFrame({'a' : [0,1,2,3,4,5,6], 'b' : [-0.5, 0.0, 1.0, 1.2, 1.4,
所以我有这两个数据框,我想得到一个新的数据框,它由两个数据框的行的克罗内克积组成。正确的做法是什么? 举个例子:数据框1 c1 c2 0 10 100 1 11 110 2 12
TL;DR:在 pandas 中,如何绘制条形图以使其 x 轴刻度标签看起来像折线图? 我制作了一个间隔均匀的时间序列(每天一个项目),并且可以像这样很好地绘制它: intensity[350:450
我有以下两个时间列,“Time1”和“Time2”。我必须计算 Pandas 中的“差异”列,即 (Time2-Time1): Time1 Time2
从这个 df 去的正确方法是什么: >>> df=pd.DataFrame({'a':['jeff','bob','jill'], 'b':['bob','jeff','mike']}) >>> df
我想按周从 Pandas 框架中的列中累积计算唯一值。例如,假设我有这样的数据: df = pd.DataFrame({'user_id':[1,1,1,2,2,2],'week':[1,1,2,1,
数据透视表的表示形式看起来不像我在寻找的东西,更具体地说,结果行的顺序。 我不知道如何以正确的方式进行更改。 df示例: test_df = pd.DataFrame({'name':['name_1
我有一个数据框,如下所示。 Category Actual Predicted 1 1 1 1 0
我有一个 df,如下所示。 df: ID open_date limit 1 2020-06-03 100 1 2020-06-23 500
我有一个 df ,其中包含与唯一值关联的各种字符串。对于这些唯一值,我想删除不等于单独列表的行,最后一行除外。 下面使用 Label 中的各种字符串值与 Item 相关联.所以对于每个唯一的 Item
考虑以下具有相同名称的列的数据框(显然,这确实发生了,目前我有一个像这样的数据集!:() >>> df = pd.DataFrame({"a":range(10,15),"b":range(5,10)
我在 Pandas 中有一个 DF,它看起来像: Letters Numbers A 1 A 3 A 2 A 1 B 1 B 2
如何减去两列之间的时间并将其转换为分钟 Date Time Ordered Time Delivered 0 1/11/19 9:25:00 am 10:58:00 am
我试图理解 pandas 中的下/上百分位数计算,但有点困惑。这是它的示例代码和输出。 test = pd.Series([7, 15, 36, 39, 40, 41]) test.describe(
我有一个多索引数据框,如下所示: TQ bought HT Detailed Instru
我需要从包含值“低”,“中”或“高”的数据框列创建直方图。当我尝试执行通常的df.column.hist()时,出现以下错误。 ex3.Severity.value_counts() Out[85]:
我试图根据另一列的长度对一列进行子串,但结果集是 NaN .我究竟做错了什么? import pandas as pd df = pd.DataFrame([['abcdefghi','xyz'],
我是一名优秀的程序员,十分优秀!