目录
一、问题假设
1.1 题目
考虑如下回归问题:
给定回归方程:
现有成对的“输入-输出”数据集{(x1, y1), ...... , (xn, yn)},输入x与输出y之间满足:
方程中, ε表示噪声,服从均值为0和标准差为0.5的正态分布。
请设计一个估计器f,使得估计器的输入x和输出的y_hat=f(x)尽可能地契合回归方程表示的等式关系。
1.2 基础代码
utils.py:
attentionPooling.py:
导入依赖包:
import torch
from torch import nn
from matplotlib import pyplot as plt
from utils import plot, show
定义回归方程:
def f(x):
return 2 * torch.sin(x) + x**0.8
生成训练集,对应于问题描述的“输入-输出”数据集{(x1, y1), ...... , (xn, yn)}:
if __name__=='__main__':
# 训练样本的大小
n_train = 50
# torch.rand(n_train)表示生成一个形状为(n_train,)的张量,其中包含了从0到1之间均匀分布的随机数
# 乘5操作使得张量中随机生成的每个元素都乘5
# torch.sort表示由小到大排序
x_train, _ = torch.sort(torch.rand(n_train) * 5)
# 训练样本的输出,前一项表示回归方程输出,后一项表示均值为0、方差为0.5的噪声
y_train = f(x_train) + torch.normal(0.0, 0.5, (n_train,))
生成测试集:
# main:
# 测试样本,在[0, 6)之间生成等差数列,公差为0.1
x_test = torch.arange(0, 6, 0.1)
# 测试样本的真实输出
y_truth = f(x_test)
# 测试样本的大小
n_test = len(x_test)
另外再定义一个用于绘制样本输出结果的函数:
def plot_kernel_reg(y_hat, x_test, y_truth, x_train, y_train):
# 绘制测试样本的真实输出、输入估计器f后的输出
plot(x_test, [y_truth, y_hat], 'x', 'y', legend=['Truth'