В комментариях / чате мы определили, по крайней мере, одну проблему, заключающуюся в том, что числовое разложение собственных чисел
(cov_w + I)^-1 @ cov_b (1)
не является реальным, как должно, но возвращает значительные мнимые компоненты.Здесь @ - умножение матриц, cov_w и cov_b - ковариационные матрицы, а I - единичная матрица.Это можно исправить путем вычисления квадратного корня матрицы из (cov_w + I) ^ - 1, назовем его SQ, а затем используем тот факт, что (1) аналогично
SQ @ cov_b @ SQ (2)
, следовательно, имеет те же собственные значения иесли V являются собственными векторами (2), то (правые) собственные векторы (1) имеют вид SQ @ V.
Мы получили то, что, поскольку (2) является симметричной матрицей, ее собственное разложение можно вычислитьиспользуя numpy.linalg.eigh
, что гарантирует чисто реальные результаты.eigh
также может использоваться для вычисления SQ, см. здесь .Обязательно обходите обратное и применяйте eigh
непосредственно к cov_w + I
или даже cov_w
.