Как рассчитать масштабную обратную матрицу в питоне - PullRequest
0 голосов
/ 26 июня 2018

Поскольку мы знаем, что мы можем вычислить обратную матрицу с помощью numpy следующим образом.

matrix1 = np.matrix([[8,2,5],[7,3,1],[4,9,6]])
inverse_matrix1 = matrix1.I
result = np.matmul(matrix1, inverse_matrix1)

Результат следующий, и нам легко проверить точность, просто выполнив np.matmul.

matrix([[ 0.03585657,  0.1314741 , -0.05179283],
    [-0.15139442,  0.11155378,  0.10756972],
    [ 0.20318725, -0.25498008,  0.03984064]])

Проверенный результат выглядит следующим образом.

matrix([[ 1.00000000e+00,  0.00000000e+00,  2.77555756e-17],
    [ 0.00000000e+00,  1.00000000e+00,  3.46944695e-17],
    [-2.22044605e-16,  0.00000000e+00,  1.00000000e+00]])

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

point = np.reshape(np.linspace(-5.0, 5.0, 300), (300, 1))
kernel_matrix_np = np.exp(-(point - np.transpose(point))**2 / (2 * 2**2))

Я не уверен, как я могу вычислить такую ​​матрицу. Большое вам спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Разница в результатах между вашими примерами не из-за размера матриц, а из-за ранга. Первая матрица имеет полный ранг

>>> matrix_rank(matrix1)
3  ## Shape of the matrix

форма матрицы), тогда как во втором случае матрица имеет ранг 19.

>>> matrix_rank(kernel_matrix_np)
19   ## Much less than the shape of the matrix

Невозможно восстановить исходную матрицу в этом случае - требуется матрица полного ранга. Как уже упоминалось @Brenlla, это отражается в номере условия. Грубо говоря, каждый порядок величины в номере условия представляет одну цифру потерянной точности.

>>> cond(kernel_matrix_np)
1.9605027391309521e+19

Это всего лишь две вещи, которые нужно проверить, когда вычисления производятся с использованием матриц, и, как правило, одна из них указывает на проблему. Наконец, в некоторых случаях использование pinv вместо inv дает несколько лучшие результаты, хотя в этом случае это не сработает, поскольку матрица не имеет полного ранга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...