• 深度学习基础与线性回归实例


    1、机器学习基础-线性回归

    dffdb631fed54cf193a854e3e6607292.png

    介绍:这是一个教育对收入影响的数据,从图像的走势来看,它是具有一个线性关系,即受教育年限越长收入越高,这样我们可以通直线来抽象出它们的关系。

    接下来,我们将会介绍一些方法,分别是单变量线性回归算法、成本函数与损失函数、梯度下降算法。

    首先要提到的是单变量线性回归算法,我们有这样一个函数f(x)=w*x+b;即x代表,f(x)代表收入我们使用f(x)这个函数来映射输入特征值和输出值。这个时候问题就转化为了,这条直线需要画在什么地方才合适,或者我们说w和b该取什么样的值呢?

    然后是,成本函数与损失函数,使用均方差作为成本函数,也就是预测值和真实值之间的平方取均值,我们的优化目标(y代表实际的收入)是找到合适的w和b,使得(f(x)-y)**2越小越好,这样我们获得的直线会更好些。

    最后是使用梯度下降算法,转而求解参数w,b,后面我会再着重讲解这里,大家只要明白这里会用到这个方法即可。

    2、收入数据集读取与观察

    现在,我们可以读取文件,使用matplotlib函数来绘制散点图。

    下面是代码,我这里是用的是pandas,当然,如果你自己有能力也可以手写一个。

    1. import torch
    2. import pandas as pd
    3. import numpy
    4. import matplotlib.pyplot as plt
    5. data=pd.read_csv("./dataset/Income1.csv")
    6. data.info() #返回这个文件的一些信息
    7. print(data)
    8. plt.scatter(data.Education,data.Income)
    9. plt.xlabel("Education"),plt.ylabel("Income")
    10. plt.show()


    RangeIndex: 30 entries, 0 to 29
    Data columns (total 3 columns):
     #   Column      Non-Null Count  Dtype  
    ---  ------      --------------  -----  
     0   Unnamed: 0  30 non-null     int64  
     1   Education   30 non-null     float64
     2   Income      30 non-null     float64
    dtypes: float64(2), int64(1)
    memory usage: 848.0 bytes

     此为info方法获得的信息,下面是用matplotlib所画的散点图。

    dffdb631fed54cf193a854e3e6607292.png

    3、初始化模型、损失函数和优化方法

    1. from torch import nn
    2. import torch
    3. import pandas as pd
    4. import numpy
    5. import matplotlib.pyplot as plt
    6. import numpy as np
    7. data=pd.read_csv("./dataset/Income1.csv")
    8. # x=data.Education
    9. # print(x) #返回的是原来的列
    10. # x=data.Education.values
    11. # print(x)
    12. # x=data.Education.values.reshape(-1,1).shape
    13. # print(x) #(30,1)指,30个数据
    14. #
    15. # x=data.Education.values.reshape(-1,1).astype(np.float64)
    16. # print(x)
    17. X=torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float64))
    18. print(X)
    19. Y=torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float64))
    20. print(Y)
    21. model=nn.Linear(1,1) #out=w@input+b Linear表示随机生成一个权重(有w,b)
    22. #这时就是指input和out都是1 ,w@input+b等价于 model(input)
    23. #计算均方误差
    24. loss_fn=nn.MSELoss() #损失函数
    25. #优化算法
    26. opt=torch.optim.SGD(model.parameters(),lr=0.0001)

    关于预处理部分,我简单说说,调用data.Education返回的是一个原来csv文件的那一列数据,这并不是我们想要的,所以在这里,我先将其转化为了numpy的数据类型ndarrary数组类型,用的是(data.Education.values)方式,我希望我的数据能够一个输入一个输出,所以又添加了reshape方法,将其shape变为(30,1),而torch.from_numpy显而易见是将numpy的ndarrary类型转化为pytorch所用的tensor类型。

    这里对于X,Y处理过后,采用nn.Linear()方式随机生成一个权重,一输入一输出。对于损失函数我们可以用nn,MSELoss(),那么建立模型还有一步是进行优化,pytorch当然也提供了,只不过它是在torch当中,torch.optim.SGD(model.parameters(),lr=0.0001),model.parameters()返回需要优化参数,lr为学习速率,具体是什么,我会在后面讲到,这里只需要知道要用就对了。

    4、模型训练与结果可视化

    1. import pandas as pd
    2. import numpy
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. from torch import nn
    6. import torch
    7. data=pd.read_csv("./dataset/Income1.csv")
    8. X = torch.from_numpy(data.Education.values.reshape(-1, 1)).type(torch.FloatTensor)
    9. # print(X)
    10. Y = torch.from_numpy(data.Income.values.reshape(-1, 1)).type(torch.FloatTensor)
    11. # print(Y)
    12. model=nn.Linear(1,1)
    13. #计算均方误差
    14. loss_fn=nn.MSELoss() #损失函数
    15. #优化算法
    16. opt = torch.optim.SGD(model.parameters(), lr=0.0001)
    17. for epoch in range(5000):
    18. for x,y in zip(X,Y):
    19. y_pred = model(x) #使用模型预测
    20. loss=loss_fn(y,y_pred) #根据预测结果计算损失
    21. opt.zero_grad() #把变量的梯度清零
    22. loss.backward() #反向传播算法,求解梯度
    23. opt.step() #优化模型参数
    24. print(model.weight,model.bias)
    25. plt.scatter(data.Education,data.Income)
    26. plt.xlabel("Education"),plt.ylabel("Income")
    27. plt.plot(X.numpy(),model(X).data.numpy(),c='r')
    28. plt.show()

    打印weight,bias值 

    tensor([[4.9757]], requires_grad=True) 
    tensor([-28.3907], requires_grad=True)

    较好的拟合了本次数据,那么这就是创建模型,训练模型和使用模型的过程。

    5、资源分享

    博客的相关代码与csv文件已上传至

    GitHub:pytorch-Learning-and-Practice/Reference code/Deep Learning and Linear Regression at main · Auorui/pytorch-Learning-and-Practice (github.com)

    如果大家觉得有用,在GitHub里面点击收藏即可。

  • 相关阅读:
    字节三面:能说一说MySQL缓存池吗?
    双向控制舵机(树莓派版)
    上门预约服务类的App功能详解
    PostgreSQL常用的领域和用例
    【题解】42. 接雨水(动态规划 预处理)
    Flink相关
    文件数据交换格式说明
    Python 编程秘籍:掌握这些,你还会担心写不出高效代码吗?
    通过案例来剖析JQuery与原生JS
    c语言练习44:深入理解strstr
  • 原文地址:https://blog.csdn.net/m0_62919535/article/details/127956633