Comments 4
Очень полезный пост). Спасибо большое, как раз надо написать свою реализацию PCA для лабы, а так теория хоть будет))
Появилось несколько вопросов:
Когда мы уменьшаем размерность, мы явно как то платим точностью(хоть и не сильно значительно): меняется ли плата за точность от способа к способу?
Правильно ли я понимаю, что в методе Ланцоша мы как то интересно применили метод Грамма-Шмидта, или он совсем тут не причем?
Как примерно выбирается k? Есть ли оптимальный выбор? (Условно говоря корень или деление на три)
За такую хорошую асимптотику в методе Ланцоша мы теряем что то, или мы "магическим образом" уменьшили ошку
Что из всего этого действительно часто применяется на практике? Или все больше теория?
1) если говорить о трёх вышеперечисленных способах то нет, это грубо говоря 3 алгоритма для решения одной и той же задачи.
Потеря алгоритма определяется скорее выбором k. Разве что в методе Ланцоша из-за его итеративной философии мы потеряем в качестве если остановимся слишком рано.
2) грубо говоря, да. философия у них крайне похожая. только вот в теоретическом методе у нас есть замечательное рекуррентное соотношение, которое нам позволяет не трогать все подряд, а работать с последними двумя векторами. И это ключевое отличие. А вот в переортогонализации (то что описано в конце статьи) уже используется именно модификация Грама Шмидта.
3) выбор k обычно такой:
Если используем PCA для визуализации берём k=2 или 3
А в общем случае обычно подбирают через кросс валидацию
Есть ещё вариант попробовать подобрать k так, чтобы получить как можно больше объясненной дисперсии (explained_variance_ratio_ в sklearn)
4) ни то, ни другое :) мы просто решаем более узкую задачу (находим первые несколько компонент). Только уже возникает другая проблема - сходимость может быть медленной на плохом спектре.
5) И svd и Ланцош используются на практике. Полный свд берут когда датасет маленький, тогда нам плевать на кубическую сложность, как-то потерпим. Ланцоша берут для больших разреженных матриц (такое тоже часто в мл встречается). А на больших плотных данных, наверное, чаще всего используют randomized svd. С одной стороны это как обычный свд, с другой – он берет только первые несколько k+p компонент , примерно как Ланцош. Здесь p это "запас" (условно p=10)
Отличная статья! Спасибо!
Математика для меня все еще выглядит как какая-то магия. Удивительно, до чего люди смогли додуматься
Разбираемся в ML без воды: от базы до Attention. Часть 12: Понижение размерности и PCA