【Deep Learning- Linear Regression-course 02】

Deep Learning- Linear Regression-course 02



基本概念

0. 基本知识

线性回归问题中:
1.训练集(Training set):如下给定的 x y 是我们的训练集,但是通常而言,我们会留一部分出来作为 测试集(Test set )来判断我回归的效果。
2.其中,通过x 可以预先知道训练集 的 y 我们称作 监督学习(Supervised Learning)

提示:这里可以添加本文要记录的大概内容:
在这里插入图片描述

1. 流程

  1. 数据集的准备
  2. 模型
  3. 训练
  4. 推断
    在这里插入图片描述

2. 数据集

本节课程数据集很简单,就已知的数列
在这里插入图片描述

3. 模型

在这里插入图片描述

给定带未知参数的模型,通过训练集训练,对当前的已知数据进行回归。
如上图所示,待定参数为 w 为我们的权重

4. 定义Loss 判断训练结果

1.通过给定的 x 带入我们的模型,获取 待评估的y
在这里插入图片描述
2.定义 训练集和 待评估y的差值为损失
在这里插入图片描述

3.我们更关注 在 特定的权重w 下 训练集平均的损失
在这里插入图片描述
在这里插入图片描述
最终获取损失最小的权重,得到我们的曲线

单参数下的代码

1.基本步骤以及相关函数以及绘图代码

1.定义好 估计y的函数 以及 损失函数
2. 权重 进行循环取值,得到不同的损失Loss
3. zip函数的使用
4. 已知两个数列,绘制图形的代码

import numpy as np
import matplotlib.pyplot as plt
plt.plot(w_list,mse_list)
# label是坐标轴
plt.ylabel('Loss')
plt.xlabel('Weight')
plt.show()

可以生成小数的生成器

np.arange(0.0,4.1,0.1): # numpy的arrange 可以取小数,但是普通的循环不可以取小数

2.实例代码

正式代码为:

# 绘图包
import numpy as np
import matplotlib.pyplot as plt

# Training set
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

# 定义 y 估计值函数
def forward(x):
    return x*w
# 定义损失函数 Loss
def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)**2
# 数据随机取权重,从而找到最优权重
w_list=[]
# 取不同权重时的损失值
mse_list=[]

# 根据不同权重算不同损失,从而绘图
for w in np.arange(0.0,4.1,0.1): # numpy的arrange 可以取小数,但是普通的循环不可以取小数
    print('w=',w)
    # 当前权重的损失之和 定义为lsum,从而求平均损失
    l_sum=0
    # 两个数列打包取值 用zip函数
    for x_val,y_val in zip(x_data,y_data):
        y_pred_val=forward(x_val)
        loss_val=loss(x_val,y_val)
        l_sum=l_sum+loss_val
        print('\t',x_val,y_val,y_pred_val,loss_val)
    # 某个权重下的平均损失定义为 MSE
    print('MSE=',l_sum/3)
    w_list.append(w)
    mse_list.append(l_sum/3)

# 绘制x为权重  y为损失
plt.plot(w_list,mse_list)
plt.ylabel('Loss')
plt.xlabel('Weight')
plt.show()

在这里插入图片描述

双参数下的代码

1.基本步骤以及相关函数以及绘图代码

1.二维数组流程:

  • 布置边上的种子
# 二维 首先根据边布置种子
w_cor=np.arange(0.0,4.0,0.1)
b_cor=np.arange(-2.0,2.1,0.1)
  • meshgrid 生成矩阵
# 矩阵计算
w,b=np.meshgrid(w_cor,b_cor)
# mse为损失矩阵
mse=np.zeros(w.shape)
  • 会自动运行矩阵的每一个值,进行计算

2.绘制三维图形:

  • 定义图像
  • 设置图像坐标轴为三维
  • ax.plot_surface() 函数绘制面图形

3.如何找到矩阵中最大最小值以及对应位置

1.最大最小值:
b=a.max()
b1=a.min()
2.最大最小的位置:
在这里插入图片描述

2.示例代码

# 绘图包
import numpy as np

np.set_printoptions(threshold=np.inf)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Training set
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

# 定义 y 估计值函数
def forward(x,w,b):
    return x*w+b
# 定义损失函数 Loss
def loss(x,y,w,b):
    y_pred=forward(x,w,b)
    return (y_pred-y)**2

# 二维 首先根据边布置种子
w_cor=np.arange(0.0,4.0,0.1)
b_cor=np.arange(-2.0,2.1,0.1)

# 矩阵计算
w,b=np.meshgrid(w_cor,b_cor)
# mse为损失矩阵
mse=np.zeros(w.shape)

# 定义好矩阵后,会自动把矩阵的每个值进行计算
for x,y in zip(x_data,y_data):
    y_pred_val = forward(x,w,b)
    loss_val = loss(x,y,w,b)
    mse=mse+loss_val
mse=mse/len(x_data)
h=plt.contourf(w,b,mse)

# 绘制三维图框
# 定义图像
fig=plt.figure()
# 把图像变为3d 绘制外框图
ax = Axes3D(fig,auto_add_to_figure=False)
fig.add_axes(ax)
# 设置标签 label的方法
ax.set_xlabel(r'Weight',fontsize=20,color='cyan')
ax.set_ylabel(r'bweight',fontsize=20,color='cyan')
ax.set_zlabel(r'Loss',fontsize=20,color='cyan')

# 绘制三维图形
# rstride:行之间的跨度  cstride:列之间的跨度
# rcount:设置间隔个数,默认50个,
# ccount:列的间隔个数  不能与上面两个参数同时出现
ax.plot_surface(w,b,mse,rstride=3,cstride=3,cmap=plt.get_cmap('rainbow'))
plt.show()

# 输出文本
# print(w)
print(b)
# print(mse)
# 找到损失最小,并且返回,找到此时的w和b

hang,lie=mse.shape
positionmse=np.argmin(mse)

row=int(positionmse // lie)
col=int(positionmse % lie)

x_kk=[i for i in np.arange(0.0,10.0,0.1)]
y_kk=[]
for j in x_kk:
    y=w[row,col]*j+b[row,col]
    y_kk.append(y)
plt.plot(x_kk,y_kk,label='Fitting data')
plt.plot(x_data,y_data,label="Original data")
plt.legend()
plt.show()

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

参考文献

1.pytorch线性回归河工大老师:
link
2.查找最大最小值博客
https://www.bilibili.com/video/BV1Y7411d7Ys?p=3&spm_id_from=pageDriver
3.画点线图的博客
https://blog.csdn.net/AXIMI/article/details/99308004
4.当绘图出现警告的博客
https://blog.csdn.net/technologist_41/article/details/119882544

ax = Axes3D(fig,auto_add_to_figure=False)
fig.add_axes(ax)

在这里插入图片描述
5. matplotlib 一些针对于本文的解释,以及如何绘制三维在某个平面的投影
https://blog.csdn.net/ygdxt/article/details/86618606

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值