хорошее численное решение для преобразования LDA - PullRequest
2 голосов
/ 12 декабря 2010

Я вычисляю преобразование 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 десятичным знакам.Есть ли лучший способ сделать это численно?

1 Ответ

2 голосов
/ 12 декабря 2010

Попробуйте eigh вместо eig. Поскольку сигма ^ {- 1/2} B_0 сигма ^ {1/2} симметрична, используйте адаптированную процедуру.

Также остерегайтесь использования правильного алгоритма при вычислении B_0. См. http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Two-pass_algorithm для более простого случая (который вы можете адаптировать здесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...