numpy cond неправильный вывод - PullRequest
1 голос
/ 21 июня 2020

У меня 1000 by 5000 матрица A. Я пытаюсь найти его номер условия. Я знаю, что число условия - это соотношение между наибольшим и наименьшим собственными значениями A.T @ A, но, возможно, я ошибаюсь, поэтому я проверил и другой способ.

Я написал следующий сценарий:

print(np.linalg.cond(A))
eig = np.linalg.eig(A.T @ A)[0]
print(eig[0] / eig[-1])
eig = np.linalg.eig(A @ A.T)[0]
print(eig[0] / eig[-1])

и печатает

1549.2730284204385
(5.3052933708830795e+20+0j)
1076234.004648219

Кто-нибудь может объяснить несоответствие?

1 Ответ

1 голос
/ 24 июня 2020

Число обусловленности - это соотношение между наибольшим и наименьшим сингулярными значениями, которые являются квадратными корнями из собственных значений A.T@A. Вы можете вычислить сингулярные значения с помощью SVD, и они будут уже отсортированы.

S = np.linalg.svd(A,compute_uv=False)
print(S[0] / S[-1])

Если вы хотите использовать собственные значения, вы должны отсортировать их самостоятельно.

vals = np.sort(np.linalg.eigvals(A.T@A))
print(np.sqrt(vals[-1]) / np.sqrt(vals[0]))
...