深度学习-线性回归实现-大学生

深度学习-线性回归实现-大学生

一、实验目的

1)掌握深度学习环境的搭建;
2)掌握深度学习模型的开发步骤;
3)掌握深度学习模型的运行和测试方法;
4)掌握模型的训练方法;

二、实验内容

1)安装深度学习环境管理工具;
2)安装Python深度学习开发IDE并与开发环境进行关联;
3)开发线性回归模型;
4)训练模型并记录训练过程;
5)展示最终训练结果;
6)讨论不同超参数(如:学习率和训练次数)对模型性能的影响;
7)讨论样本大小的必要性,如两个样本能否训练该线性回归模型?若能为什么需要大量样本?若不能给出实验结果并解释?

三、实验结果

1、安装深度学习环境管理工具

(1)、创建虚拟环境pytorch,并激活虚拟环境。如下图片展示了conda environments(虚拟环境)。并顺利激活了虚拟环境。

在这里插入图片描述

(2)、CUDA安装

在这里插入图片描述

(2)、验证pytorch安装是否成功

在这里插入图片描述

2、安装Python深度学习开发IDE并与开发环境进行关联

在这里插入图片描述

3、线性回归模型代码分析

#使用这两个库可以方便地进行数值计算和数据可视化,是科学计算和数据分析中常用的工具之一。
import numpy as np
import matplotlib.pyplot as plt

#这句代码设置了随机数种子为1,这样每次运行程序生成的随机数都是一样的,保证了结果的可重复性。
np.random.seed(1)

# 生成样本数据
x = np.arange(-1, 1, step=0.02)
noise = np.random.uniform(low=-0.5, high=0.5, size=100)
y = x * (-3) + 2 + noise  # 初始数据

# 显示待拟合数据
plt.figure('1')
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(x, y)

# 损失函数
def cost(theta, k, x, y):
    return np.mean((theta * x + k - y) ** 2)

lr = 0.001   #学习率设置
epoches = 1500  #训练次数
theta = 0  #初始斜率设置
k = 0
acost = []
#迭代更新参数
for i in range(epoches):
    #最速梯度下降
    # theta_gra = 2 * np.mean((theta * x + k - y) * x)
    # k_gra = 2 * np.mean((theta * x + k - y) * x)

    #随机梯度下降
    # np.random.seed(1)
    # pos = np.random.randint(low=1,high=100,size=1)
    # theta_gra=2*np.mean((theta*x[pos]+k-y[pos])*x[pos]) #theta梯度
    # k_gra=2*np.mean(theta*x[pos]+k-y[pos])#k梯度

    #小批量梯度下降
    np.random.seed(1)
    pos = np.random.randint(low=1, high=100, size=10)
    theta_gra = 2 * np.mean((theta * x[pos] + k - y[pos]) * x[pos])  # theta梯度
    k_gra = 2 * np.mean(theta * x[pos] + k - y[pos])  # k梯度

    #更新梯度
    theta -= theta_gra+lr
    k -= k_gra*lr
    rcost = cost(theta,k,x,y)
    acost.append(rcost)
    if i%10==0:
        print("%d:结果为:theta_gra=%f,k_gra=%f,theta=%f,k=%f,Loss=%f"%(i,theta_gra,k_gra,theta,k,rcost))
        py=theta*x+k
        plt.figure('2')
        plt.cla()
        plt.scatter(x,y)
        plt.plot(x,py,'r-',lw=5)
        plt.pause(0.05)
print('最终的结果为:theta=%f,k=%f'%(theta,k))
plt.figure('3')
plt.plot(acost,'b-',lw=1)
plt.show()

4、训练模型并记录训练过程

(1)、学习率为0.05,迭代次数为2000次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
展示最终训练结果(学习率为0.05,迭代次数为2000次)

(2)、学习率为1,迭代次数为2000次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
展示最终训练结果(学习率为1,迭代次数为2000次)

(3)、学习率为0.001,迭代次数为1500次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
展示最终训练结果(学习率为0.001,迭代次数为1500次)

四、实验总结

这段代码实现了使用小批量梯度下降算法对给定的样本数据进行线性回归,并使用matplotlib库对训练过程和结果进行可视化展示。具体来说,代码首先设置了随机数种子,然后生成了样本数据并可视化展示。之后定义了损失函数,并设定了学习率和迭代次数等一些参数。在循环迭代中,每次更新参数采用的是小批量梯度下降算法。更新一定次数后,输出最终的参数和损失,并将损失函数的变化过程显示出来。

学习率影响:学习率决定了模型在每次迭代时更新的步伐大小,如果学习率设置太小,则更新速度缓慢,需要更多的迭代次数才能找到更好的参数;如果学习率设置太大,则可能导致算法无法收敛,甚至会出现震荡现象。因此,学习率的设置需要根据具体的问题进行调整,如果样本数据比较复杂,可以适当提高学习率以加快收敛速度,同时也需要注意不要设置过大。在这段代码中,学习率设置为0.001,随着迭代进行,更新速度逐渐变慢。可能需要根据具体数据或实验进行调整。

迭代次数影响:迭代次数越多,算法找到的参数精度越高,但同时,算法的执行时间也会变长。通常情况下,我们需要在达到一定精度的情况下尽可能减少迭代次数,以便提高算法的效率。但是,如果迭代次数设置太少,则可能会导致算法未能找到合适的参数,从而影响预测结果的准确性。因此,我们需要根据具体情况和经验来设置迭代次数。在这段代码中,迭代次数设置为1500,可以看出随着迭代次数的增加,损失函数逐渐减小,但有时候迭代次数过多也会出现过拟合的情况。

附录:代码详细总结

1、import numpy as np
2、import matplotlib.pyplot as plt
#1-2使用这两个库可以方便地进行数值计算和数据可视化,是科学计算和数据分析中常用的工具之一。

3、np.random.seed(1)
#3这句代码设置了随机数种子为1,这样每次运行程序生成的随机数都是一样的,保证了结果的可重复性。

生成样本数据

4、x = np.arange(-1, 1, step=0.02)
#4创建一个从-1到1(不包括1)的一维数组,步长为0.02。np.arange()函数是NumPy中的一个数组创建函数,它用于创建等差数列数组。参数step表示每个数之间的间隔,默认值为1。因此,这句代码创建的数组包含了从-1开始,每隔0.02一个单位的数值,直到达到1之前的所有数。

5、noise = np.random.uniform(low=-0.5, high=0.5, size=100)
#5使用NumPy中的random模块生成一个包含100个随机浮点数的一维数组,这些随机浮点数的取值范围在-0.5到0.5之间(即low=-0.5, high=0.5),每个随机浮点数的取值是等概率的

6、y = x * (-3) + 2 + noise # 初始散点(nosic属于噪声)

显示待拟合数据

7、plt.figure(1)
8、plt.xlabel(‘x’)
9、plt.ylabel(‘y’)
10、plt.scatter(x, y)
#7.创建一个名为"1"的新图形窗口。
#8-9.在该图形窗口中创建一个散点图,横坐标为x,纵坐标为y。
#10.在散点图上添加横坐标轴标签为"x",添加纵坐标轴标签为"y"。

损失函数

11、def cost(theta, k, x, y):
12、 return np.mean((theta * x + k - y) ** 2)
#11-12这段代码定义了一个损失函数,用于计算当前theta和k对应的线性回归模型的预测值与实际值之间的平均误差。其中,theta和k是线性回归模型的参数,x和y是原始数据的输入和输出。

13、lr = 0.005 #学习率设置
14、epoches = 2000 #训练次数
15、theta = 0 #初始斜率设置
16、k = 0 #初始偏置设置
17、acost = []
#迭代更新参数
18、for i in range(epoches):
#最速梯度下降
# theta_gra = 2 * np.mean((theta * x + k - y) * x)
# k_gra = 2 * np.mean((theta * x + k - y) * x)

#随机梯度下降
# np.random.seed(1)
# pos = np.random.randint(low=1,high=100,size=1)
# theta_gra=2np.mean((thetax[pos]+k-y[pos])x[pos]) #theta梯度
# k_gra=2
np.mean(theta*x[pos]+k-y[pos])#k梯度

#小批量梯度下降
19、 np.random.seed(1) #
#19这句代码设置了随机数种子为1,这样每次运行程序生成的随机数都是一样的,保证了结果的可重复性。

20、 pos = np.random.randint(low=1, high=100, size=10)
#20使用NumPy中的random模块生成一个包含100个随机整数的一维数组,这些随机整数的取值范围在1到100之间(即low=1, high=100),每个随机整数的取值是等概率的

21、 theta_gra = 2 * np.mean((theta * x[pos] + k - y[pos]) * x[pos]) # theta梯度
22、 k_gra = 2 * np.mean(theta * x[pos] + k - y[pos]) # k梯度

23、 theta -= theta_gra+lr
#表示将当前的theta值减去theta的梯度和学习率的加和,得到新的theta值;
24、 k -= k_gralr
#表示将当前的k值减去k的梯度和学习率的乘积,得到新的k值。
25、 rcost = cost(theta,k,x,y)
#将更新的回归参数theta和k重新代入到损失函数中,实现让损失函数不断减小的目标。
26、 acost.append(rcost)
#将每次迭代的损失函数值添加到数列中。
27、 if i%10==0:
#由于将迭代次数设置为2000次,我们每10次展示线性回归模型的拟合效果。
28、print(“%d:结果为:theta_gra=%f,k_gra=%f,theta=%f,k=%f,Loss=%f”%(i,theta_gra,k_gra,theta,k,rcost))
#输出当前的迭代次数,斜率梯度、偏置梯度、斜率、偏置和损失函数值。
29、 py=theta
x+k
30、 plt.figure(2)
#表示创建一个新的图形窗口,其中数字2表示窗口的编号
31、 plt.cla()
#表示清除当前窗口中的所有图像
32、 plt.scatter(x,y)
#表示画出样本数据的散点图
33、 plt.plot(x,py,‘r-’,lw=5)
#表示画出当前线性回归模型的拟合曲线,其中"x"表示x轴的取值范围,"py"表示根据当前的theta和k计算出的y轴的取值范围,"r-"表示颜色为红色且使用实线来画线,"lw=5"表示线条的宽度为5个像素
34、 plt.pause(0.05)
#表示暂停一段时间,以便能够看到动态的效果
35、print(‘最终的结果为:theta=%f,k=%f’%(theta,k))
#输出了训练过程中得到的最终结果,即线性回归模型中的斜率(theta)和偏置(k)的值
36、plt.figure(3)
#表示创建一个新的图形窗口,其中数字3表示窗口的编号
37、plt.plot(acost,‘b-’,lw=1)
#实现了将训练过程中的损失函数值(acost)绘制成一条曲线,以便于分析模型拟合效果的好坏
38、plt.show()
#将绘制好的曲线展示在屏幕上

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
线性回归算法的发展历程可以追溯到19世纪末。以下是线性回归算法的发展历程: 1. 19世纪末,高尔顿和他的学生K·Pearson观察了1078对夫妇,以每对夫妇的平均身高作为自变量,取他们的一个成年儿子的身高作为因变量。他们发现父母身高和子代身高之间存在近乎一条直线的关系,即回归直线方程为:y^=33.73+0.516x。这是线性回归算法的最早应用之一。 2. 在20世纪初,统计学家卡尔·皮尔逊进一步发展了线性回归算法。他提出了最小二乘法,用于拟合回归直线并估计回归系数。最小二乘法通过最小化残差平方和来确定最佳拟合直线,使得预测值与实际观测值之间的差异最小化。 3. 在20世纪中叶,计算机的发展使得线性回归算法得以广泛应用。计算机的出现使得回归分析的计算更加高效和准确。此时,线性回归算法开始在各个领域得到广泛应用,包括经济学、社会科学、医学等。 4. 随着时间的推移,线性回归算法不断发展和改进。研究人员提出了各种改进的线性回归模型,如多元线性回归、岭回归、lasso回归等。这些改进的模型考虑了更多的因素和变量,提高了模型的预测能力和解释能力。 5. 近年来,随着机器学习和深度学习的兴起,线性回归算法也得到了进一步的发展。线性回归算法被用作其他更复杂模型的基础,如神经网络中的线性层。 总结起来,线性回归算法的发展历程可以追溯到19世纪末,经过了统计学家的研究和改进,以及计算机的发展,逐渐成为一种广泛应用的预测和分析工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满星映九天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值