Я вычисляю преобразование LDA (линейный дискриминантный анализ) для приложения, над которым я работаю, и я следовал этим примечаниям (начиная со страницы 36, особенно слайд 47 зеленого цвета).).
Я делаю это на Python (с numpy и scipy), и вот что я придумал:
import numpy as np
from scipy.linalg import sqrtm
...
sw_inv_sqrt = np.linalg.inv(sqrtm(self.sigma_within))
self.d, self.v = np.linalg.eig(
np.dot(
np.dot(sw_inv_sqrt, self.sigma_between),
sw_inv_sqrt
))
self.v = np.dot(sw_inv_sqrt, self.v)
Я знаю, что эта реализация верна, поскольку ясравнил это с другими.Меня беспокоит, является ли это хорошим решением в числовом смысле .Сравнивая мое решение с другими, они соответствуют только примерно 6 десятичным знакам.Есть ли лучший способ сделать это численно?