第二十五周学习周报:文献阅读+机器学习

目录

Abstract

文献阅读:基于颗粒神经网络的时间序列预测

研究背景

研究目的

提出的时间序列预测框架

研究思路

研究贡献

机器学习——线性回归

单变量线性回归

多变量线性回归

线性回归梯度下降

标准化和归一化

批处理和学习率

特征和多项式回归

特征选取

多项式回归

正规方程

正规方程与梯度下降法的比较

梯度下降实现

总结


摘要

这周阅读一篇关于基于粒度的时间序列预测的文献,该文献提供一种可解释的时间序列预测模型,以抵抗时间序列数据内部的干扰。从研究背景、研究目的、以及研究思路等方面对这篇文献进行分析,了解文献中提出的模型方法。在机器学习方面,这周学习了线性回归中的多线性回归模型,着重于学习了求解最优参数的两种方法,分别为梯度下降和正规方程,以及批次量和学习率这两个影响优化过程的参数。

Abstract

This week, I read a literature on granularity based time series prediction, which provides an interpretable time series prediction model to resist internal interference in time series data. I analyze this literature from the perspectives of research background, research objectives, and research ideas to understand the model methods proposed in the literature. In terms of machine learning, this week I learn about multiple linear regression models in linear regression, focusing on two methods for solving optimal parameters, namely gradient descent and normal equations, as well as batch size and learning rate, which affect the optimization process.

文献阅读:基于颗粒神经网络的时间序列预测

题目:Time Series Prediction with Granular Neural Networks

作者:Mingli Song , Yan Li , Witold Pedrycz 

年份:2023

D O I10.1016/j.neucom.2023.126328

研究背景

时间序列数据在许多领域都得到了广泛应用,但在开发过程中,有一个不可忽视的问题,即时间序列数据的不确定性,不确定性包括收集原始数据和不可控因素引起变化时的噪声数据。传统的人工神经网络固有地配备有难以量化和解释的模糊(不确定)结构。因此,由于时间序列数据总是非线性和不确定性的(由于某些干扰),使用神经网络的时间序列预测也成为一项极具挑战性的任务。在这种情况下,要求预测模型需要有一些抗干扰机制, 这意味着对模型的鲁棒性水平有一定要求。

粒度计算(Granular Computing)现被用作一个设计框架,赋予传统数值神经网络一个更抽象的结构,该结构是可调整的且鲁棒的。 抽象结构通过在每个连接,即每个权重(和偏差)上分配信息粒度来实现。我们将这种神经网络称为颗粒神经网络(GNN)。此外,粒度的总体级别可以由用户设置和调整,用户可以根据他们的偏好或经验来递送非常不同的粒度级别。这赋予了粒度网络一定的灵活性。鉴于此,本文将模型与数据的不确定性与信息粒度的概念结合起来,提出了一种基于粒度神经网络的时间序列预测模型。

研究目的

在传统神经网络的基础上,考虑原始数据的不确定性因素,构造一个稳健的时间序列预测模型。提供一种可解释的时间序列预测模型,以抵抗时间序列数据内部的干扰,减少模型的模糊性。颗粒神经网络模型的功能有三 个方面:(1)它通过粒度、覆盖度和特异性等层次揭示了时间序列数据集的不确定性,具有较高的预测精度;(2) 它提供了具有足够特异性和足够覆盖性的优化区间输出,并且该区间比单个值更稳健;(3)它具有可解释和灵活的结构,反映了初始数值神经网络的不确定性,以及面对干扰时连接的泛化和鲁棒性。

提出的时间序列预测框架

1)时间序列数据是从动态系统随时间顺序收集的一系列观察值,用滑动窗口法对时间序列进行重组。回归问题与时间序列预测问题之间的主要区别在于回归数据集可以直接用于训练模型,而时间序列数据必须在使用前进行预处理。预处理策略的性能在一定程度上会影响预测的准确性。采用经典的滑动窗口方法对时间序列进行重组,并考察了不同窗口大小对时 间序列的影响,通过观察几个备选函数的性能,可以确定改进的目标函数。

2)将重组后的时间序列数据送入数值神经网络进行训练,得到性能可接受的数值神经网络。训练过程包括:数据转换、区间运算、综合目标函数

3)给训练好的数值神经网络分配一个粒度级别,并评估该网络的性能。连接的粒度级揭示了抽象性(通用性和特异性)的级别,这有助于理解网络的学习过程,为颗粒神经网络提供了一定的可解释性。

4)利用CS算法优化信息粒度级别,最后返回最优的颗粒神经网络模型。整个算法的关键部分是确定最佳参数集,即信息粒度的级别,由于粒度数目大,且有严格的等式约束条件,并且粒度之间的关系尚不清楚,因此启发式方法是很好的选择,而在多种启发式优化方法中CS算法具有更高的成功率。

方法优点

可解释的颗粒神经网络模型同时预测时间序列数据和表示不确定性。定义了两个设计目标,并使用启发式搜索算法来帮助优化信息粒度级别,覆盖尽可能多的数据并优化覆盖范围,同时使预测间隔尽可能具体。该方法的三个优点是:

  1. 在大多数数据集上,我们可以得到更高的PICP值和更小的MPIW值,这意味着在处理不确定性时具有更好的鲁棒预测能力;
  2. 颗粒模型具有可解释的结构,在面对距离时反映了每个连接的泛化和鲁棒性;
  3. 所提出的模型具有灵活性,可以根据不同的要求和情况进行调整,通过同时观测覆盖率和平均宽度的值来确定表现最好的模型。

研究思路

  1. 由于粒度的总体级别可以由用户设置和调整,可以根据数据递送非常不同的粒度级别,很好的解决时序序列数据的不确定性问题,因此提出研究的目的:在传统神经网络的基础上,考虑原始数据的不确定性因素,基于粒度构造一个稳健的时间序列预测模型。
  2. 介绍了一些已有的经典时间序列预测模型,讨论两种主要技术:时间序列预测建模和启发式优化方法。得出结论,即经典大多数深度神经网络都存在一个关键问题,即难以量化和解释的模糊(不确定)结构。
  3. 从模型结构、模型训练方面阐述了文献所提出的方法:基于颗粒神经网络的时间序列预测。对合成数据集和公共数据集进行了实验研究,通过实验研究详细阐述了模型的每个功能,并且表明当对多个时间序列数据集进行实验时,所开发的方法比文献中提出的现有方法表现得更好。

研究贡献

  1. 提出了一种基于GNN的时间序列预测模型,以抵抗时间序列数据的扰动和权重(偏倚)的不确定性。该模型具有灵活、可调的结构, 体现了用户的喜好。
  2. 信息粒度与覆盖和特异性概念一起用于测量预测模型和输入时间序列数据的不确定性水平。此外,所构造的颗粒神经网络是一种可解释结构。
  3. 首次采用布谷鸟搜索(CS)算法求解了严格等式约束下的多粒度优化问题。对CS算法和其它启发式优化算法进行了一些比较研究。

机器学习——线性回归

回归任务都是寻找特征x与目标y之间的关系,我们认为每一个特征或多或少,或积极或消极地对目标产生着影响,我们期望寻找数学表达式来表达出这种影响。根据特征数量可以将线性回归分为单变量线性回归和多变量线性回归。

单变量线性回归

我们将要用来描述这个回归问题的标记如下:

eq?m 代表训练集中实例的数量

eq?x代表特征/输入变量

eq?y 代表目标变量/输出变量

eq?%28x%2Cy%29代表训练集中的实例

eq?%28x%28i%29%2Cy%28i%29%29代表第eq?i 个观察实例

eq?h代表学习算法的解决方案或函数也称为假设(hypothesis)

单变量线性回归一种可能的表达方式为:eq?f_%7Bw%2Cb%7D%20%28x%29%20%3D%20wx+b,因为只含有一个特征/输入变量x,因此这样 的问题叫作单变量线性回归问题。

要为我们的模型选择合适的参数eq?weq?b,我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值eq?f_%7Bw%2Cb%7D%20%28x%29与训练集中实际值eq?y之间的差距(下图中蓝线所指)就是建模误差(modeling error)。

407fa9f92d9a4353afef1ba7266b56b0.png

单变量线性回归代价函数公式如下:

48cf3e1f4bd847cdaabc337c093774b7.png

eq?b%3D0的的特殊情况为例,假设eq?w是一个固定的值,那么eq?f_%7Bw%2Cb%7D%20%28x%29是一个只关于eq?x的函数,而eq?J%28w%2Cb%29是一个关于eq?w的函数。

①当eq?w%3D1时,eq?f_%7Bw%7D%28x%29%3Dyeq?J%281%29%3D0

3ea9a0363ac94f4e85481af845ec34af.png

②当eq?w%3D0.5

961a85df9aa54db0a0dbedf17a5a3966.png

③当eq?w%3D0

de582e96b3564ef4802f7a23aef37c69.png

我们绘制一个等高线图,三个坐标分别为eq?weq?beq?J%28w%2Cb%29,从图中可以看得出来 在等高线图中,我们可以找到一个点,在这个点上eq?J%28w%2Cb%29的值达到最小。线性回归的目的就是找到参数eq?w或者eq?%28w%2Cb%29,使得成本函数eq?J%28w%29或者eq?J%28w%2Cb%29可以取得最小值。

060d5065dd7049449ccd9dbff7302291.png

eq?J%28w%2Cb%29的最小值,需要通过梯度下降法,找到使得eq?J%28w%2Cb%29达到最小值的eq?weq?b

多变量线性回归

支持多变量的假设 ℎ 表示为:h_{\theta }(x) = \theta ^{T}X=\theta _{0} +\theta _{1}x_{1} +\theta _{2}x_{2}+. . . +\theta _{n}x_{n}, 这个公式中有个eq?n+1参数和eq?n个变量,为了使得公式能够简化一些,引入eq?x_%7B0%7D%3D1,则公式转化为:h_{\theta }(x)=\theta _{0}x_{0} +\theta _{1}x_{1} +\theta _{2}x_{2}+. . . +\theta _{n}x_{n}

与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:

8a016f1ced3a4e92acce529ed5a3bf8f.png

我们的目标和单变量线性回归问题中一样,是要通过梯度下降找出使得代价函数最小的一系列参数eq?%28%5Ctheta%20_%7B0%7D%2C%5Ctheta%20_%7B1%7D%2C...%2C%5Ctheta%20_%7Bn%7D%29

线性回归梯度下降

标准化和归一化

标准化(Standardization):标准化是一种常用的特征缩放方法,它将特征值按照均值为0、标准差为1的正态分布进行缩放。标准化可以通过以下公式计算:x_scaled = (x - mean) / std。

其中x 是原始特征值,mean 是特征的均值,std 是特征的标准差。标准化后的特征会保留原始特征的分布形态,但将其范围缩放到相似的尺度。

归一化(Normalization):归一化是将特征值缩放到 [0, 1] 或 [-1, 1] 范围内的方法。常用的归一化方法是最大最小值缩放,可以通过以下公式计算:x_scaled = (x - min) / (max - min)

其中x 是原始特征值,min 是特征的最小值,max 是特征的最大值。归一化后的特征值范围被映射到指定的范围内,使得所有特征值都在相似的尺度上。

例子说明:

标准化(Standardization):我们可以对房屋面积和建造年份进行标准化处理。假设我们计算得到房屋面积的平均值为 1500 平方英尺,标准差为 500 平方英尺,建造年份的平均值为 2000 年,标准差为 10 年。那么,对于某个房屋面积为 1800 平方英尺,建造年份为 2010 年的样本,标准化后的特征值计算如下:

房屋面积标准化值 = (1800 - 1500) / 500 = 0.6

建造年份标准化值 = (2010 - 2000) / 10 = 1.0
这样房屋面积和建造年份都被缩放到具有相似尺度的范围内。

归一化(Normalization):我们可以对房屋面积和建造年份进行归一化处理。假设我们计算得到房屋面积的最小值为 800 平方英尺,最大值为 2500 平方英尺,建造年份的最小值为 1980 年,最大值为 2020 年。那么,对于某个房屋面积为 1800 平方英尺,建造年份为 2010 年的样本,归一化后的特征值计算如下:

房屋面积归一化值 = (1800 - 800) / (2500 - 800)= 0.4

建造年份归一化值 = (2010 - 1980) / (2020 - 1980) = 0.5
这样房屋面积和建造年份都被映射到 [0,1] 的范围内

批处理和学习率

目前深度歇息模型多采用批量随机梯度下降算法进行优化, 随机梯度下降算法的原理如下

eq?%5Ctheta%20_%7Bi+1%7D%3D%5Ctheta%20_%7Bi%7D-%5Ceta%20%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bx%5Cin%20%5Cbeta%20%7D%5E%7B%7D%5CDelta%20l%28x%2C%5Ctheta%20_%7Bi%7D%29

eq?n是批处理(batchsize),eq?%5Ceta是学习率。 上式可知,这两个参数直接决定模型的权重更新,从优化本身来看,他们是影响模型性能收敛最重要的参数。学习率直接影响模型的收敛状态,,批处理则影响模型的泛化性能.

批处理对模型性能的影响

在实际训练的时候,不是将整个data集进行训练,而是采用btach的方法,将data集分成若干份batch进行训练,挨个进行梯度下降优化参数,每一次计算梯度都是在上一个batch进行梯度下降的基础上进行的。

将所有的batch都用过一遍就叫做 1 epoch。在进行training的时候会有多次epoch,在每次epoch之前会重新再分一次batch,并且每一个epoch分的batch都不一样,这件事情就叫做改组(Shuffle)。

dad2dd2a15c645baa34b2356d10369af.png

 假设有20个examples,有最极端的两种情况:
一、Batch size = N(Large Batch),即20个examples作为一个batch。Large Batch冷却时间比较长,需要将所有的资料都看过一边之后再update,走得很稳。
二、Batch size = 1(Small Batch),即每一个example作为一个batch。Small Batch的冷却时间很短,每次都是看一个参数,每看过一个资料就会更新一次,如果有20个参数,那么一个epoch就要更新20次。更新的方向就是曲曲折折的,走的不稳。

41ca2f83da884e30970da8d682545516.png

之所以看起来左边冷却时间长右边冷却时间长,是因为没有考虑平行运算,Large Batch冷却时间并不一定会很长。

3977883da7f0453a9283a04d35b2a3e1.png

从折线图可以看出,batch size为10和100所用的时间是一样的,假设有1000笔资料,因为平行运算的原因,这1000笔资料是平行处理的,并不是一笔资料时间的1000倍,但是平行运算的数量是有上限的,当batch size非常巨大的时候,GPU在跑完一个batch计算出gradient花费的时候会随着size的增加而增加。

76ad6531d23a4b0f953f238e80961e47.png

左边是拿一个batch出来,算一次gradient更新一次参数的时间随着batch size的变化,右边是跑完一个完整的epoch需要的花的时间随着batch size的变化。明显两边的趋势是完全相反的,因此可以发现在不考虑平行运算的时候,会觉得large batch是需要更长时间的,但是考虑平行运算的话,large batch需要的时间反而更短。这是因为由于batch size 较小时,虽然更新一次的时间较短,但是更新的次数很多,所以训练一次epoch的时间会很长。当单次训练的数据量达到GPU能够进行平行运算的最大极限值时,一次epoch的时间就达到最小值。

神奇的是反而Small Batch 产生的noisy的gradient可以帮助training,拿不同的batch来训练同一个模型,会得到如下的结果。

f2d013f1e3804d7fb98e6e24bd36f8ed.png

大的batchsize可以减少训练时间,提高稳定性。因为同样的epoch数目, 大的batchsize需要的batch数目减少了, 所以可以减少训练时间。除此之外,大的batchsize梯度的计算更加稳定,因为模型训练曲线会更加平滑,在微调时,大的batchsize可能会取得更好的结果。

但batchsize的大是有范围的,并不是越大越好。在一定范围内,增加batchsize有助于收敛的稳定性,但是随着batchsize的增加到一定数值, 模型的性能就会下降。这个是overfitting的问题吗?不是,因为train上的结果也是越差的,这两个用的是同一个model,可以表示的function是一样的,因此不是model bias的问题,是optimization的问题。


为什么Small batch的测试结果会表现得更好呢?

e8a13b6b4eeb440e8aff39154ffe29ad.png

对于full batch来说,在做gradient descend 的时候,进行update是沿着一个loss function,在update的时候走到梯度为零的地方就会停下来了。而对于small batch,每次是挑一个batch出来,因此每次update的loss function是不一样的,比如第一次是L1,第二次L2,如果L1卡住了,L2不一定会卡住,因此一个loss卡住了,可以换另一个loss继续走。

这是为什么呢?用一个例子解释如下:

a4619004dcf94771bf867a69ccbf31a7.png

实际训练的时候,train和test的结果是不会一致的,现在假设Testing Loss的图像就如同是training loss进行右移得到的,使用small batch的话minima一般落在“平原”地区,可以发现train与test的误差比较小,而使用large batch的地方,minima一般落在“峡谷”处,这时图像稍微偏差一些,造成的误差就会非常大,因此testing data的结果就会很差。
 

学习率对模型性能的影响

学习率一般指在计算损失函数Loss时,控制函数自变量的变化大小(通常自变量为训练周期epoch),以使得因变量(损失值)渐趋最小或局部最小。在深度学习中,我们希望每次训练的损失值越小越好,学习率正是用来降低损失值的一个影响自变量的常量,也就是说学习率决定了参数更新的步长。

一、学习率太小,会导致梯度下降缓慢,也就是参数更新的步长很小,每次都只能走一小步。到达最小点可能需要走很多步,即参数更新多次,这样的训练时间就非常长。

05ebb0efa17540bcab80176635766685.png

二、学习率太大,会导致振荡,无法收敛。例如在最小值左边的点上,如果学习率设置很大,这时更新的步伐就会很长,可能直接到了右边的点上,这是eq?J%28w%29的值反而更大,就会一直更新,但永远在越来越大。

8804f8bb01214a6f976408f5f690c3a1.png

学习率通常设置为一个比较小的正数,例如0.01,0.001,选择哪个值的最根本的依据是:

  1. 在网络很复杂的情况下,学习率不能过低,否则传到后面的时候就会出现梯度消失的情况。
  2. 三五层的网络学习率基本要小于1*e^(-5),不然会出现下降过快从而导致震荡的情况。
  3. 初始的学习率可以随意选择来试探,如果发现loss损失值下降得过快,则需要降低学习率。如果发现loss损失值降低不下去,就应适当增加学习率。

特征和多项式回归

特征选取

以房价问题为例,假设数据集中有两个特征,分别是房子的宽度和长度,我们就可以建立一个线性回归模型eq?h_%7B%5Ctheta%20%7D%28x%29%20%3D%5Ctheta%20_%7B0%7D%20+%5Ctheta%20_%7B1%7Dwidth%20+%5Ctheta%20_%7B2%7Dlength,其中eq?width 代表宽带,eq?length代表长度,但我们不一定非要使用这两个特征来进行预测,我们可以自己创造新的特征。比如,我们觉得真正影响房价的是房子的大小,所以我们可以定义一个新特征eq?siza%3Dwidth%5Ctimes%20length ,我们得到的假设函数就会是eq?h_%7B%5Ctheta%20%7D%28x%29%20%3D%5Ctheta%20_%7B0%7D%20+%5Ctheta%20_%7B1%7Dsize

所以,这实际上取决于我们从什么样的角度去看待问题,有时相比于使用原特征,从另一种角度出发定义一个新特征,可能会让我们得到更好的模型。也就是我们说的“一千个特征,一千种模型”,这里指的对于不同的特征,我们往往会得到不同的模型,所以说,有时对特征进行合适的选择,也能够帮助我们得到更好的模型。
 

多项式回归

线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型:

269b4e245ba34a14b3f0b6974e245108.png

 或者三次方模型:

4c29143d4dcc451484dd3a1c6a6ed4f0.png

二次函数和三次函数拟合方式都可以称为多项式回归。对于多项式的回归我们可以将其转化为线性回归的方式进行拟合,若我们另eq?x_%7B1%7D%3Dx%2Cx_%7B2%7D%3Dx%5E%7B2%7D%2Cx_%7B3%7D%3Dx%5E%7B3%7D,则eq?h_%7B%5Ctheta%20%7D%28x%29%20%3D%5Ctheta%20_%7B0%7D%20+%5Ctheta%20_%7B1%7Dx+%5Ctheta%20_%7B2%7Dx%5E%7B2%7D+%5Ctheta%20_%7B3%7Dx%5E%7B3%7D%3D%5Ctheta%20_%7B0%7D%20+%5Ctheta%20_%7B1%7Dx_%7B1%7D+%5Ctheta%20_%7B2%7Dx_%7B2%7D+%5Ctheta%20_%7B3%7Dx_%7B3%7D,通过上述方式,我们将多项式回归问题转化为线性问题来求解。

正规方程

通过线性代数的知识,还有一 种计算代价函数eq?J最小值的数值解法,不需要梯度下降这种迭代算法,这种方法称为正规方程(normal equations)的方法。实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。

什么是正规方程?

梯度下降法计算参数最优解,过程是对代价函数的每个参数求偏导,通过迭代算法一步步更新,直到收敛到全局最小值,从而得到最优参数。而正规方程是一次性求得最优解,对于一个简单函数,对参数求导,将其值置为0,就得到参数的值,例如:eq?%5Cfrac%7B%5Cpartial%20J%28%5Ctheta%20_%7Bj%7D%29%7D%7B%5Cpartial%20%5Ctheta%20_%7Bj%7D%7D%3D0

a78e7862461c4c2487793d6331461994.jpg

正规方程与梯度下降法的比较

梯度下降正规方程
需要选择学习率不需要
需要多次迭代不需要
需要考虑特征缩放不需要
当特征数量 n 大时也能较好适用

需要计算(XTX)-1
如果特征

x_train = np.array([1.0, 2.0])   #features
y_train = np.array([300.0, 500.0])   #target value

数量 n 较大则运算代价大

通常来说当 n 小于 10000 时还是可以接受的

适用于各种类型的模型只适用于线性模型,不适合逻辑回归模型等其他模型

总结:实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。取决于特征向量的个数,数量小于10000时,选择正规方程;大于10000,考虑梯度下降或其他算法。梯度下降法适用于所有类型的模型,而正规方程的方法一般只适用于线性模型,不适合逻辑回归等其他模型。

梯度下降实现

导入训练数据集

x_train = np.array([1.0, 2.0])   #features
y_train = np.array([300.0, 500.0])   #target value

计算损失函数

48cf3e1f4bd847cdaabc337c093774b7.png

def compute_cost(x, y, w, b):
   
    m = x.shape[0] 
    cost = 0
    
    for i in range(m):
        f_wb = w * x[i] + b
        cost = cost + (f_wb - y[i])**2
    total_cost = 1 / (2 * m) * cost

    return total_cost

计算梯度

def compute_gradient(x, y, w, b): 
    
    # m为训练样例数量
    m = x.shape[0]    
    dj_dw = 0
    dj_db = 0
    
    for i in range(m):  
        f_wb = w * x[i] + b 
        dj_dw_i = (f_wb - y[i]) * x[i] 
        dj_db_i = f_wb - y[i] 
        dj_db += dj_db_i
        dj_dw += dj_dw_i 
    dj_dw = dj_dw / m 
    dj_db = dj_db / m 
        
    return dj_dw, dj_db
plt_gradients(x_train,y_train, compute_cost, compute_gradient)
plt.show()

上图显示的是∂𝐽(𝑤,𝑏)/∂𝑤,或者说成本曲线相对于𝑤的斜率,在图的右边,导数是正的,而在左边,导数是负的。由于“碗形”,导数将始终导致梯度下降到梯度为零的底部。

左图固定𝑏=100,梯度下降将同时利用∂𝐽(𝑤,𝑏)∂𝑤和∂𝐽(𝑤𝑏)∂𝑏更新参数。右侧的“颤抖图”提供了一种查看两个参数梯度的方法。箭头大小反映了该点的梯度大小。箭头的方向和斜率反映了∂𝐽(𝑤,𝑏)∂𝑤的比值和∂𝐽(𝑤𝑏)∂𝑏。

梯度下降

在上面可以计算梯度的基础上,运用公式梯度下降可以在下面的gradient_descent中实现。利用这个函数在训练数据上找到𝑤的最优值和𝑏。

def gradient_descent(x, y, w_in, b_in, alpha, num_iters, cost_function, gradient_function): 
    
    w = copy.deepcopy(w_in)
    # 一个数组,用来存储每次迭代的代价J和w,主要是为了以后绘图
    J_history = []
    p_history = []
    b = b_in
    w = w_in
    
    for i in range(num_iters):
        # 计算梯度并使用gradient_function更新参数
        dj_dw, dj_db = gradient_function(x, y, w , b)     

        # 使用参数更新方程更新参数
        b = b - alpha * dj_db                            
        w = w - alpha * dj_dw                            

        #在每次迭代后保存J的值
        if i<100000:    
            J_history.append( cost_function(x, y, w , b))
            p_history.append([w,b])
        # Print cost every at intervals 10 times or as many iterations if < 10
        if i% math.ceil(num_iters/10) == 0:
            print(f"Iteration {i:4}: Cost {J_history[-1]:0.2e} ",
                  f"dj_dw: {dj_dw: 0.3e}, dj_db: {dj_db: 0.3e}  ",
                  f"w: {w: 0.3e}, b:{b: 0.5e}")
 
    return w, b, J_history, p_history #return w and J,w history for graphing

初始化参数

w_init = 0
b_init = 0
# 梯度下降设置
iterations = 10000
tmp_alpha = 1.0e-2
#进行梯度下降
w_final, b_final, J_hist, p_hist = gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha, 
                                                    iterations, compute_cost, compute_gradient)
print(f"(w,b) found by gradient descent: ({w_final:8.4f},{b_final:8.4f})")

梯度下降的迭代

cost与迭代的关系图是衡量梯度下降过程的有用方法。cost应该总是降低的,最初cost的变化是很快的,用不同的尺度来绘制最初的坡度和最终的下降是很有用的。

fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True, figsize=(12,4))
ax1.plot(J_hist[:100])
ax2.plot(1000 + np.arange(len(J_hist[1000:])), J_hist[1000:])
ax1.set_title("Cost vs. iteration(start)");  ax2.set_title("Cost vs. iteration (end)")
ax1.set_ylabel('Cost')            ;  ax2.set_ylabel('Cost') 
ax1.set_xlabel('iteration step')  ;  ax2.set_xlabel('iteration step') 
plt.show()

总结

问题描述表达式描述表达式
单变量线性回归只含有一个特征/输入变量一元一次表达式h_{\theta }(x)=\theta _{0}+\theta _{1}x_{1}
多变量线性回归含有多个特征/输入变量多元一次函数h_{\theta }(x)=\theta _{0}x_{0} +\theta _{1}x_{1} +\theta _{2}x_{2}+. . . +\theta _{n}x_{n}
多项式回归含有多个特征/输入变量多元多次函数h_{\theta }(x)=\theta _{0}x_{0} +\theta _{1}x_{1} +\theta _{2}x_{2}^{2}+. . . +\theta _{n}x_{n}^{n}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值