一.线性回归的基本概念及应用
1.回归的定义
回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。它是一种监督类的学习方法,可以建立函数模型,而相应的模型能够预测连续数值型输出,如房价、股票价格或气温等。在回归分析中,算法从输入特征(自变量)学习到输出值之间的映射关系,以便于对新的未知数据点做出连续的预测。
(总的来说:它是一种可以建立预测类模型的一个方法。)
2.线性回归的定义
线性回归是统计学中最基础也最简单的回归分析方法之一,它反映了因变量与一个或者多个自变量之间存在的线性关系,其核心思想是通过最小化预测值与真实观测值之间的残差平方和,找到一条直线(在二维情况下是一条直线方程,三维及以上是超平面),使得这条直线尽可能地贴近所有数据点。在线性回归方程中,影响因变量强度与方向最大的是自变量的系数。预测的时候会需要大量的数据以及样本等,从而来预测结果。
线性回归可以分为简单线性回归(只有一个自变量)和多元线性回归(有多个自变量)。线性回归模型易于理解和操作,并且许多其他复杂的回归模型都基于线性回归的基础上构建。如果数据与线性存在较大差异,结果往往会与预测的出现较大偏差。
3.线性回归的基本元素
1.线性模型
线性模型是一种基本的统计学和机器学习模型,它假设因变量(目标变量)与自变量(预测变量)之间存在线性关系。这种模型的核心思想是通过一组权重系数将输入特征相加,再加上一个偏置项,来预测数值型的输出结果。常见的例子有简单线性回归(单变量预测),多元线性回归(多个自变量预测一个值),以及逻辑回归(用于分类问题,常转化为Sigmoid函数下的线性预测)。线性模型通常容易理解和解释,计算效率高,并且很多高级算法如梯度下降法可以用于求解最佳参数。
2.损失函数
损失函数,也称为代价函数或误差函数,是机器学习和优化理论中一个关键的概念。它是模型预测结果与实际标签之间的差距的量化指标。训练一个模型的目标就是最小化这个函数,让模型尽可能准确地预测。例如,在监督学习中,我们可能会用均方误差(MSE)来衡量连续型输出的预测偏差,而在二元分类任务中,常用的可能是交叉熵损失。每次更新模型参数时,我们都会根据当前预测的损失来调整参数,直到找到全局最优解。
3.解析解
线性回归的解可以用一个公式简单地表达出来,这类解叫作解析解(analyticalsolution)。
解析解可以进行很好的数学分析,但解析解对问题的很严格,导致它无法广泛应用在深度学习里。
4.随机梯度下降
没办法用解析解法的时候,就可以用梯度下降的办法。
随机梯度下降(SGD)是一种简单但非常有效的方法,多用用于支持向量机、逻辑回归(LR)等凸损失函数下的线性分类器的学习。并且SGD已成功应用于文本分类和自然语言处理中经常遇到的大规模和稀疏机器学习问题。SGD既可以用于分类计算,也可以用于回归计算。
SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。(重点:每次迭代使用一组样本。)
为什么叫随机梯度下降算法呢?这里的随机是指每次迭代过程中,样本都要被随机打乱,这个也很容易理解,打乱是有效减小样本之间造成的参数更新抵消问题。
5.模型预测
通过上面的方法,我们可以来预测模型,关于预测模型也有多种方法,包括有:线性回归模型,逻辑回归模型,决策树和随机森林,支持向量机以及神经网络。
我们通过数据集中的训练数据可以来预测模型,以此来得到预测结果。
4.线性回归的应用场景
商业预测:在商业环境中,线性回归被广泛用于预测销售量、市场需求、利润等变量。通过收集历史数据,并使用线性回归模型进行训练,企业可以预测未来的趋势,从而做出更好的商业决策。
医疗领域:线性回归在医疗领域也有很多应用,例如预测疾病的发生、评估病人的健康状况、预测药物的反应等。
物流和供应链管理:线性回归可以帮助物流和供应链管理公司预测产品的需求和运输成本,从而优化物流计划,降低成本。
社交媒体分析:在线性回归模型中加入对社交媒体数据的分析,可以更全面地了解用户的行为和喜好,从而优化广告投放和产品推广。
能源消耗预测:对于电力公司或空调系统等需要预测能源消耗的机构,线性回归可以用来预测未来的能源消耗量,从而制定更有效的能源管理策略。
股票市场分析:线性回归可以用于分析股票价格数据,以预测股票价格的变动。
5.矢量化加速
用一个简单明了的加速器来更好地解释矢量化加速:
首先,使用python的知识,引入下列的包:
import math
import time
import numpy as np
import torch
from d2l import torch as d2l
接下来,运行以下代码:
class Timer:
# 记录多次运行时间
def __init__(self):
self.times=[]
self.start()
def start(self):
# 启动计时器
self.tik=time.time()
def stop(self):
# 停止计时器并记录时间到列表中
self.times.append(time.time()-self.tik)
return self.times[-1]
def avg(self):
# 返回平均时间
return sum(self.times)/len(self.times)
def sum(self):
# 返回时间总和
return sum(self.times)
def cumsum(self):
# 返回累计时间
return np.array(self.times).cumsum().tolist()
举个例子:
n=10000
a=torch.ones(n)
b=torch.ones(n)
c=torch.zeros(n)
timer=Timer()
for i in range(n):
c[i]=a[i]+b[i]
seconds=f'{timer.stop():.5f} seconds'
print(seconds)
结果就是:
0.10235 seconds
6.正态分布(高斯分布)与平方损失
正态分布(Normal Distribution),又名高斯分布(Gaussian Distribution)。若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
通过定义函数来解释正态分布:
例如:
小明每天上学的通勤时间是一个随机变量X,这个变量服从正态分布。统计他过去20天的通勤时间(单位:分钟):26、33、65、28、34、55、25、44、50、36、26、37、43、62、35、38、45、32、28、34。现在我们想知道他上学花30~45分钟的概率。
如下:
import numpy as np
datas = np.array([26, 33, 65, 28, 34, 55, 25, 44, 50, 36, 26, 37, 43, 62, 35, 38, 45, 32, 28, 34])
print(datas.mean(), datas.std())
结果就是:
38.8 11.399999999999999
标准差:
若随机变量 X 服从一个位置参数为 μ、尺度参数为 σ 的概率分布,且其概率密度函数为
标准正态分布:
7.从线性回归到深度网络
1.神经网络
下面是一个神经网络图:
图中的x1,x2......xd等都是输入的数据,d表示 输入数(特征维度),而箭头所指就是网络的输出(此图只有一个输出)。这个图的层数是1,我们可以将线性回归模型视为仅由单个人工神经元组成的神经网络,或者称为单层神经网络。
每个输入与输出之间都有联系,输出层(o1)称为全连接层或者稠密层。
2.生物学
这是从生物学的角度解释线性模型。简单一点来说就是,将接收到的信息都汇聚在一个地方然后进行统一处理,以加权和的形式统一。之后信息会到达目的地或者另一个神经元中。