Линейная регрессия — это основа машинного и глубокого обучения.
Линейная регрессия проста. Но я могу сказать, что это самая важная модель в области статистики, машинного обучения. Если вы заинтересованы в машинном обучении, алгоритмах глубокого обучения, понимании регрессии, вы сможете быстро изучить их с глубоким пониманием.
Линейная регрессия может найти линейную связь между переменными.
Предположим, у нас есть переменная 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))