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。这就是如何在前面显示的两列 pandas DataFrame 中表达数据
- 我的实际例子中的绝大多数变量都是不可解的。目标是找到少数可解决的问题
- 如果替代方法符合这个问题的限制,我非常愿意尝试它。
这是我第一次发布问题,所以如果这不完全遵循准则,我深表歉意。请留下建设性的批评,但要温和!