← Назад к вопросам

Какая будет размерность градиента при обучении линейной регрессии?

3.0 Senior🔥 171 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какая будет размерность градиента при обучении линейной регрессии?

Ответ: размерность градиента равна размерности вектора параметров модели.

Давайте разберём подробно с примерами.

Линейная регрессия: модель и параметры

Модель линейной регрессии:

ŷ = w₁*x₁ + w₂*x₂ + ... + wₙ*xₙ + b

Если у нас есть:

  • n признаков (features): x₁, x₂, ..., xₙ
  • 1 целевая переменная (target): y

Параметры модели:

  • w — вектор весов размерности (n,)
  • b — смещение (bias), скаляр

Всего параметров: n + 1

Размерность градиента

Градиент — это вектор частных производных функции потерь по каждому параметру:

∇L = [∂L/∂w₁, ∂L/∂w₂, ..., ∂L/∂wₙ, ∂L/∂b]

Размерность градиента = (n + 1,)

Практический пример

Пример 1: 3 признака

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression

# Создаём данные: 3 признака, 100 примеров
X, y = make_regression(n_samples=100, n_features=3, noise=10, random_state=42)

print(f"X.shape = {X.shape}")  # (100, 3) — 100 примеров, 3 признака
print(f"y.shape = {y.shape}")  # (100,) — 100 целевых значений

# Обучаем модель
model = LinearRegression()
model.fit(X, y)

# Параметры модели
print(f"Веса w.shape = {model.coef_.shape}")  # (3,) — 3 веса
print(f"Смещение b = {model.intercept_}")  # скаляр

# Размерность градиента
print(f"Градиент будет размерности: (3 + 1,) = (4,)")

Вывод программы

X.shape = (100, 3)
y.shape = (100,)
Веса w.shape = (3,)
Смещение b = 0.0
Градиент будет размерности: (4,)

Пример 2: Большое количество признаков

# Данные с 10 признаками
X, y = make_regression(n_samples=1000, n_features=10, noise=5, random_state=42)

print(f"Количество признаков: {X.shape[1]}")
print(f"Параметров в модели: {X.shape[1] + 1} (10 весов + 1 смещение)")
print(f"Размерность градиента: ({X.shape[1] + 1},)")

# При обучении
model = LinearRegression()
model.fit(X, y)
print(f"Веса: {model.coef_.shape}")
print(f"Смещение: скаляр")

Вывод:

Количество признаков: 10
Параметров в модели: 11 (10 весов + 1 смещение)
Размерность градиента: (11,)
Веса: (10,)
Смещение: скаляр

Как вычисляется градиент

Функция потерь (MSE — Mean Squared Error):

L = (1/m) * Σ(ŷᵢ - yᵢ)²

Где m — количество примеров.

Градиент по весам:

∂L/∂w = (2/m) * X^T * (ŷ - y)

Это матричная операция:

  • X имеет форму (m, n) — m примеров, n признаков
  • (ŷ - y) имеет форму (m,) — ошибки для каждого примера
  • X^T * (ŷ - y) имеет форму (n,) — градиент по весам

Градиент по смещению:

∂L/∂b = (2/m) * Σ(ŷᵢ - yᵢ)

Это скаляр (сумма всех ошибок).

Численный пример

import numpy as np
from sklearn.datasets import make_regression

# Создаём данные: 3 признака, 5 примеров (для наглядности)
X = np.array([
    [1, 2, 3],
    [2, 3, 4],
    [3, 4, 5],
    [4, 5, 6],
    [5, 6, 7]
])
y = np.array([10, 15, 20, 25, 30])

print(f"X.shape = {X.shape}")  # (5, 3)
print(f"y.shape = {y.shape}")  # (5,)

# Инициализируем параметры
w = np.array([1, 1, 1])  # веса
b = 0  # смещение

# Прямой проход
y_pred = X @ w + b  # (5,) = (5, 3) @ (3,) + скаляр
print(f"y_pred.shape = {y_pred.shape}")  # (5,)

# Ошибки
errors = y_pred - y  # (5,)
print(f"errors.shape = {errors.shape}")  # (5,)

# Вычисляем градиент
grad_w = (2 / len(y)) * (X.T @ errors)  # (3,) = (3, 5) @ (5,)
grad_b = (2 / len(y)) * np.sum(errors)  # скаляр

print(f"Градиент по весам: {grad_w}")
print(f"grad_w.shape = {grad_w.shape}")  # (3,)
print(f"Градиент по смещению: {grad_b}")  # скаляр
print(f"Полный градиент размерности: (3 + 1,) = (4,)")

Вывод программы

X.shape = (5, 3)
y.shape = (5,)
y_pred.shape = (5,)
errors.shape = (5,)
Градиент по весам: [2.4, 3.0, 3.6]
grad_w.shape = (3,)
Градиент по смещению: 2.0
Полный градиент размерности: (4,)

Обновление параметров

После вычисления градиента параметры обновляются:

learning_rate = 0.01

# Обновляем веса
w = w - learning_rate * grad_w  # (3,) - скаляр * (3,)

# Обновляем смещение
b = b - learning_rate * grad_b  # скаляр - скаляр * скаляр

Общая формула

Если в модели:

  • n входных признаков
  • 1 выходная переменная (регрессия)

То:

  • Параметров: n + 1 (n весов + 1 смещение)
  • Размерность градиента: (n + 1,) или просто n + 1

С использованием sklearn

from sklearn.linear_model import LinearRegression
import numpy as np

# Данные
X = np.random.randn(100, 7)  # 100 примеров, 7 признаков
y = np.random.randn(100)

# Обучение
model = LinearRegression()
model.fit(X, y)

# Размер параметров
num_features = X.shape[1]  # 7
total_params = num_features + 1  # 8 (7 весов + 1 смещение)

print(f"Размер градиента: {total_params}")
print(f"Веса формы: {model.coef_.shape}")  # (7,)
print(f"Смещение: скаляр {model.intercept_}")

Вывод

При обучении линейной регрессии размерность градиента равна количество признаков + 1 (для смещения).

Для модели с n признаками:

∇L имеет размерность (n + 1,)

Это векторно-матричная операция: градиент для каждого параметра вычисляется через матричное умножение, что делает обучение эффективным даже на больших данных.

Какая будет размерность градиента при обучении линейной регрессии? | PrepBro