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. 流程
- 数据集的准备
- 模型
- 训练
- 推断
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