Матрица, обратная в numpy/python, не дает правильной матрицы?

У меня есть матрица nxn C, и я использую inv из numpy.linalg, чтобы получить инверсию, чтобы получить Cinverse. Моя матрица C имеет элементы порядка 10**4, но моя матрица Cinverse имеет элементы порядка 10**12 и выше (не уверен, что это правильно). Когда я делаю numpyp.dot(C,Cinverse), я не получаю единичную матрицу. Почему это?

У меня есть вектор x, который я умножаю сам на себя, чтобы получить матрицу.

x=array([ 121.41191662,   74.22830468,   73.23156336,   75.48354975,
     79.89580817])
c=np.outer(xvector,xvector)

это матрица 5х5.

тогда я получаю обратное

from numpy.linalg import inv
cinverse=inv(c)

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

identity=np.dot(C00,C00inv)

Однако я не получаю идентификационную матрицу. cinverse имеет очень большие матричные элементы около 10 ** 13 и выше, а c имеет матричные элементы около 10 000.


person Nabeel Eh    schedule 14.02.2017    source источник
comment
Пожалуйста, будьте более конкретными. Можете ли вы показать нам ваш ввод и вывод? Кроме того, какой именно код вы используете?   -  person juanpa.arrivillaga    schedule 14.02.2017
comment
Не могли бы вы предоставить пример кода со случайными матрицами, чтобы показать, что вы пытаетесь сделать? Это звучит неправильно - когда вы говорите, что имеет элементы порядка 10 ** 4, означает ли это, что количество элементов равно размеру числа, то есть 10000? Ах, хуанпа, опереди меня;)   -  person RexFuzzle    schedule 14.02.2017
comment
Я не получаю матрицу идентичности - насколько она близка к идентичности? Вы не должны ожидать, что матрица будет состоять именно из 1 и 0 из-за ошибки округления.   -  person ali_m    schedule 15.02.2017
comment
Чтобы быть более конкретным, мои матричные элементы имеют порядок 10**4. Например, 8000,10000,7000.... и т. д. Я отредактировал исходный пост с некоторым кодом.   -  person Nabeel Eh    schedule 15.02.2017
comment
@RexFuzzle Я отредактировал исходный пост для ясности. Да, это, например, матрица 5x5 с величиной элементов около 10000.   -  person Nabeel Eh    schedule 15.02.2017
comment
@juanpa.arrivillaga Я добавил код и ввод в исходное сообщение   -  person Nabeel Eh    schedule 15.02.2017
comment
Каков определитель вашей матрицы? Насколько это близко к единственному?   -  person hpaulj    schedule 15.02.2017


Ответы (2)


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

Я удивлен, что numpy не вызывает исключения или, по крайней мере, не предупреждает.

person Paul Panzer    schedule 15.02.2017
comment
Почему это? Если вы посмотрите на уравнение 14 из academic.oup.com/ptep/article/doi/10.1093/ptep/ptu065/1560725/ вы увидите, что мне нужно внешнее произведение двух векторов, которое создает ковариационную матрицу ( Я просто рассматриваю случай l=m=0). Уравнение 13 требует, чтобы я взял обратное - person Nabeel Eh; 15.02.2017
comment
@NabeelEh Но я надеюсь, вы поняли математический аргумент? Что бы там ни говорилось в этой бумаге. Если у вас есть более одного измерения, внешний продукт необратим. Это факт. Теперь я действительно не могу ожидать, что буду читать ваши статьи для вас, но на этот раз: то, что у вас есть (14), не внешний продукт. Это сумма внешних произведений. Очевидно, что если вы добавите достаточно матриц ранга 1, вы можете получить полный ранг. - person Paul Panzer; 15.02.2017
comment
Я понимаю. Да, я понял аргумент. Спасибо, Павел, спасибо за помощь! - person Nabeel Eh; 16.02.2017

Итак, вот некоторый код, который генерирует обратную матрицу, и я прокомментирую его позже.

import numpy as np
x = np.random.rand(5,5)*10000 # makes a 5x5 matrix with elements around 10000
xin = np.linalg.inv(x)
iden = np.dot(x,xinv)

Теперь первая строка вашей матрицы идентификации, вероятно, выглядит примерно так: [ 1.00000000e+00, -2.05382445e-16, -5.61067365e-16, 1.99719718e-15, -2.12322957e-16] . Обратите внимание, что первый элемент точно равен 1, как и должно быть, а другие не совсем равны 0, однако они по существу равны нулю и должны рассматриваться как нулевые в соответствии с машинной точностью.

person RexFuzzle    schedule 15.02.2017
comment
Привет @RexFuzzle, я был бы счастлив, если бы это были мои результаты. Мой вектор x=массив([4140.56172552, 2561.7498602, 2529.56826173, 2607.35090233, 2759.5614813]). Я получаю свою матрицу, используя c=np.outer(x,x), а затем инвертирую, используя cinv=inv(c). Затем, используя np.dot(c,cinv), моя первая строка [ 6.01898362e-01, 5.53081985e+00, 1.79258876e+00, -5.86243807e-01, 1.50883747e+01], которая не является идентичностью - person Nabeel Eh; 15.02.2017