通过简单的线性回归理解机器学习的基本原理

在本文中,我将使用一个简单的线性回归模型来解释一些机器学习(ML)的基本原理。线性回归虽然不是机器学习中最强大的模型,但由于容易熟悉并且可解释性好,所以仍然被广泛使用。简单地说,线性回归用于估计连续或分类数据之间的线性关系。

我将使用X和y来表示变量。如果你喜欢更具体的东西,可以想象y是销售额,X是广告支出,我们想估计广告花费如何影响销售额。我将展示一个线性回归如何学习绘制最适合通过这些数据的线:

机器学到了什么?

机器学习最基础的问题是:“机器(即统计模型)实际上学到了什么?”

这取决于不同的模型,但简单来说,模型学习函数f,使f(X)映射到y。换句话说,模型学习如何采取X(即特征,或者说自变量(S)),预测y(目标,或者说因变量)。

在简单的线性回归的情况下(y ~ b0 + b1 * X,其中X是列)的模型“学习”两个参数:

  • B0:偏置(或者说,截距)
  • b1:斜率

当X为0时的y水平坐标等于偏置(即广告支出为零时的销售额的值),斜率是X中每单位增长或减少对y预测增长或减少的比率(即,每英镑花在广告上会带来多少销售额的增长)。两个参数都是标量。

一旦模型学习到这些参数,你就可以用给定X值来计算y的估计值。换句话说,当你不知道y是什么时候,你可以用这些它们来预测y的值,这是一个预测模型!

学习参数:成本函数

学习LR模型的参数有几种方法,我将着重于最好说明统计学习的方法: 最小化成本函数。

请记住,机器学习的重点是从数据中学习。我们用一个简单的比喻来说明。对于孩子,我们通常会通过告知他禁止做什么事情,或者因为做了不该做的事情而让他受到惩罚的方式,教会他理解正确的行为。例如,你可以想象一个四岁的孩子坐在火旁保暖,但因为他不知道火的危险,她把手指放了进去烧伤了。下一次他坐在火旁,他就不会因为玩火导致烧伤,但是也许他会因为坐得离火太近,太热,不得不离开。第三次他坐在火旁边,发现有一个距离让她既可以保持温暖,也不会让她受到任何危险。换句话说,通过经验和反馈,孩子掌握了与火的最佳距离。这个例子中的火的热量是一个成本函数。

在机器学习中,使用成本函数来估计模型的表现。简而言之,成本函数是衡量模型在估计X和Y之间关系方面的错误程度的度量。成本函数(你也可以参考损失函数或误差函数)可以通过迭代地运行模型来估计的对“地面真值”(即y的已知值)的预测。

因此,ML模型的目标是找到使成本函数最小化的参数,权重或结构。

最小化成本函数:梯度下降

既然我们知道模型是通过最小化成本函数来学习的,那么你可能想知道成本函数是如何最小化的,那么让我们开始介绍梯度下降。梯度下降是一种有效的优化算法,试图找到函数的局部或全局最小值。

梯度下降使模型能够学习模型应该采取的梯度或方向,以减少误差(实际y与预测y之间的差异)。简单线性回归示例中的方向是指如何调整或修正模型参数b0和b1以进一步降低成本函数。随着模型迭代,它逐渐收敛到最小值,继续对参数做更进一步的调整只能产生很小(甚至没有)的损失变化。

这个过程是整个ML过程不可或缺的一部分,它极大地加快了学习过程。梯度下降过程的替代方案可能是粗暴地穷举所有可能的参数组合,直到确定使成本最小化的组为止。显而易见,这是不可行的。因此,梯度下降使得学习过程能够对所学习的估计进行纠正更新,将模型导向最佳参数组合。

在线性回归模型中观察学习

为了在线性回归中观察学习,我手动设置参数b0和b1并使用模型从数据中学习这些参数。换句话说,我们知道X与y之间关系的地面真值,并且可以通过参数迭代校正对成本的回应来观察学习这种关系的模型。

01
library(dplyr)
02
library(ggplot2)
03

04
n     <- 200 # number of observations
05
bias  <- 4
06
slope <- 3.5
07
dot   <- `%*%` # defined for personal preference
08

09
x   <- rnorm(n) * 2
10
x_b <- cbind(x, rep(1, n))
11
y   <- bias + slope * x + rnorm(n)
12
df  <- data_frame(x = x,  y = y)
13

14
learning_rate <- 0.05
15
n_iterations  <- 100
16
theta         <- matrix(c(20, 20))
17

18
b0    <- vector("numeric", length = n_iterations)
19
b1    <- vector("numeric", length = n_iterations)
20
sse_i <- vector("numeric", length = n_iterations)

这里我定义了偏置和斜率(分别等于4和3.5)。我也为X添加了一个列(用于支持矩阵乘法)。我也给y添加了一些高斯噪声来掩盖真正的参数,即创建完全随机的误差。现在我们有一个包含两个变量X和y的dataframe,这个变量似乎有一个正的线性趋势(即y随着增加X值而增加)。

接下来我定义了学习率,它控制每个梯度的步骤大小。如果这太大,模型可能会错过函数的局部最小值。如果太小,模型会需要很长时间才能收敛。Theta存储参数b0和b1,它们用随机值初始化。n_iterations控制模型迭代和更新值的次数。最后,在模型的每次迭代中,我创建了一些占位符来捕获b0,b1的值和误差平方和(SSE)。

这里的SSE是成本函数,它仅仅是预测y和实际y之间的平方差的和(即残差)。

现在,我们运行循环。在每次迭代中,模型将根据Theta值预测y,计算残差,然后应用梯度下降估计校正梯度,然后使用这些梯度更新theta的值,重复此过程100次。当循环结束时,我创建一个dataframe来存储学习的参数和每次迭代的损失。

01
for (iteration in seq_len(n_iterations)) {
02

03
  residuals_b        <- dot(x_b, theta) - y
04
  gradients          <- 2/n * dot(t(x_b), residuals_b)
05
  theta              <- theta - learning_rate * gradients
06

07
  sse_i[[iteration]] <- sum((y - dot(x_b, theta))**2)
08
  b0[[iteration]]    <- theta[2]
09
  b1[[iteration]]    <- theta[1]
10

11
}
12

13
model_i <- data.frame(model_iter = 1:n_iterations,
14
                      sse = sse_i,
15
                      b0 = b0,
16
                      b1 = b1)

当迭代完成后,我们可以绘制超过模型估计的线。

01
p1 <- df %>%
02
  ggplot(aes(x=x, y=y)) +
03
  geom_abline(aes(intercept = b0,
04
                  slope = b1,
05
                  colour = -sse,
06
                  frame = model_iter),
07
              data = model_i,
08
              alpha = .50
09
              ) +
10
  geom_point(alpha = 0.4) +
11
  geom_abline(aes(intercept = b0,
12
                  slope = b1),
13
              data = model_i[100, ],
14
              alpha = 0.5,
15
              size = 2,
16
              colour = "dodger blue") +
17
  geom_abline(aes(intercept = b0,
18
                  slope = b1),
19
              data = model_i[1, ],
20
              colour = "red",
21
              alpha = 0.5,
22
              size = 2) +
23
  scale_color_continuous(low = "red", high = "grey") +
24
  guides(colour = FALSE) +
25
  theme_minimal()
26

27
p2 <- model_i[1:30,] %>%
28
  ggplot(aes(model_iter, sse, colour = -sse)) +
29
  geom_point(alpha = 0.4) +
30
  theme_minimal() +
31
  labs(x = "Model iteration",
32
       y = "Sum of Sqaured errors") +
33
  scale_color_continuous(low = "red", high = "dodger blue") +
34
  guides(colour = FALSE)

首先要注意的是粗的红线。这是从b0和b1的初始值估计的线。你可以看到,这并不适合数据点,正因为如此,它有最高的SSE。但是,你会看到逐渐向数据点移动的线,直到找到最适合的线(粗蓝线)。换句话说,在每次迭代时,模型为b0和b1学习了更好的值,直到找到最小化成本函数的值为止。模型学习b0和b1的最终值分别是3.96和3.51,因此非常接近我们设置的参数4和3.5。

我们还可以在模型的迭代中看到SSE的减少。在收敛和稳定之前,它在早期迭代中急剧下降。

我们现在可以使用的B0和B1存储在theta的学习值为新的X值预测y值。

01
predict_from_theta  < -  function(x){
02

03
  x  < - cbind(x,rep(1,length(x)))
04
  点(x,theta)
05

06
}
07

08
predict_from_theta(rnorm(10))
09
           [,1 ]
10
[ 1,] - 1.530065
11
[ 2,]   8.036859
12
[ 3,]   6.895680
13
[ 4,]   3.170026
14
[ 5,]   4.905467
15
[ 6,]   2.644702
16
[ 7,] 12.555390
17
[ 8,]   1.172425
18
[ 9,]   3.776509
19
[ 10,]   4.849211

总结

本文介绍了一种简要理解机器学习的方法。毫无疑问,机器学习还有很多知识本文中没有被提到,但是了解“底层”的基本原理获得初步的直觉可以大大提高你对更复杂模型的理解。

本文由AiTechYun编译,转载请注明出处。更多内容关注微信公众号atyun_com 或访问www.atyun.com

时间: 2024-11-13 06:33:36

通过简单的线性回归理解机器学习的基本原理的相关文章

Mahout和Hadoop:机器学习的基本原理

计算技术通常用来分析数据,而理解数据则依赖于机器学习.多年来,对于大多数开发者来说,机器学习却是非常遥远.一直是难以企及的. 这可能是现在收益最高,也是最受欢迎的一项技术之一.毫无疑问--作为开发人员,机器学习是一个能够大展身手的舞台. 图1:机器学习的构成 机器学习是简单数据检索与存储的合理扩展.通过开发各种组件,使计算机更加智能学习和发生行为. 机器学习使得挖掘历史数据和预测未来趋势成为可能.你可能还没意识到,但的确已经在使用机器学习,并受益颇多.与机器学习有关的例子很多,如搜索引擎产生结果

用超级玛丽理解机器学习基础

有关神经网络和机器学习的文章很多,因为这个主题在最近几年里非常受欢迎.该领域看起来似乎让人难以靠近,并且非常难以理解,许多人认为必须是数学家或统计学家才能掌握机器学习的相关概念.然而,机器学习和神经网络的基本概念不一定像人们想象的那样复杂. 本文的目的是通过一个简单的例子来解释机器学习工作原理的高层概念.希望这能为你继续阅读和学习相关知识带来更多的兴趣和信心. 增强学习 机器学习程序与常规程序的不同之处在于程序员没有在机器学习程序中明确地定义逻辑,而是创建了一个能够自己学习如何成功完成任务的程序

《R语言机器学习:实用案例分析》——2.1节理解机器学习

2.1 理解机器学习 我们是不是被教导说,计算机系统需要编程才能完成特定任务?只有对它们进行编程的情况下,它们在完成任务时才可能快百万倍.我们必须对每一个步骤进行编程,然后才能使这些系统工作并完成任务.那么机器学习是不是一个非常矛盾的概念? 简单地说,机器学习指的是一种教授系统学习执行特定任务的方法,例如学习一个功能.尽管听起来很简单,但它有点混乱而又难以理解.感觉混乱的原因是,我们观察系统(特别是计算机系统)工作的方式与我们学习的方式是两种几乎没有交集的概念.更难以理解的原因是,虽然学习是人类

.NET开发基础:从简单的例子理解泛型 分享_实用技巧

从简单的例子理解泛型话说有家影视公司选拔偶像派男主角,导演说了,男演员,身高是王道.于是有下面代码:  复制代码 代码如下: //男演员实体类public class Boy{    //姓名    private string mName;    //身高    private int mHeight;    public string Name {        get { return this.mName; }    }    public int Height {        get

简单易学!一步步带你理解机器学习算法——马尔可夫链蒙特卡罗(MCMC)

本文由北邮爱可可-爱生活老师推荐,阿里云组织翻译. 以下为译文: 什么是MCMC,什么时候使用它 MCMC只是一种从分布中抽样的算法.这个术语代表"马尔可夫链蒙特卡罗",因为它是一种使用了"马尔可夫链"的"蒙特卡罗"(即随机)方法.MCMC只是一种蒙特卡罗方法. 为什么我要从分布抽样呢? 从分布抽样是解决一些问题的最简单的方法. 也许在贝叶斯推断中最常见的方式是使用MCMC来从某些模型的后验概率分布中抽取样本.有了这些示例,你就可以问这样的问题:

JavaScript——以简单的方式理解闭包

      闭包,在一开始接触JavaScript的时候就听说过.首先明确一点,它理解起来确实不复杂,而且它也非常好用.那我们去理解闭包之前,要有什么基础 呢?我个人认为最重要的便是作用域(lexical scope),如果对作用域和作用域链不理解的同学最好自己先去学一学,再回过头来,理解闭包,就更加轻松. 下面便直接进入主题. 我们知道一个函数是有作用域的,在函数内部定义的局部变量只有在函数内部才可以访问的到.一旦函数访问结束被销毁,局部变量随之也会销毁,无法 通过任何方式再次访问局部变量,除

简单粗暴地理解 JavaScript 原型链

原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗称造人. 3)人他妈会记录啪啪啪的信息,所以可

Asp中通过简单的例子理解下ByVal和ByRef的用法

文件名称: ByVal.asp ByRef.asp 具体代码: <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByVal T)T=T+1End subcall TestMain()%> <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByRef T)T=T+1End subcall T

《实用机器学习》——1.4 本书概述

1.4 本书概述 本书主要从解决实际问题的角度来介绍常用的机器学习算法.在1.3节中我们讨论了机器学习中常见的4类典型问题,基本上覆盖了目前实际中可以使用机器学习算法来解决的主要问题类型.在本书中,我们将主要讨论对应的4类算法,包括: 回归算法: 分类算法: 推荐算法: 排序算法. 其中回归算法和分类算法是两类最常用的算法,也是其他很多算法的基础,因此我们首先予以介绍.推荐系统在目前有了越来越多的应用,而排序算法在搜索引擎等领域也获得了广泛的应用,因此我们也会对常用的推荐算法和排序算法进行介绍.