Numpy: единственная матрица - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь вычислить обратную матрицу формы X'X, используя NumPy следующим образом.

df = pd.read_csv('https://raw.githubusercontent.com/jianghaochu/data/master/x.csv')
X = np.array(df)
X.shape  # returns (92, 18)
np.linalg.det(np.matmul(X.transpose(), X))  # returns 8.029863818629298
np.linalg.matrix_rank(np.matmul(X.transpose(), X))  # returns 17

Меня смущает то, что X'X имеет не полный ранг, а определитель положительный, и NumPy может успешно рассчитать обратное значение X'X. Однако, если я возьму другую матрицу Y, которая образована подмножеством столбцов X, детерминант становится равным нулю, и обратное вычисление не может быть вычислено.

Y = X[:, [0, 12, 13, 14, 15, 16, 17]]
Y.shape  # returns (92, 7)
np.linalg.det(np.matmul(Y.transpose(), Y))  # returns 0.0
np.linalg.matrix_rank(np.matmul(Y.transpose(), Y))  # returns 16
np.linalg.inv(np.matmul(Y.transpose(), Y))  # numpy.linalg.LinAlgError: Singular matrix

numpy .linalg .LinAlgError: Сингулярная матрица

На мой взгляд, столбцы Y линейно зависимы. Следовательно, Y'Y сингулярен, а его определитель равен нулю. Добавление большего числа столбцов в Y (как в X) не должно приводить к линейной независимости. Следовательно, я не могу понять, как NumPy может вычислить обратное значение X'X, если Y'Y является единственным.

Я вычисляю оценку OLS, используя приведенные выше данные. Когда я использую столбцы (переменные) в Y, я получаю единственную ошибку, которая, как я полагаю, обусловлена ​​совершенной коллинеарностью независимых переменных. Когда я добавляю больше независимых переменных в модель и получаю матрицу как X, я могу успешно получить оценку, используя NumPy. Это действительно смущает меня, так как предполагает, что добавление большего количества независимых переменных может решить идеальную коллинеарность, которая действительно поражает мою голову.

Я боролся с этим весь день и вечер, но все еще не могу понять. Я также попробовал это в R и получил тот же результат. Я надеюсь, что кто-то может направить меня в некоторых новых направлениях. Любые предложения будут оценены.

1 Ответ

0 голосов
/ 20 марта 2020

Проверьте обсуждение здесь: numpy инвертирует единственную матрицу .

Обобщая сказанное:

  • Причина, по которой вы получаете такое результат в том, что numpy использует декомпозицию LU для вычисления обратного.
  • Такой «обратный» нельзя использовать для решения систем линейных уравнений.
  • Этого не происходит в Numpy 1.12.0
  • Номер условия вашей матрицы действительно велика: np.linalg.cond(X.T@X) = 5.7294895077058016e+17

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

lambdas, V = np.linalg.eig(X.T@X)

lambdas[np.isclose(lambdas, 0)]
array([1.89103844e-15])
...