Можно ли найти параметры линейной регрессии аналитически, а не градиентным спуском
Что проверяют
Знаете ли вы нормальное уравнение и понимаете ли, почему на практике его не решают в лоб. Следом спрашивают, когда выгоднее градиентный спуск и что делать, если матрица необратима.
Как отвечать
Да. В методе наименьших квадратов функция потерь квадратичная, градиент приравнивают к нулю: Xᵀ(Xβ - y) = 0. Отсюда нормальное уравнение XᵀXβ = Xᵀy и решение β = (XᵀX)⁻¹Xᵀy. В X добавляют столбец единиц для свободного члена.
Дальше покажите, что понимаете вычислительную сторону:
- сложность: собрать
XᵀXстоит порядкаn·d²операций, решить систему порядкаd³, гдеnобъекты, аdпризнаки. Большоеnне страшно, узкое место в числе признаков; - без обращения матрицы: явно
inv()не считают, используют QR или SVD.numpy.linalg.lstsqиLinearRegressionиз scikit-learn решают задачу черезlstsq, это устойчивее; - обусловленность: у
XᵀXчисло обусловленности равно квадрату числа обусловленностиX, поэтому при почти коллинеарных признаках точность падает; - вырожденный случай: при мультиколлинеарности или
d > nрешение не единственное. Псевдообратная матрица (np.linalg.pinv) даёт решение с минимальной нормой, а гребневая регрессия(XᵀX + λI)⁻¹Xᵀyобратима при любомλ > 0.
Градиентный спуск нужен, когда признаков десятки тысяч, данные не помещаются в память и обучаются батчами (SGDRegressor, partial_fit) или модель дообучается онлайн. И там, где закрытой формы нет вовсе: у Lasso с L1-регуляризацией (её решают координатным спуском) и у логистической регрессии.
Где спотыкаются
Говорят, что при мультиколлинеарности аналитически решить нельзя. Нельзя обратить матрицу, а решение через псевдообратную или с регуляризацией есть.
Считают, что аналитика не годится для больших данных. Миллионы строк при сотне признаков решаются за секунды, проблема в размерности, а не в числе строк.
Пишут в коде np.linalg.inv(X.T @ X). На плохо обусловленных данных это даёт заметные численные ошибки, надёжнее lstsq.