【发布时间】:2018-11-23 09:02:08
【问题描述】:
问题
我有一组方程,其中变量用小写变量表示,常量用大写变量表示
A = a + b
B = c + d
C = a + b + c + d + e
我在 pandas DataFrame 中提供了有关这些方程式结构的信息,其中包含两列:Constants 和 Variables
例如
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。但是,由于我缺乏线性代数背景,我不明白在我的桌子上运行这个函数输出的结果,或者如何使用这些结果来得到我想要的。
问题的更多细节
- 我的问题中每个变量的系数都是1。这就是前面显示的两列pandas DataFrame中数据的表达方式
- 我的实际示例中的绝大多数变量都无法求解。目标是找到少数可解决的问题
- 如果它符合此问题的限制条件,我非常愿意尝试另一种方法。
这是我第一次发布问题,所以如果这不完全符合准则,我深表歉意。请留下建设性的批评,但要温柔!
【问题讨论】:
标签: pandas sparse-matrix linear-algebra svd