深度学习简单调参实验一——一元线性回归求近似解

9 篇文章 1 订阅
7 篇文章 0 订阅

深度学习简单调参实验一——一元线性回归求近似解

线性回归是利用数理统计中的回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析,即简单线性回归。

简单线性回归:所谓简单,是指只有一个样本特征,即只有一个自变量;所谓线性,是指方程是线性的;所谓回归,是指用方程来模拟变量之间是如何关联的。也就是说,我们需要一条直线,最大程度的拟合样本特征和样本数据标记之间的关系

项目结构和数据结构:

在这里插入图片描述
在这里插入图片描述

导入相关依赖包

#首先需要在Terminal中的指定conda虚拟环境中使用
# pip install numpy
# pip install matplotlib
import numpy as np
import matplotlib.pyplot as plt
#实验内容一元线性回归求近似解

loss函数

#loss损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。
def compute_error_for_line_given_points(b,w,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError+=((w*x+b)-y)**2
    return totalError/float(len(points))

迭代计算

#通过输入大量的点去迭代
def step_gradient(b_current,w_current,points,learningRate):
    b_gradient=7#此处不一定需要设置为0
    w_gradient=1#此处不一定需要设置为0

    #获取点的数量,你们可以print(len(points))试以下,会发现有100个点
    N=float(len(points))

    #range(0,len(points))start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);stop: 计数到 stop 结束,但不包括 stop。
    #range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
    #list()函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。

    #这是一个循环i的值会从0变化到100-1,也就是len(points)-1
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        b_gradient=b_gradient + 2*(  ((w_current*x)+b_current)   -y)
        w_gradient=w_gradient + 2*x*(  ((w_current*x)+b_current)  -y)
    b_gradient=b_gradient/N
    w_gradient=w_gradient/N
    #下面是w和b的拟合的过程
    new_b=b_current-(learningRate*b_gradient)
    new_w=w_current-(learningRate*w_gradient)
    #返回一个list,相当于一个可以扩充的数组,里面有new_b,new_w这两个数据项
    return [new_b,new_w]

参数初始化

def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):
    b=starting_b
    w=starting_w
    for i in range(num_iterations):
        b,w=step_gradient(b,w,np.array(points),learning_rate)

    # 将b,w存在列表中并返回
    return [b,w]

调参

def run():
    #使用numpy中的函数导入x,y值
    points=np.genfromtxt("data.csv",delimiter=",")
    # 可修改
    #0.0003 负
    learning_rate=0.000003
    # 可修改
    initial_b = 7.99102098,
    # 可修改
    initial_w = 1.32243102
    # 可修改
    num_iterations=100
#下面是打印结果的操作,这是运行前线行函数的w,b,error值
    print("Strating gradient descent at b={0},w={1},error={2}".format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,points)))
    print("Running...")

    [b,w]=gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)

    #面是打印结果的操作,这是运行后线行函数的w,b,error值
    print("After {0} iterations b ={1},w={2},error={3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))

    #绘制图像,不用改
    x = points[:, 0]
    y = w * x + b
    plt.scatter(points[:, 0], points[:, 1], c='none', edgecolors=['y','b','r','g'], s=15, label='orginal')
    plt.plot(x, y, c='blue', label='predict', linestyle=':')
    plt.legend()
    plt.show()

#当线行回归案列.py这个文件被用来做主函数时run()会调用,如果在其他py文件中导入线行回归案例模块时run()函数不会被调用
if __name__ =='__main__':
    run()

在这里插入图片描述
在这里插入图片描述

完整代码

#首先需要在Terminal中的指定conda虚拟环境中使用
# pip install numpy
# pip install matplotlib
import numpy as np
import matplotlib.pyplot as plt
#实验内容一元线性回归求近似解



#loss损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。
def compute_error_for_line_given_points(b,w,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError+=((w*x+b)-y)**2
    return totalError/float(len(points))


#通过输入大量的点去迭代
def step_gradient(b_current,w_current,points,learningRate):
    b_gradient=7#此处不一定需要设置为0
    w_gradient=1#此处不一定需要设置为0

    #获取点的数量,你们可以print(len(points))试以下,会发现有100个点
    N=float(len(points))

    #range(0,len(points))start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);stop: 计数到 stop 结束,但不包括 stop。
    #range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
    #list()函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。

    #这是一个循环i的值会从0变化到100-1,也就是len(points)-1
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        b_gradient=b_gradient + 2*(  ((w_current*x)+b_current)   -y)
        w_gradient=w_gradient + 2*x*(  ((w_current*x)+b_current)  -y)
    b_gradient=b_gradient/N
    w_gradient=w_gradient/N
    #下面是w和b的拟合的过程
    new_b=b_current-(learningRate*b_gradient)
    new_w=w_current-(learningRate*w_gradient)
    #返回一个list,相当于一个可以扩充的数组,里面有new_b,new_w这两个数据项
    return [new_b,new_w]

def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):
    b=starting_b
    w=starting_w
    for i in range(num_iterations):
        b,w=step_gradient(b,w,np.array(points),learning_rate)

    # 将b,w存在列表中并返回
    return [b,w]

def run():
    #使用numpy中的函数导入x,y值
    points=np.genfromtxt("data.csv",delimiter=",")
    # 可修改
    #0.0003 负
    learning_rate=0.000003
    # 可修改
    initial_b = 7.99102098,
    # 可修改
    initial_w = 1.32243102
    # 可修改
    num_iterations=100

# After 5000 iterations b =[1.75641085],w=[1.44497039],error=[111.72486774]
# After 10000 iterations b =[2.42378544],w=[1.43185334],error=[111.42751328]
# After 10000 iterations b =[3.55186295],w=[1.40968132],error=[111.00135457]
# After 10000 iterations b =[4.45136384],w=[1.39200191],error=[110.73040101]
# After 100000 iterations b =[7.62325877],w=[1.32965928],error=[110.26248956]
# After 1000000 iterations b =[7.99102098],w=[1.32243102],error=[110.25738347]



    #下面是打印结果的操作,这是运行前线行函数的w,b,error值
    print("Strating gradient descent at b={0},w={1},error={2}".format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,points)))
    print("Running...")

    [b,w]=gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)

    #面是打印结果的操作,这是运行后线行函数的w,b,error值
    print("After {0} iterations b ={1},w={2},error={3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))

    #绘制图像,不用改
    x = points[:, 0]
    y = w * x + b
    plt.scatter(points[:, 0], points[:, 1], c='none', edgecolors=['y','b','r','g'], s=15, label='orginal')
    plt.plot(x, y, c='blue', label='predict', linestyle=':')
    plt.legend()
    plt.show()

#当线行回归案列.py这个文件被用来做主函数时run()会调用,如果在其他py文件中导入线行回归案例模块时run()函数不会被调用
if __name__ =='__main__':
    run()


##作业优化相关参数使得error值小于给定的error=401.5962767880493值,越小越好
#最终请上传你最小error的截图

我的最佳结果:
在这里插入图片描述

最后祝大家学习愉快,调参涨分啦,一起学习鸭!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

[山青花欲燃]

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

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

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

打赏作者

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

抵扣说明:

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

余额充值