Есть много способов сделать это, и какой из них лучше, будет зависеть от ваших потребностей.И, как вы отметили в своем заявлении, нет даже уникального выхода.
Один из способов сделать это - использовать Грам-Шмидта для нахождения ортогонального базиса, где первые векторы $ k $ в этом базисе имеют тот же промежуток, что и первые независимые от $ k $ строки.Если на каком-либо шаге вы обнаружите линейную зависимость, удалите эту строку из матрицы и продолжите процедуру.
Простой способ сделать это с помощью numpy:
q,r = np.linalg.qr(A.T)
, а затем удалитьлюбые столбцы, где R_ {i, i} равен нулю.
Например, вы можете сделать
A[np.abs(np.diag(R))>=1e-10]
Хотя это будет отлично работать в точной арифметике, оно может не работать так же хорошо в конечныхточность.Почти любая матрица будет численно независимой, поэтому вам понадобится какое-то пороговое значение, чтобы определить, есть ли линейная зависимость.Если вы используете встроенный метод QR, вам нужно будет убедиться, что нет зависимости от столбцов, которые вы ранее отбрасывали.
Если вам нужна еще большая стабильность, вы можете итеративно решить проблему наименьших квадратов
A.T[:,dependent_cols] x = A.T[:,col_to_check]
используя стабильный прямой метод.Если вы можете решить это точно, то AT [:, k] зависит от предыдущих векторов, с комбинацией, заданной x.
Какой решатель использовать также может быть продиктован вашим типом данных.