Pytorch 实现简单线性回归
问题描述:
  使用 pytorch 实现一个简单的线性回归。
      

            受教育年薪与收入数据集
单变量线性回归
  单变量线性回归算法(比如,$x$ 代表学历,$f(x)$ 代表收入): 
    $f(x) = w*x + b $

  我们使用 $f(x)$ 这个函数来映射输入特征和输出值。
目标:
  预测函数 $f(x)$ 与真实值之间的整体误差最小
损失函数: 
  使用均方差作为作为成本函数。
  也就是预测值和真实值之间差的平方取均值。
成本函数与损失函数: 
  优化的目标( $y$ 代表实际的收入):
  找到合适的 $w$ 和 $b$ ,使得 $(f(x) - y)^{2}$越小越好
  注意:现在求解的是参数 $w$ 和 $b$。

过程
1 导入实验所需要的包
import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from torch import nn
#解决内核挂掉
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

2 读取数据

data = pd.read_csv('dataset/Income1.csv')
print(type(data))
<class 'pandas.core.frame.DataFrame'>
3 查看数据信息
data.info()
<class 'pandas.core.frame.DataFrame'>
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
  查看数据
data

      

   查看数据类型

type(data.Education)
pandas.core.series.Series

4 图表显示数据

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 雅黑字体
plt.scatter(data.Education,data.Income)
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()

      

5 转换数据为 Tensor 类型

查看特征数据

data.Education
0     10.000000
1 10.401338
2 10.842809
3 11.244147
4 11.645485
5 12.086957
6 12.488294
7 12.889632
查看特征数据 index
data.Education.index
RangeIndex(start=0, stop=30, step=1)
查看特征数据 value
data.Education.values
array([10.        , 10.40133779, 10.84280936, 11.24414716, 11.64548495,
12.08695652, 12.48829431, 12.88963211, 13.2909699 , 13.73244147,
14.13377926, 14.53511706, 14.97658863, 15.37792642, 15.77926421,
16.22073579, 16.62207358, 17.02341137, 17.46488294, 17.86622074,
18.26755853, 18.7090301 , 19.11036789, 19.51170569, 19.91304348,
20.35451505, 20.75585284, 21.15719064, 21.59866221, 22. ])
特征数据变换形状
data.Education.values.reshape(-1,1)
array([[10.        ],
[10.40133779],
[10.84280936],
[11.24414716],
[11.64548495],
[12.08695652],
[12.48829431],
[12.88963211],
[13.2909699 ],
[13.73244147],
[14.13377926],
[14.53511706],
[14.97658863],
[15.37792642],
[15.77926421],
[16.22073579],
[16.62207358],
[17.02341137],
[17.46488294],
[17.86622074],
[18.26755853],
[18.7090301 ],
[19.11036789],
[19.51170569],
[19.91304348],
[20.35451505],
[20.75585284],
[21.15719064],
[21.59866221],
[22. ]])
查看特征数据变换后的形状
data.Education.values.reshape(-1,1).shape

查看特征数据变换后的数据类型

type(data.Education.values.reshape(-1,1))
numpy.ndarray
修改特征数据变换后的数据类型
X = data.Education.values.reshape(-1,1).astype(np.float32)
print(type(X))
X.shape
<class 'numpy.ndarray'>
(30, 1)
特征数据和标签转换为Tensor
X = torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32) ) #转换数据类型

6 定义模型

定义线性回归模型:
model = nn.Linear(1,1)    #w@input+b   等价于model(input)

定义均方损失函数

loss_fn = nn.MSELoss()    #定义均方损失函数

定义优化器

opt = torch.optim.SGD(model.parameters(),lr=0.00001)  

7 模型训练

for epoch in range(200):
for x, y in zip(X,Y):
y_pred = model(x) #使用模型预测
loss = loss_fn(y,y_pred) #根据预测计算损失
opt.zero_grad() #进行梯度清零
loss.backward() #求解梯度
opt.step() #优化模型参数

8 输出权重和偏置

model.weight
model.bias

  Tensor 类型数据带梯度转换为numpy需要先去梯度

type(model.weight.detach().numpy())
numpy.ndarray
9 获取预测值 y_pred
model(X).data.numpy()

预测值类型

type(model(X).data.numpy())
numpy.ndarray
预测值size
model(X).data.numpy().shape
(30, 1)
10 绘制回归曲线
plt.scatter(data.Education,data.Income)
plt.plot(X.numpy(),model(X).data.numpy())
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()
 完整代码:

import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from torch import nn
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" data = pd.read_csv('dataset/Income1.csv')
print(type(data)) data.info() data from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 雅黑字体
plt.scatter(data.Education,data.Income)
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show() X = torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32) ) #转换数据类型 model = nn.Linear(1,1) #w@input+b 等价于model(input)
loss_fn = nn.MSELoss() #定义均方损失函数
opt = torch.optim.SGD(model.parameters(),lr=0.00001) for epoch in range(200):
for x, y in zip(X,Y):
y_pred = model(x) #使用模型预测
loss = loss_fn(y,y_pred) #根据预测计算损失
opt.zero_grad() #进行梯度清零
loss.backward() #求解梯度
opt.step() #优化模型参数
print(f'epoch {epoch + 1}, loss {loss.sum():f}') model.weight
model.bias type(model.weight.detach().numpy()) plt.scatter(data.Education,data.Income)
plt.plot(X.numpy(),model(X).data.numpy())
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()
看完点个关注呗!!(总结不易)
 

Pytorch 实现简单线性回归的更多相关文章

  1. SPSS数据分析—简单线性回归

    和相关分析一样,回归分析也可以描述两个变量间的关系,但二者也有所区别,相关分析可以通过相关系数大小描述变量间的紧密程度,而回归分析更进一步,不仅可以描述变量间的紧密程度,还可以定量的描述当一个变量变化 ...

  2. sklearn学习笔记之简单线性回归

    简单线性回归 线性回归是数据挖掘中的基础算法之一,从某种意义上来说,在学习函数的时候已经开始接触线性回归了,只不过那时候并没有涉及到误差项.线性回归的思想其实就是解一组方程,得到回归函数,不过在出现误 ...

  3. 机器学习与Tensorflow(1)——机器学习基本概念、tensorflow实现简单线性回归

    一.机器学习基本概念 1.训练集和测试集 训练集(training set/data)/训练样例(training examples): 用来进行训练,也就是产生模型或者算法的数据集 测试集(test ...

  4. day-12 python实现简单线性回归和多元线性回归算法

    1.问题引入  在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.一个带有一个自变 ...

  5. 机器学习(2):简单线性回归 | 一元回归 | 损失计算 | MSE

    前文再续书接上一回,机器学习的主要目的,是根据特征进行预测.预测到的信息,叫标签. 从特征映射出标签的诸多算法中,有一个简单的算法,叫简单线性回归.本文介绍简单线性回归的概念. (1)什么是简单线性回 ...

  6. 机器学习——Day 2 简单线性回归

    写在开头 由于某些原因开始了机器学习,为了更好的理解和深入的思考(记录)所以开始写博客. 学习教程来源于github的Avik-Jain的100-Days-Of-MLCode 英文版:https:// ...

  7. Python回归分析五部曲(一)—简单线性回归

    回归最初是遗传学中的一个名词,是由英国生物学家兼统计学家高尔顿首先提出来的,他在研究人类身高的时候发现:高个子回归人类的平均身高,而矮个子则从另一方向回归人类的平均身高: 回归分析整体逻辑 回归分析( ...

  8. R 语言中的简单线性回归

    ... sessionInfo() # 查询版本及系统和库等信息 getwd() path <- "E:/RSpace/R_in_Action" setwd(path) rm ...

  9. 简单线性回归(梯度下降法) python实现

    grad_desc .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...

随机推荐

  1. idea上传项目到github 2019

    记录一下自己查找的从idea上传项目到github的总结 1.默认本地已经安装好git.exe ,idea也已经和git进行匹配 File-setting-versionControl-git-Tes ...

  2. 虚拟机VMWare开机黑屏 无法进入系统

    参考了: https://blog.csdn.net/x534119219/article/details/79497264 可能方案一: 关闭VMware Workstation加速3D图形设置 可 ...

  3. Mac超好用的软件合集和系统设置

    软件篇 这些软件好像只有动态壁纸是收费的. 推荐的都是特别小巧,更加专注特定功能,没那么多花里胡哨.当然你们有什么更好用的也可以推荐. 简单,好用才是我最喜欢的. Bob Github开源,Bob 是 ...

  4. Redis核心原理与实践--字符串实现原理

    Redis是一个键值对数据库(key-value DB),下面是一个简单的Redis的命令: > SET msg "hello wolrd" 该命令将键"msg&q ...

  5. 第九章 Net 5.0 快速开发框架 YC.Boilerplate --定时服务 Quartz.net

    在线文档:http://doc.yc-l.com/#/README 在线演示地址:http://yc.yc-l.com/#/login 源码github:https://github.com/linb ...

  6. IT人计算机网络浅析

    LAN: 局域网 local Area Network WAN: 广域网 Wide Area Network WAN = LAN +LAN+....+LAN 多个LAN 组成 WAN OSI 七层协议 ...

  7. Stream流方法引用

    一.对象存在,方法也存在,双冒号引用 1.方法引用的概念: 使用实例: 1.1先定义i一个函数式接口: 1.2定义一个入参参数列表有函数式接口的方法: 1.3调用这个入参有函数式接口的方法: lamb ...

  8. Kubernetes-Pod介绍(二)-生命周期

    前言 本篇是Kubernetes第五篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...

  9. Android学习记录(二)——第一次hello world及遇到的gradle安装问题

    开始一个简单的hello world项目,简单了解Android studio的使用方法 第一步,打开Android studio,点击Create New Project 第二步,选择需要的模板 T ...

  10. STM32CbueIDE 体验

    STM32CbueIDE 体验 下载安装 官网下载链接:https://www.st.com/zh/development-tools/stm32cubeide.html. 软件启动时会令设置工作目录 ...