刘二大人第2讲-线性模型-带代码以及作业答案

2. 线性模型

2.1 任务介绍

根据时间,预测得分

2.2 步骤

2.2.1 步骤一:模型

随便给一个线性模型,我们使用简化的线性模型(去掉截距只看一元,简单举例)来举例:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y ^ = w ∗ x \hat{y} = w * x </math>y^=w∗x

2.2.2 步骤二:Loss

目标:找到一个参数w*,使模型的误差最小

在此设定单个样本的Loss函数为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> L o s s = ( y ^ − y ) 2 = ( x ∗ w − y ) 2 Loss = (\hat{y} - y)^2 = (x*w - y)^2 </math>Loss=(y^−y)2=(x∗w−y)2

整体Loss为MSE(平均平方误差)
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> c o s t = 1 N ∗ ∑ i = 1 N ( y ^ i − y i ) 2 cost = \frac{1}{N} * \sum_{i=1}^{N} (\hat{y}i - yi)^2 </math>cost=N1∗i=1∑N(y^i−yi)2

2.2.3 步骤三:优化

穷举算一下MSE,发现w=2时模型最优

2.3 代码

2.3.1 穷举法

首先介绍通过穷举法找最小Loss

我们通过某些猜想,猜到最小Loss应该出现在w落在0-4区间的情况

我们取样用穷举法

代码如下:

ini 复制代码
import matplotlib as plt
​
# 设置后端为TkAgg
plt.use('TkAgg')
​
import numpy as np
from matplotlib import pyplot as plt
​
# 1. 定义训练数据集
x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([2.0, 4.0, 6.0])
​
​
# 2. 定义模型
def forward(x):
    return x * w
​
​
# 3. 定义损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)
​
​
# 4.存储遍历的w以及MSE
w_list = []
mse_list = []
​
# 5. 0-4之间以0.1为间隔采样穷举w训练模型
for w in np.arange(0.0, 4.1, 0.1):
    # 计算损失函数
    l_sum = 0
    for x, y in zip(x_data, y_data):
        l = loss(x, y)
        # 累加损失
        l_sum = l_sum + l
    # 存储w和mse
    w_list.append(w)
    mse_list.append(l_sum / 3)
​
# 6. 画图查看w与Loss函数的关系
# 尺寸设置
plt.figure(figsize=(10, 5))
plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
​
plt.show()
​

注意点:‌zip函数将多个可迭代对象的对应元素组合成元组

2.4 作业

使用有截距的模型来实现以上操作,即猜测的模型为
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y = w ∗ x + b y = w*x + b </math>y=w∗x+b

答案

通过观察,设定w在0到4之间,b在-2到2之间。

代码如下:

ini 复制代码
import matplotlib
​
# 设置后端
matplotlib.use('TkAgg')
​
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm  # 颜色映射模块
​
# 1. 定义训练数据集
x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([2.0, 4.0, 6.0])
​
​
# 2. 定义模型
def forward(x):
    return x * w + b
​
​
# 3. 定义损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)
​
​
# 4. 定义参数
w_list = np.arange(0.0, 4.1, 0.1)
b_list = np.arange(-2.0, 2.1, 0.1)
​
# 创建网格
W, B = np.meshgrid(w_list, b_list)
MSE = np.zeros_like(W)
​
# 5. 训练
for i in range(len(w_list)):
    for j in range(len(b_list)):
        w = w_list[i]
        b = b_list[j]
        l_sum = 0
        for x, y in zip(x_data, y_data):
            l = loss(x, y)
            l_sum = l_sum + l
        MSE[j, i] = l_sum / 3  # 注意这里的索引顺序
​
# 6. 绘制损失函数三维曲面图
# 创建画布和3D坐标轴
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
​
# 绘制曲面图
surf = ax.plot_surface(W, B, MSE, cmap=cm.viridis,  # 使用viridis颜色映射
                       linewidth=0,  # 线条宽度
                       antialiased=True)  # 抗锯齿
​
# 添加颜色条和标签
fig.colorbar(surf, shrink=0.5, aspect=5)  # 添加颜色条
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('MSE')
ax.set_title('Loss Function Surface')
​
plt.show()

三维图像

相关推荐
张较瘦_3 分钟前
[论文阅读] 人工智能 + 软件工程 | 需求获取访谈中LLM生成跟进问题研究:来龙去脉与创新突破
论文阅读·人工智能
一 铭1 小时前
AI领域新趋势:从提示(Prompt)工程到上下文(Context)工程
人工智能·语言模型·大模型·llm·prompt
麻雀无能为力4 小时前
CAU数据挖掘实验 表分析数据插件
人工智能·数据挖掘·中国农业大学
时序之心5 小时前
时空数据挖掘五大革新方向详解篇!
人工智能·数据挖掘·论文·时间序列
.30-06Springfield5 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
说私域6 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的超级文化符号构建路径研究
人工智能·小程序·开源
永洪科技6 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
shangyingying_16 小时前
关于小波降噪、小波增强、小波去雾的原理区分
人工智能·深度学习·计算机视觉
书玮嘎7 小时前
【WIP】【VLA&VLM——InternVL系列】
人工智能·深度学习
猫头虎8 小时前
猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
运维·人工智能·gpt·开源·自动化·文心一言·ai编程