Линейная регрессия — это основа машинного и глубокого обучения.

Линейная регрессия проста. Но я могу сказать, что это самая важная модель в области статистики, машинного обучения. Если вы заинтересованы в машинном обучении, алгоритмах глубокого обучения, понимании регрессии, вы сможете быстро изучить их с глубоким пониманием.

Линейная регрессия может найти линейную связь между переменными.

Предположим, у нас есть переменная X (рост) и переменная Y (вес). Мы предполагаем, что существует линейная зависимость между X и Y.

И, используя линейную регрессию, мы можем найти, насколько это связано между X и Y.

Вот пример данных,

Построив график X и Y, мы видим четкую линейную зависимость между ростом и весом.

Как мы можем выразить это отношение?

Поскольку мы предполагали линейную зависимость и использовали линейное уравнение,

Как видите, предположение о линейной зависимости может быть выражено с помощью неизвестных β и члена ошибки ϵ. И наша цель - найти неизвестные термины.

Теперь алгоритм линейной регрессии найдет нам неизвестные β, используя данные.

Давайте сначала посмотрим на результат, используя R.

regvariable <- data.frame(
'Y' = c(73,65,85,90,55,62,73,80,83,67,73,58),
'X' = c(175,170,182,190,165,171,180,185,182,173,188,162)
)
fit <- lm(Y~X, data = regvariable)
summary(fit)

Результат говорит нам, что

прогнозируемые веса могут быть рассчитаны по приведенному ниже уравнению.

и построение графика результатов показывает,

Как это удалось сделать с помощью регрессии?

Наша цель — найти неизвестный член (β), это все, что нам нужно сделать.

прежде чем продолжить, нам нужно определить, что такое хороший β. это означает, что нам нужна сетка или какой-то стандарт для оценки хороших и плохих оценок.

Остатки — это ключ!

Если оценка сделана правильно, разница между фактическим Y и прогнозируемым Y будет небольшой.

поэтому, когда мы оцениваем β, вычисляем остатки. это разница между фактическим и прогнозируемым весом.

тогда хорошей мерой будет остаточная сумма квадратов (RSS).

Итак, на самом деле регрессия просто находит комбинацию β с наименьшим RSS!

Я покажу вам, что это значит.

Я сгенерировал случайную комбинацию β, чтобы я мог рисовать случайные линейные линии.

Если я сгенерирую достаточно случайных строк, то одна из них будет хорошей оценкой.

plot(regvariable$X, regvariable$Y,  xlab = 'Height', ylab = 'Weight',
     main = "Random linear lines", cex = 0.5)
rbeta0 <- runif(400,-250,100)
rbeta1 <- runif(400,-1.5,1.5)
for( i in 1:400){
abline(a=rbeta0[i], b=rbeta1[i], col = i)  
}

рассчитать RSS из 400 случайных оценок и построить график с каждым β

RSS <- function(Y, Yhat){
  sum( ( Y - Yhat)^2 )
}
RSS_K <- c()
for( k in 1 : 400){
  yhat_k <- rbeta0[k] + rbeta1[k]*regvariable$X
  RSS_K[k] <- RSS(Y =  regvariable$Y, Yhat = yhat_k)  
}

Вы можете видеть, что RSS имеет минимальное значение, когда β0 составляет около -130~-120.

Вы можете видеть, что RSS имеет минимальное значение, когда β1 составляет около 0,9 ~ 1,1.

Итак, комбинация β, минимизирующая RSS, близка к реальному результату. Если я сгенерирую 1000, 10000, 100000 комбинаций, то результат будет гораздо ближе.

То, что я вам показал, называется метод поиска по сетке. Это простой в реализации и интуитивно понятный способ понять, как работает алгоритм. Купить неэффективный способ для реального использования.

Нахождение β, которое минимизирует RSS, — это то, что делает регрессия. это все.

Теперь, если вы знакомы с производными и математическими выражениями,

ниже приведен формальный и более точный способ понять, что делает регрессия.

Наша цель,

Поскольку Yhat = прогнозируемая переменная Y

Мы можем переписать RSS следующим образом

Как видите, RSS — это выпуклая функция. что означает, что наша задача может быть определена как поиск β, который делает RSS`(β) = 0, что является точкой минимума выпуклой функции.

Производная RSS по каждому β0 и β1 дает,

теперь у вас есть ответ.

Наконец, давайте рассчитаем, как указано выше, и посмотрим, совпадает ли это с результатом функции R.

X <- regvariable$X
Y <- regvariable$Y
n <- nrow(regvariable)
beta1 <- ( n * sum( X * Y ) - sum(X) * sum(Y) ) / ( n*sum(X^2) - (sum(X))^2 )
beta0 <- (sum(Y) / n ) - ( beta1*sum(X) / n )
print(paste0('beta0 : ', beta0, ',', ' beta1 : ', beta1))