【良心讲解】刘二大人第二讲课后习题

本文通过刘二大人线性模型课程的作业解析,探讨了线性模型y=2x,并使用numpy和matplotlib进行3D图绘制,展示损失函数随权重变化的情况。代码中利用穷举法计算不同权重下的损失,并通过meshgrid创建权重和偏置的网格,以3D图形式直观呈现最小二乘法的优化过程。
摘要由CSDN通过智能技术生成

刘二大人(B站)第二章作业解析

本文针对刘二大人线性模型视频课后习题进行讲解


关于刘二大人得课上内容可登录下方网址查看:
刘二大人网课

课上代码

import numpy as np
import matplotlib.pyplot as plt
 
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

def forward(x):
    return x*w

def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y)*(y_pred-y)
 
 
# 穷举法
w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 0.1):
    print("w=", w)
    l_sum = 0
    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 += loss_val
        print('\t', x_val, y_val, y_pred_val, loss_val)
    print('MSE=', l_sum/3)
    w_list.append(w)
    mse_list.append(l_sum/3)
    
plt.plot(w_list,mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()    

上述代码为课堂讲解代码,在此不做过多赘述,如有疑问可以私信作者或观看刘二大人网课视频。


一、线性模型

本文所写模型为:y=2x。
使用y=wx+b对模型进行分析绘图。

二、代码

1.引入库

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

2.定义变量

代码如下:

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
W = np.arange(0.0,4.1,0.1)
B = np.arange(-2.0,2.1,0.1)
[w,b] = np.meshgrid(W,B)#建立网格化联系
l_sum = 0

下方为相关函数讲解:
numpy.meshgrid()函数讲解

3.定义函数

代码如下:

#验证函数
def forward(x):
    return x * w + b

#损失函数
def loss(x,y):
    y_pred = forward(x)
    return (y_pred-y)**2

4.主函数

代码如下:

#主要计算过程
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 += loss_val
print(l_sum.shape)

#绘图
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w, b, l_sum/3,cmap='rainbow')
plt.show()

3D图绘制讲解博客:
python绘制3D图方法

5.总代码

为便于大家理解[w,b]如何同l_sum建立联系,对定义变量得位置进行调整。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#这里设函数为y=2x
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
l_sum = 0
#W=np.arange(0.0,4.1,0.1)
#B=np.arange(-2.0,2.1,0.1)
#[w,b]=np.meshgrid(W,B)
#将该组数据引入forward函数中定义,便于理解。

def forward(x):#注意数和向量可以相乘,结果为向量
    W=np.arange(0.0,4.1,0.1)
    B=np.arange(-2.0,2.1,0.1)
    [w,b]=np.meshgrid(W,B)
    #变量[w,b]再后续计算中仍可使用,非形参
    return x * w + b
    #此时返回向量为40个点所对应得预测值向量,其中有40个元素

def loss(x,y):
    y_pred = forward(x)
    return (y_pred-y)**2

for x_val, y_val in zip(x_data, y_data):
    y_pred_val = forward(x_val)#调用函数生成w,b并返还预测值向量
    loss_val = loss(x_val, y_val)#返回损失值向量
    l_sum += loss_val#损失值求和时,自动扩充为numpy向量
print(l_sum.shape)#观察向量形状

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w, b, l_sum/3,cmap='rainbow')
#运行前已使用过forward函数,已对[w,b]进行定义,所以无需对w和b再定义
plt.show()


运行结果

其中(41,41)为l_sum的形状,表示该元组为41行41列。
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值