нуль-пространство
У меня есть набор уравнений с переменными, обозначенными строчными буквами и константами с прописными переменными как таковыми
A = a + b
B = c + d
C = a + b + c + d + e
Мне предоставлена информация о структуре этих уравнений в панде 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'])
Затем я преобразовываю это в разреженную матрицу CSC с помощью NetworkX
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 не очень хорошо с плавающей точкой. Поэтому я решил перейти к другому подходу, мотивированномуУдаление неразрешимых уравнений из недоопределенной системы, который предложил использовать SVD
Для удобства в библиотеке scipy.sparse есть функция svd, а именно scipy.sparse.linalg.svds. Однако, учитывая отсутствие у меня фона линейной алгебры, я не понимаю результатов, полученных при запуске этой функции на моем столе, или того, как использовать эти результаты, чтобы получить то, что я хочу.
Дальнейшие детали в проблемеКоэффициент каждой переменной в моей задаче равен 1. Так можно выразить данные в двух столбцах панд DataFrame, показанных ранее.Подавляющее большинство переменных в моих реальных примерах не будет решаемо. Цель состоит в том, чтобы найти те немногие, которые разрешимыЯ более чем готов попробовать альтернативный подход, если он соответствует ограничениям этой проблемы.Я впервые пишу вопрос, поэтому прошу прощения, если он не совсем соответствует правилам. Пожалуйста, оставьте конструктивную критику, но будьте нежны!