Python, инверсия матрицы

Как получить обратную матрицу в Python? Я сам реализовал это, но это чистый питон, и я подозреваю, что для этого есть более быстрые модули.


Вам стоит взглянуть на numpy, если вы используете матрицу манипуляции. Это модуль, в основном написанный на C, который будет намного быстрее, чем программирование на чистом python. Вот пример того, как инвертировать матрицу и выполнять другие манипуляции с матрицей.

  from numpy import matrixfrom numpy import linalgA = matrix ([[1,2,3],  [11,12,13], [21,22,23]]) # Создает матрицу. X = matrix ([[1], [2], [3]]) # Создает матрицу (например, вектор-столбец)  .y = matrix ([[1,2,3]]) # Создает матрицу (например, вектор-строку) .print AT # Транспонирует A.print A * x # Умножение матрицы A и x.print AI # Инверсия  A.print linalg.solve (A, x) # Решите систему линейных уравнений.  

Вы также можете взглянуть на модуль массива, который является гораздо более эффективной реализацией списки, когда вам нужно иметь дело только с одним типом данных.


55

Убедитесь, что вам действительно нужно инвертировать матрицу. Часто в этом нет необходимости, и это может быть нестабильно. Когда большинство людей спрашивают, как инвертировать матрицу, они действительно хотят знать, как решить Ax = b, где A — матрица, а x и b — векторы. Более эффективно и точнее использовать код, который решает уравнение Ax = b для x напрямую, чем вычислять обратное, а затем умножать обратное на B. Даже если вам нужно решить Ax = b для многих значений b, это не очень хорошая идея. чтобы инвертировать A. Если вам нужно решить систему для нескольких значений b, сохраните факторизацию Холецкого для A, но не инвертируйте ее.

См. Не инвертировать эту матрицу.

Поделиться
Улучшите этот ответ
отредактировано 16 апреля ’10 в 19:59
ответил 18 октября 2008 г., 20:12
  • Что, если члены моей матрицы являются точными рациональными числами? Похоже, это позволяет избежать проблемы с точностью, хотя, конечно, за счет того, что проблема с производительностью становится намного хуже. — Kragen Javier Sitaker 25 июн., 2011 в 04:12
добавить комментарий |

Убедитесь, что вам действительно нужно инвертировать матрицу. Часто в этом нет необходимости, и это может быть нестабильно. Когда большинство людей спрашивают, как инвертировать матрицу, они действительно хотят знать, как решить Ax = b, где A — матрица, а x и b — векторы.. Более эффективно и точнее использовать код, который решает уравнение Ax = b для x напрямую, чем вычислять обратное, а затем умножать обратное на B. Даже если вам нужно решить Ax = b для многих значений b, это не очень хорошая идея. чтобы инвертировать A. Если вам нужно решить систему для нескольких значений b, сохраните факторизацию Холецкого для A, но не инвертируйте ее.

См. Не инвертировать эту матрицу.


10

Жалко, что выбранная матрица повторяется здесь снова либо сингулярно, либо плохо обусловлено:

  A = matrix ([[1,2,3], [11,12,13], [21,22,  23]])  

По определению, обратное к A при умножении на саму матрицу A должно давать единичную матрицу. Буква А, выбранная в столь хваленном объяснении, этого не делает. Фактически, просто глядя на инверсию, можно понять, что инверсия не сработала правильно. Посмотрите на величину отдельных членов — они очень, очень большие по сравнению с членами исходной матрицы A …

Примечательно, что люди, выбирая пример матрицы, так часто удается выбрать сингулярную матрицу!

У меня была проблема с решением, поэтому я изучил ее подробнее. На платформе ubuntu-kubuntu пакет debian numpy не имеет матрицы и подпакетов linalg, поэтому, помимо импорта numpy, также необходимо импортировать scipy.

Если диагональ члены A умножаются на достаточно большой коэффициент, скажем 2, матрица, скорее всего, перестанет быть сингулярной или почти сингулярной. Итак,

  A = matrix ([[2,2,3], [11,24,13], [21,22,46]])  

не становится ни единичным, ни почти сингулярным, и этот пример дает значимые результаты … При работе с плавающими числами нужно внимательно следить за последствиями неизбежных ошибок округления.

Спасибо за ваш вклад,

OldAl.

Поделиться
Улучшить этот ответ
ответил 27 июня ’10 в 21:19
  • можно также проверить A == AII, чтобы проверить результат — georg 12 дек., 12:10
  • 1
    Проблема в том, что люди выбирают матрицы «случайным образом», вводя простую арифметику прогрессии в строках, например 1, 2, 3 или 11, 12, 13. Проблема в том, что что если у вас есть хотя бы три таких строки, они всегда линейно зависимы. — asmeurer 20 ноя 2014, в 20:31
добавить комментарий |

Жаль, что выбранная матрица, повторенная здесь снова, либо сингулярна, либо плохо обусловлена:

  A = matrix ([[1,2,3], [11,12,13], [21,22,23]])  

По По определению, обратное к A при умножении на саму матрицу A должно давать единичную матрицу. Буква А, выбранная в столь хваленном объяснении, этого не делает. Фактически, просто глядя на инверсию, можно понять, что инверсия не сработала правильно. Посмотрите на величину отдельных членов — они очень, очень большие по сравнению с членами исходной матрицы A …

Примечательно, что люди, выбирая пример матрицы, так часто удается выбрать сингулярную матрицу!

У меня была проблема с решением, поэтому я изучил ее подробнее. На платформе ubuntu-kubuntu пакет debian numpy не имеет матрицы и подпакетов linalg, поэтому, помимо импорта numpy, также необходимо импортировать scipy.

Если диагональ члены A умножаются на достаточно большой коэффициент, скажем 2, матрица, скорее всего, перестанет быть сингулярной или почти сингулярной. Итак,

  A = matrix ([[2,2,3], [11,24,13], [21,22,46]])  

не становится ни единичным, ни почти сингулярным, и этот пример дает значимые результаты … При работе с плавающими числами нужно внимательно следить за последствиями неизбежных ошибок округления.

Спасибо за ваш вклад,

OldAl.


6

Вы можете вычислить определитель рекурсивная матрица, а затем формируется присоединенная матрица

Вот краткое руководство

Я думаю, что это работает только для квадратных матриц

Другой способ их вычисления включает ортогонализацию по Граму-Шмидту, а затем транспонирование матрицы, транспонирование ортогонализированной матрицы является ее обратной!

Поделиться
Улучшить этот ответ
отредактировано 12 июня ’10 в 9:54
dbr
151k6161 золотой знак262262 серебряных знака331331 бронзовый знак
ответил 03 марта ’09 в 7:46

комментировать |


Вы можете вычислить определитель матрицы, которая является рекурсивной, а затем сформировать присоединенную матрицу

Вот краткое руководство

Я думаю, что это работает только для квадратных матриц

Другой способ их вычисления включает ортогонализацию по Граму-Шмидту, а затем транспонирование матрицы, транспонирование ортогонализированной матрицы это его обратное!


5

Numpy будет подходит для большинства людей, но вы также можете создавать матрицы в Sympy

Попробуйте запустить эти команды на http://live.sympy.org/

 M = Matrix ([[1, 3], [-2, 3]]) MM ** - 1  

Для удовольствия попробуйте M ** (1/2)

Поделиться
Улучшите этот ответ
отредактировано 17 июня 2015, 13:02
ответил 14 янв. в 23:49
  • 1
    Я обнаружил, что numpy.linalg давал неточные результаты для матриц, содержащих большие целые числа, тогда как результаты из sympy точны. +1 — примо 17 июня ’15 в 12:39
  • С приблизительной точностью Sympy — хороший и работающий терминал. Я проверил с помощью команды (M ** - 1) * M , и она дала единичную матрицу (не совсем, но очень близкую) — Дениз Каплан, 19 мая 2016, 21:29
добавить комментарий |

Numpy подойдет большинству людей, но вы также можете создавать матрицы в Sympy

Попробуйте запустить эти команды на http://live.sympy. org/

  M = Матрица ([[1, 3], [-2, 3]]) MM ** - 1  

Для развлечения попробуйте M**(1/2)


5

Для тех, кто, как я, искал решение на чистом Python без pandas или numpy , ознакомьтесь со следующим проектом GitHub: https://github.com/ThomIves/MatrixInverse.

Он щедро дает очень хорошее объяснение того, как этот процесс выглядит «за кулисами» . Автор красиво описал пошаговый подход и представил несколько практических примеров, которым легко следовать.

Это всего лишь небольшой фрагмент кода, чтобы очень кратко проиллюстрировать подход ( AM — исходная матрица, IM — это матрица идентичности того же размера):

  def invert_matrix (  AM, IM): для fd в диапазоне (len (AM)): fdScaler = 1.0/AM [fd] [fd] для j в диапазоне (len (AM)): AM [fd] [j] * = fdScaler IM [  fd] [j] * = fdScaler для i в списке (range (len (AM))) [0: fd] + list (range (len (AM))) [fd + 1:]: crScaler = AM [i]  [fd] для j в диапазоне (len (AM)): AM [i] [j] = AM [i] [j] - crScaler * AM [fd] [j] IM [i] [j] = IM [i  ] [j] - crScaler * IM [fd] [j] return IM  

Но, пожалуйста, следите за всем, вы узнаете гораздо больше, чем просто скопируйте и вставьте этот код! Кстати, есть блокнот Jupyter.

Надеюсь, это поможет кому-то, я лично нашел его чрезвычайно полезным для моей очень конкретной задачи (Поглощение цепей Маркова) где я был не могут использовать нестандартные пакеты.

Поделиться
Улучшите этот ответ
ответил 16 июля ’20 в 18:06
добавить комментарий |

Для тех, кто, как я, искал решение на чистом Python без pandas или numpy , ознакомьтесь со следующим проектом GitHub: https://github.com/ThomIves/MatrixInverse.

Он щедро дает очень хорошее объяснение того, как выглядит процесс «за кулисами». Автор красиво описал пошаговый подход и представил несколько практических примеров, которым легко следовать.

Это всего лишь небольшой фрагмент кода, чтобы очень кратко проиллюстрировать подход ( AM — исходная матрица, IM — это матрица идентичности того же размера):

  def invert_matrix (  AM, IM): для fd в диапазоне (len (AM)): fdScaler = 1. 0/AM [fd] [fd] для j в диапазоне (len (AM)): AM [fd] [j] * = fdScaler IM [fd] [j] * = fdScaler для i в списке (range (len (AM)  ))) [0: fd] + list (range (len (AM))) [fd + 1:]: crScaler = AM [i] [fd] для j в диапазоне (len (AM)): AM [i]  [j] = AM [i] [j] - crScaler * AM [fd] [j] IM [i] [j] = IM [i] [j] - crScaler * IM [fd] [j] return IM  

Но, пожалуйста, следите за всем, вы узнаете гораздо больше, чем просто копирование и вставку этого кода! Также есть блокнот Jupyter, кстати.

Надеюсь, что это поможет кому-то, я лично считаю его чрезвычайно полезным для моей очень конкретной задачи (Поглощение цепей Маркова), когда я не мог использовать какие-либо нестандартные пакеты.


1

Если вы ненавидите numpy, уберите RPy и свой локальный копию R и используйте ее вместо этого.

(Я бы также повторил эхо, чтобы вам действительно нужно было инвертировать матрицу. В R, например, linalg.solve и solution () functio n на самом деле не выполняет полную инверсию, так как в этом нет необходимости.)

Поделиться
Улучшить этот ответ
отредактировано 16 декабря ’08 в 17:19
ответил 17 окт. 2008 в 20:25
  • 3
    Никогда не использовал R, но почему внешняя программа и ее связыватель python лучше, чем наиболее известные научный пакет питона? — Juh_ 16 авг., 2012 в 14:25
добавить комментарий |

Если вы ненавидите numpy, достаньте RPy и вашу локальную копию R и используйте его вместо этого.

(Я бы также повторил эхо, чтобы вам действительно нужно было инвертировать матрицу. В R, например, linalg.solve и функция решить () фактически не выполняют полную инверсию, поскольку в этом нет необходимости.)

Оцените статью
Botgadget.ru
Добавить комментарий