Метод наименьших квадратов: линия сквозь облако
Урок про метод наименьших квадратов (МНК) — как провести наилучшую прямую сквозь облако зашумлённых данных.
Метод наименьших квадратов подбирает параметры модели так, чтобы минимизировать сумму квадратов отклонений модели от данных: $\min \sum (y_i - \text{модель}(x_i))^2$.
Интерполяция против аппроксимации
В прошлом разделе кривая проходила точно через узлы. Но реальные данные зашумлены: измерения с погрешностью, разброс эксперимента. Прогонять кривую точно через каждую точку здесь вредно — она будет «гоняться за шумом», теряя общую тенденцию. Нужно другое: провести простую кривую рядом с точками, отражающую закономерность, а не шум. Это и есть аппроксимация. Самый частый случай — провести прямую $y = a \cdot x + b$ сквозь облако точек.
Вопрос: какая прямая «наилучшая»? МНК отвечает: та, для которой сумма квадратов вертикальных отклонений точек от прямой минимальна. Почему квадратов, а не модулей? Квадрат гладко дифференцируем (легко искать минимум), сильнее штрафует крупные промахи и приводит к красивым линейным формулам.
Вывод формул
Ищем $a, b$, минимизирующие $E(a,b) = \sum (y_i - a \cdot x_i - b)^2$. В точке минимума частные производные по $a$ и по $b$ равны нулю. Приравняв их, получаем систему двух линейных уравнений (нормальные уравнения), решение которой — явные формулы:
$$a = \frac{n \cdot \sum(x_i \cdot y_i) - \sum x_i \cdot \sum y_i}{n \cdot \sum(x_i^2) - (\sum x_i)^2}$$
$$b = \frac{\sum y_i - a \cdot \sum x_i}{n}$$
def мнк_прямая(xs, ys):
n = len(xs)
sx = sum(xs); sy = sum(ys)
sxx = sum(x*x for x in xs)
sxy = sum(xs[i]*ys[i] for i in range(n))
a = (n*sxy - sx*sy) / (n*sxx - sx*sx)
b = (sy - a*sx) / n
return a, b
# Зашумлённые данные вокруг прямой y = 2x + 1
xs = [0, 1, 2, 3, 4]
ys = [1.1, 2.9, 5.2, 6.8, 9.1]
a, b = мнк_прямая(xs, ys)
print(f"наилучшая прямая: y = {a:.4f}·x + {b:.4f}")
# Коэффициент детерминации R^2 — доля объяснённой дисперсии
ym = sum(ys) / len(ys)
ss_tot = sum((y - ym)**2 for y in ys)
ss_res = sum((ys[i] - (a*xs[i] + b))**2 for i in range(len(xs)))
print(f"R^2 = {1 - ss_res/ss_tot:.6f}")
Вывод:
наилучшая прямая: y = 1.9900·x + 1.0400 R^2 = 0.997305
МНК нашёл $y \approx 1.99x + 1.04$ — почти идеально восстановил скрытую закономерность $2x + 1$ из зашумлённых данных. Метрика $R^2 \approx 0.997$ близка к 1: прямая объясняет 99.7% разброса данных.
Связь с линейной регрессией
МНК — это и есть линейная регрессия из статистики и машинного обучения. Когда вы обучаете простейшую модель «предсказать y по x», вы решаете ровно эту задачу минимизации суммы квадратов. Коэффициенты $a$ (наклон) и $b$ (сдвиг) — те же, что в формуле тренда в Excel или в LinearRegression из scikit-learn. Так численный метод XIX века (Гаусс, Лежандр) оказывается фундаментом современного ML.
| Область | Как называют МНК |
| Численные методы | метод наименьших квадратов |
| Статистика | линейная регрессия (OLS) |
| Машинное обучение | линейная модель с MSE-функцией потерь |
| Excel | линия тренда, ЛИНЕЙН / НАКЛОН |
Как работает под капотом
Геометрически МНК — это ортогональная проекция вектора данных y на подпространство, натянутое на столбцы матрицы признаков. Минимум квадратичной функции $E$ — единственный (это парабола-«чаша»), поэтому формулы дают глобальный, а не локальный оптимум. Важная тонкость: МНК минимизирует вертикальные отклонения, считая x точным, а шум — только в y. Если погрешность есть и в x, нужна другая постановка (полная МНК / Деминга). В библиотеке вся задача — одна строка: numpy.polyfit(x, y, 1) или scipy.stats.linregress.
Частые ошибки
- Применять МНК к нелинейной зависимости как есть. Если данные не на прямой, сначала линеаризуйте (логарифм, замена переменных) или используйте полиномиальную/нелинейную модель.
- Игнорировать выбросы. Квадрат сильно штрафует крупные промахи, и один выброс может перекосить прямую; иногда нужна робастная регрессия (по модулю, Хьюбер).
- Путать $R^2$ с «правильностью модели». Высокий $R^2$ не означает, что модель верна — он лишь мера согласия с данными.
Итоги
- Аппроксимация проводит простую кривую рядом с зашумлёнными точками (в отличие от точной интерполяции).
- МНК минимизирует сумму квадратов отклонений; для прямой это даёт явные формулы через суммы $\sum x, \sum y, \sum x^2, \sum xy$.
- Это и есть линейная регрессия — фундамент статистики и ML.
- Минимум единствен (квадратичная «чаша»); шум предполагается только в
y.